轉(zhuǎn)自:https://www.cnblogs.com/renhui/articles/12103367.html
一、實(shí)現(xiàn)思路
主要有是兩個(gè)監(jiān)聽,
一是addOnPageChangeListener();二是setOnTouchListener();
addOnPageChangeListener()主要是為了獲取position(滑動(dòng)到了第幾頁)
setOnTouchListener()主要是判斷在最后一頁中是否向左滑動(dòng)了,然后進(jìn)入主頁。
二、主要功能代碼
1. addOnPageChangeListener();
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? publicvoidonPageScrolled(intposition,floatpositionOffset,int positionOffsetPixels) {
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? publicvoidonPageSelected(int position) {
? ? ? ? ? ? ? ? currentItem = position;//獲取位置,即第幾頁Log.i("Guide","監(jiān)聽改變"+position);
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? publicvoidonPageScrollStateChanged(int state) {
? ? ? ? ? ? }
? ? ? ? });
2. setOnTouchListener();
viewPager.setOnTouchListener(new View.OnTouchListener() {
? ? ? ? ? ? float startX;
? ? ? ? ? ? floatstartY;//沒有用到float endX;
? ? ? ? ? ? floatendY;//沒有用到? ? ? ? ? ? @Override
? ? ? ? ? ? publicboolean onTouch(View v, MotionEvent event) {
? ? ? ? ? ? ? ? switch (event.getAction()){
? ? ? ? ? ? ? ? ? ? case MotionEvent.ACTION_DOWN:
? ? ? ? ? ? ? ? ? ? ? ? startX=event.getX();
? ? ? ? ? ? ? ? ? ? ? ? startY=event.getY();
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? case MotionEvent.ACTION_UP:
? ? ? ? ? ? ? ? ? ? ? ? endX=event.getX();
? ? ? ? ? ? ? ? ? ? ? ? endY=event.getY();
? ? ? ? ? ? ? ? ? ? WindowManager windowManager= (WindowManager)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
? ? ? ? ? ? ? ? ? ? ? ? //獲取屏幕的寬度Point size =new Point();
? ? ? ? ? ? ? ? windowManager.getDefaultDisplay().getSize(size);
? ? ? ? ? ? ? ? ? ? ? ? intwidth=size.x;
//首先要確定的是,是否到了最后一頁,然后判斷是否向左滑動(dòng),并且滑動(dòng)距離是否符合,我這里的判斷距離是屏幕寬度的4分之一(這里可以適當(dāng)控制)if(currentItem==(imageViews.size()-1)&&startX-endX>=(width/4)){
? ? ? Log.i(LOG,"進(jìn)入了觸摸");
? ? ? goToMainActivity();//進(jìn)入主頁overridePendingTransition(R.anim.slide_in_right,R.anim.slide_in_left);//這部分代碼是切換Activity時(shí)的動(dòng)畫,看起來就不會(huì)很生硬? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? returnfalse;
? ? ? ? ? ? }
? ? ? ? });
三、完整代碼實(shí)現(xiàn)
GuideActivity:
package com.tc.mobileshop;import android.content.Context;import android.content.Intent;import android.graphics.Point;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.Display;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.ImageView;import com.tc.mobileshop.utils.DisplayUtils;import java.util.ArrayList;import java.util.List;publicclassGuideActivityextends AppCompatActivity {
? ? privatestaticfinalString LOG = "GuideActivity";
? ? int touchCount;
? ? int currentItem;
? ? List imageIDList;
? ? List imageViews;
? ? ViewPager viewPager;
? ? @Override
? ? protectedvoid onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_guide);
? ? ? ? //初始化引導(dǎo)數(shù)據(jù)? ? ? ? initGuideData();
? ? ? ? //初始化引導(dǎo)頁? ? ? ? initGuideView();
? ? ? ? //初始化分頁控件? ? ? ? iniView();
? ? }
? ? /**? ? * 初始化引導(dǎo)頁數(shù)據(jù)
? ? */privatevoid initGuideData() {
? ? ? ? imageIDList =new ArrayList();
? ? ? ? imageIDList.add(R.mipmap.apk_img1);
? ? ? ? imageIDList.add(R.mipmap.apk_img2);
? ? ? ? imageIDList.add(R.mipmap.apk_img3);
? ? }
? ? /**? ? * 初始化引導(dǎo)頁
? ? */privatevoid initGuideView() {
? ? ? ? imageViews =newArrayList<>();
? ? ? ? for(inti = 0; i < imageIDList.size(); i++) {
? ? ? ? ? ? imageViews.add(newImageView(this));
? ? ? ? }
? ? }
? ? /**? ? * 初始化分頁控件
? ? */privatevoid iniView() {
? ? ? ? viewPager = (ViewPager) findViewById(R.id.guide_pager);
? ? ? ? viewPager.setAdapter(new GuideAdapter());
? ? ? ? viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? publicvoidonPageScrolled(intposition,floatpositionOffset,int positionOffsetPixels) {
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? publicvoidonPageSelected(int position) {
? ? ? ? ? ? ? ? currentItem = position;
? ? ? ? ? ? ? ? Log.i("Guide","監(jiān)聽改變"+position);
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? publicvoidonPageScrollStateChanged(int state) {
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? viewPager.setOnTouchListener(new View.OnTouchListener() {
? ? ? ? ? ? float startX;
? ? ? ? ? ? float startY;
? ? ? ? ? ? float endX;
? ? ? ? ? ? float endY;
? ? ? ? ? ? @Override
? ? ? ? ? ? publicboolean onTouch(View v, MotionEvent event) {
? ? ? ? ? ? ? ? switch (event.getAction()){
? ? ? ? ? ? ? ? ? ? case MotionEvent.ACTION_DOWN:
? ? ? ? ? ? ? ? ? ? ? ? startX=event.getX();
? ? ? ? ? ? ? ? ? ? ? ? startY=event.getY();
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? case MotionEvent.ACTION_UP:
? ? ? ? ? ? ? ? ? ? ? ? endX=event.getX();
? ? ? ? ? ? ? ? ? ? ? ? endY=event.getY();
? ? ? ? ? ? ? ? ? ? ? ? WindowManager windowManager= (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
? ? ? ? ? ? ? ? ? ? ? ? //獲取屏幕的寬度Point size =new Point();
? ? ? ? ? ? ? ? ? ? ? ? windowManager.getDefaultDisplay().getSize(size);
? ? ? ? ? ? ? ? ? ? ? ? intwidth=size.x;
? ? ? ? ? ? ? ? ? ? ? ? //首先要確定的是,是否到了最后一頁,然后判斷是否向左滑動(dòng),并且滑動(dòng)距離是否符合,我這里的判斷距離是屏幕寬度的4分之一(這里可以適當(dāng)控制)if(currentItem==(imageViews.size()-1)&&startX-endX>0&&startX-endX>=(width/4)){
? ? ? ? ? ? ? ? ? ? ? ? ? ? Log.i(LOG,"進(jìn)入了觸摸");
? ? ? ? ? ? ? ? ? ? ? ? ? ? goToMainActivity();
? ? ? ? ? ? ? ? ? ? ? ? ? ? overridePendingTransition(R.anim.slide_in_right,R.anim.slide_in_left);
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? returnfalse;
? ? ? ? ? ? }
? ? ? ? });
? ? }
? ? privatevoid goToMainActivity() {
? ? ? ? Intent intent=newIntent(this,MainActivity.class);
? ? ? ? startActivity(intent);
? ? ? ? finish();
? ? }
? ? /**? ? * Viewpager適配器
? ? */privateclassGuideAdapterextends PagerAdapter {
? ? ? ? @Override
? ? ? ? publicint getCount() {
? ? ? ? ? ? return imageViews.size();
? ? ? ? }
? ? ? ? /**? ? ? ? * 判斷當(dāng)前分頁是不是view
? ? ? ? * 由于ViewPager里面的分頁可以填入Fragment
? ? ? ? *
? ? ? ? * @param view
? ? ? ? * @param object
? ? ? ? * @return*/? ? ? ? @Override
? ? ? ? publicboolean isViewFromObject(View view, Object object) {
? ? ? ? ? ? returnview == object;
? ? ? ? }
? ? ? ? /**? ? ? ? * 清理內(nèi)存
? ? ? ? * 從第一頁滑動(dòng)到第二頁,此時(shí)第一頁的內(nèi)存應(yīng)該釋放
? ? ? ? *
? ? ? ? * @param container
? ? ? ? * @param position
? ? ? ? * @param object
? ? ? ? */? ? ? ? @Override
? ? ? ? publicvoiddestroyItem(ViewGroup container,int position, Object object) {
? ? ? ? ? container.removeView(imageViews.get(position));//釋放滑動(dòng)過后的前一頁? ? ? ? }
? ? ? ? /**? ? ? ? * 得到---->暫時(shí)是沒有用的
? ? ? ? *
? ? ? ? * @param object
? ? ? ? * @return*/? ? ? ? @Override
? ? ? ? publicint getItemPosition(Object object) {
? ? ? ? ? ? returnsuper.getItemPosition(object);
? ? ? ? }
? ? ? ? /**? ? ? ? * 初始化分頁
? ? ? ? *
? ? ? ? * @param container
? ? ? ? * @param position
? ? ? ? * @return*/? ? ? ? @Override
? ? ? ? publicObject instantiateItem(ViewGroup container,int position) {
? ? ? ? ? ? ImageView imageView = imageViews.get(position);
? ? ? ? ? ? imageView.setImageResource(imageIDList.get(position));
? ? ? ? ? ? ViewGroup.LayoutParams viewLayoutParams =new ViewGroup.LayoutParams
? ? ? ? ? ? ? ? ? ? (
? ? ? ? ? ? ? ? ? ? ? ? ? ? DisplayUtils.dip2px(GuideActivity.this, 170),
? ? ? ? ? ? ? ? ? ? ? ? ? ? DisplayUtils.dip2px(GuideActivity.this, 200)
? ? ? ? ? ? ? ? ? ? );
? ? ? ? ? ? container.addView(imageView,viewLayoutParams);//設(shè)置圖片的寬高return imageView;
? ? ? ? }
? ? }
}