直接上代碼,代碼里邊都有注釋。
自定義ViewPager,自定義主要是為了處理用戶手指按下停止輪播,抬起繼續(xù)輪播事件 。
package com.example.administrator.ximalayademo.view;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
* 自定義ViewPage
*/
public class BannerViewPage extends ViewPager {
private OnBannerViewPageTouchListener mTouchListener;
public BannerViewPage(Context context) {
super(context);
}
public BannerViewPage(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* 判斷觸摸事件
*
* @param ev
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN: //手指按下
setIsTouch(true);
break;
case MotionEvent.ACTION_UP: //手指抬起
setIsTouch(false);
break;
}
return super.onTouchEvent(ev);
}
public void setOnBannerViewPageTouchListener(OnBannerViewPageTouchListener listener) {
mTouchListener = listener;
}
public interface OnBannerViewPageTouchListener {
void onBannerPageTouch(boolean isTouch);
}
private void setIsTouch(boolean isTouch) {
if (mTouchListener != null) {
mTouchListener.onBannerPageTouch(isTouch);
}
}
}
adapter:
package com.example.administrator.ximalayademo.adapter;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import java.util.List;
/**
* Created by Administrator on 2019/4/12.
*/
public class LooperPageAdapter extends PagerAdapter {
private List<Integer> mImage = null;
@Override
public int getCount() {
if (mImage != null) {
return Integer.MAX_VALUE;
}
return 0;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
int rePosition = position % mImage.size();
//創(chuàng)建ImageView并且設(shè)置ImageView的背景圖
ImageView imageView = new ImageView(container.getContext());
imageView.setImageResource(mImage.get(rePosition));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
//將設(shè)置好的ImageView設(shè)置到容器中
container.addView(imageView);
return imageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
/**
* 設(shè)置數(shù)據(jù)
*
* @param image
*/
public void setData(List<Integer> image) {
mImage = image;
}
/**
* 獲取數(shù)據(jù)大小,此方法是用來設(shè)置用戶往左邊滑動時的操作
*
* @return
*/
public int getDataSize() {
if (mImage != null) {
return mImage.size();
}
return 0;
}
}
普通shape 文件(指示點,白色):
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="30px"
android:height="30px" />
<solid android:color="#FFFFFF" />
</shape>
當(dāng)前shape文件(指示點,橙色):
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<size
android:width="30px"
android:height="30px"/>
<solid android:color="#EE3B3B"/>
</shape>
AndroidManifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.ximalayademo">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".LooperPageActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--重寫了onTouchEvent的ViewPage-->
<com.example.administrator.ximalayademo.view.BannerViewPage
android:id="@+id/looper_page"
android:layout_width="match_parent"
android:layout_height="200dp"
android:overScrollMode="never" />
<!--用戶放置指示點的容器-->
<LinearLayout
android:id="@+id/linearLayout_point"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/looper_page"
android:layout_marginTop="-20dp"
android:gravity="center"
android:orientation="horizontal" />
</RelativeLayout>
Activity:
package com.example.administrator.ximalayademo;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.LinearLayout;
import com.example.administrator.ximalayademo.adapter.LooperPageAdapter;
import com.example.administrator.ximalayademo.view.BannerViewPage;
import java.util.ArrayList;
import java.util.List;
/**
* 輪播Activity
*/
public class LooperPageActivity extends Activity {
private BannerViewPage mLooperPage;
private LooperPageAdapter mLooperPageAdapter;
private static final List<Integer> sImage = new ArrayList<>();
private boolean mIsTouch = false;
private LinearLayout linearLayout_point;
//加載圖片資源
static {
sImage.add(R.mipmap.banner1);
sImage.add(R.mipmap.banner2);
sImage.add(R.mipmap.banner3);
}
private Handler mHandler;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_looper_page);
initView();
//創(chuàng)建一個Handler實現(xiàn)自動輪播
mHandler = new Handler();
}
/**
* 當(dāng)界面綁定到窗口
*/
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
mHandler.post(mRunnableTask);
}
/**
* 當(dāng)界面從窗口解綁
*/
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
mHandler.removeCallbacks(mRunnableTask);
}
/**
* 自動輪播線程
* mIsTouch:如果 = false,表示用戶手指沒觸摸按下,則輪播,如果 = true 表示用戶手指觸摸按下,停止輪播
*/
private Runnable mRunnableTask = new Runnable() {
@Override
public void run() {
if (!mIsTouch) {
int currentItem = mLooperPage.getCurrentItem();
mLooperPage.setCurrentItem(++currentItem, true);
}
mHandler.postDelayed(this, 3000);
}
};
/**
* 初始化控件
*/
private void initView() {
mLooperPage = (BannerViewPage) findViewById(R.id.looper_page);
mLooperPageAdapter = new LooperPageAdapter();
mLooperPageAdapter.setData(sImage);
mLooperPage.setAdapter(mLooperPageAdapter);
//設(shè)置初始位置,最好不要是第一個,如果是第一個將不能向前滑動。
mLooperPage.setCurrentItem(mLooperPageAdapter.getDataSize() * 100, false);
//設(shè)置自定義接口
mLooperPage.setOnBannerViewPageTouchListener(OnTouchListener);
mLooperPage.addOnPageChangeListener(OnPageChangeListener);
//獲取頁面的容器控件
linearLayout_point = (LinearLayout) findViewById(R.id.linearLayout_point);
insertPoint();
}
/**
* 根據(jù)圖片的數(shù)量動態(tài)創(chuàng)建View的數(shù)量,然后AddView到頁面的容器控件(linearLayout_point)
*/
private void insertPoint() {
for (int i = 0; i < sImage.size(); i++) {
View point = new View(this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(30, 30);
point.setBackground(getResources().getDrawable(R.drawable.shape_point_normal));
params.leftMargin = 20;
point.setLayoutParams(params);
linearLayout_point.addView(point);
}
}
/**
* 捕獲到當(dāng)前顯示輪播圖位置
*/
private ViewPager.OnPageChangeListener OnPageChangeListener = new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
int rePosition;
if (mLooperPageAdapter.getDataSize() != 0) {
rePosition = position % mLooperPageAdapter.getDataSize();
} else {
rePosition = 0;
}
setPosition(rePosition);
}
@Override
public void onPageScrollStateChanged(int state) {
}
};
private void setPosition(int position) {
for (int i = 0; i < linearLayout_point.getChildCount(); i++) {
View point = linearLayout_point.getChildAt(i);
if (i != position) {
//普通顏色的點
point.setBackground(getResources().getDrawable(R.drawable.shape_point_normal));
} else {
//選中顏色的點
point.setBackground(getResources().getDrawable(R.drawable.shape_point_selected));
}
}
}
/**
* 實現(xiàn)自定義接口
*/
private BannerViewPage.OnBannerViewPageTouchListener OnTouchListener = new BannerViewPage.OnBannerViewPageTouchListener() {
@Override
public void onBannerPageTouch(boolean isTouch) {
mIsTouch = isTouch;
}
};
}

Screenrecorder-2019-04-16-10-18-25-549[1].gif