IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> ViewPager实现一个无限轮播的轮播图,实现自动切换 -> 正文阅读

[移动开发]ViewPager实现一个无限轮播的轮播图,实现自动切换

要想实现页面的自动切换,我们首先新建一个继承ViewPager的类,在这个类里面写逻辑

这里需要用到两个方法,

onAttachedToWindow() view在页面上显示的时候加载
onDetachedFromWindow() view被销毁时加载的方法

然后创建一个runnable,使view被显示运行线程,被销毁时删除线程,防止页面切回后台时还一直切换浪费内存性能

package com.example.viewpager.views;

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.AttributeSet;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewpager.widget.ViewPager;

public class SubVIewPager extends ViewPager {

   

    public SubVIewPager(@NonNull Context context) {
        this(context,null );
    }

    public SubVIewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs); handler = new Handler(Looper.getMainLooper());
    }

    /**
     *当view被显示时加载此方法
     *这里用于页面不被显示时停止view线程的停止
     */
    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        starLooper();
    }

    /**
     * 加载线程
     * postDelayed的作用是延迟多少毫秒后开始运行
     */
    private void starLooper() {
        postDelayed(Task,2000);

    }

    /**postDelayed的作用是延迟多少毫秒后开始运行
     * 创建一个每1.5秒切换一次页面的线程
     * 创建一个为当前页面序号的值,然后每1.5秒+1一次设置为当前页面实现页面的切换
     */
    private Runnable Task =  new Runnable() {
        @Override
        public void run() {
            int currentTtem = getCurrentItem();
            currentTtem++;
            setCurrentItem(currentTtem);
            postDelayed(this,1500);
        }
    };
    /**
     *当view被销毁时加载此方法
     *这里用于页面不被显示时停止view线程的停止
     */
    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        stopLooper();
    }

    /**
     * 删除线程
     *removeCallbacks方法是删除指定的Runnable对象
     */
    private void stopLooper() {
        removeCallbacks(Task);
    }
}

写完之后复制类的地址粘贴到自定义view的xml文件的viewpager地址替换掉

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorAccent"
    android:orientation="vertical">

    <com.example.viewpager.views.SubVIewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

    <TextView
        android:id="@+id/looper_title_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#66ffffff"
        android:paddingLeft="10dp"
        android:paddingTop="2dp"
        android:paddingRight="10dp"
        android:paddingBottom="2dp"
        android:text="我是标题"
        android:textAlignment="center" />

    <LinearLayout
        android:id="@+id/looper_point_container_lv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="5dp"
        android:orientation="horizontal">


    </LinearLayout>


</RelativeLayout>

这样就实现了页面的自动切换,然后我们发现这样虽然可以切换,但是我们按住页面的时候还是会一直切换,但是我们一般会想要让按住页面的时候就不再切换,就是手动操作的时候自动就会停止,不手动操作的时候再自动切换。

我们只需要再构造器内加一个手指点击监听的判定,当手指按下控件时删除线程,手指离开线程时运行线程,就实现了

然后我们为了方便数据在外部的操作性,我们把切换时间换成一个自定义的数字,并提供一个方便外部更改的set方法总体结构就完成了

package com.example.viewpager.views;

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewpager.widget.ViewPager;

public class SubVIewPager extends ViewPager {
    //页面切换的时间
    private long delayTime = 1500;

    /**
     * 修改页面切换时间的方法
     * @param delayTime
     */
    public void setDelayTime(long delayTime){
        this.delayTime = delayTime;
    }

    public SubVIewPager(@NonNull Context context) {
        this(context,null );
    }

    public SubVIewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        setOnTouchListener(new OnTouchListener() {
            //屏幕点击监听
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                int action = motionEvent.getAction();
                switch (action){
                    //手指按下时
                    case MotionEvent.ACTION_DOWN:
                        stopLooper();
                        break;
                    //手指离开时
                    case MotionEvent.ACTION_UP:
                        starLooper();
                        break;

                }

                return false;
            }
        });
    }

    /**
     *当view被显示时加载此方法
     *这里用于页面不被显示时停止view线程的停止
     */
    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        starLooper();
    }

    /**
     * 加载线程
     * postDelayed的作用是延迟多少毫秒后开始运行
     */
    private void starLooper() {
       postDelayed(Task,delayTime);

    }

    /**postDelayed的作用是延迟多少毫秒后开始运行
     * 创建一个每1.5秒切换一次页面的线程
     * 创建一个为当前页面序号的值,然后每1.5秒+1一次设置为当前页面实现页面的切换
     */
    private Runnable Task =  new Runnable() {
        @Override
        public void run() {
            int currentTtem = getCurrentItem();
            currentTtem++;
            setCurrentItem(currentTtem);
            postDelayed(this,delayTime);
        }
    };
    /**
     *当view被销毁时加载此方法
     *这里用于页面不被显示时停止view线程的停止
     */
    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        stopLooper();
    }

    /**
     * 删除线程
     *removeCallbacks方法是删除指定的Runnable对象
     */
    private void stopLooper() {
       removeCallbacks(Task);
    }
}

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-05 21:51:20  更:2022-02-05 21:51:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:30:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码