要想实现页面的自动切换,我们首先新建一个继承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);
}
}
|