ViewPager最后一页滑动后跳转到主页面实现方案

思路

主要有是两个监听,
一是addOnPageChangeListener();二是setOnTouchListener();java

addOnPageChangeListener()主要是为了获取position(滑动到了第几页)android

setOnTouchListener()主要是判断在最后一页中是否向左滑动了,而后进入主页。app

主要功能代码

addOnPageChangeListener();

复制代码

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                currentItem = position;//获取位置,即第几页
                Log.i("Guide","监听改变"+position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

复制代码

 

setOnTouchListener();

复制代码

viewPager.setOnTouchListener(new View.OnTouchListener() {
            float startX;
            float startY;//没有用到
            float endX;
            float endY;//没有用到
            @Override
            public boolean 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);
                        int width=size.x;
                        
 //首先要肯定的是,是否到了最后一页,而后判断是否向左滑动,而且滑动距离是否符合,我这里的判断距离是屏幕宽度的4分之一(这里能够适当控制)
if(currentItem==(imageViews.size()-1)&&startX-endX>=(width/4)){
       Log.i(LOG,"进入了触摸");
       goToMainActivity();//进入主页
                            overridePendingTransition(R.anim.slide_in_right,R.anim.slide_in_left);//这部分代码是切换Activity时的动画,看起来就不会很生硬
                        }
                        break;
                }
                return false;
            }
        });

复制代码

 

如下是所有代码

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;

public class GuideActivity extends AppCompatActivity {
    private static final String LOG = "GuideActivity";
    int touchCount;
    int currentItem;
    List<Integer> imageIDList;
    List<ImageView> imageViews;
    ViewPager viewPager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_guide);
        //初始化引导数据
        initGuideData();
        //初始化引导页
        initGuideView();
        //初始化分页控件
        iniView();
    }


    /**
     * 初始化引导页数据
     */
    private void initGuideData() {
        imageIDList = new ArrayList();
        imageIDList.add(R.mipmap.apk_img1);
        imageIDList.add(R.mipmap.apk_img2);
        imageIDList.add(R.mipmap.apk_img3);
    }

    /**
     * 初始化引导页
     */
    private void initGuideView() {
        imageViews = new ArrayList<>();
        for (int i = 0; i < imageIDList.size(); i++) {
            imageViews.add(new ImageView(this));
        }
    }

    /**
     * 初始化分页控件
     */
    private void iniView() {
        viewPager = (ViewPager) findViewById(R.id.guide_pager);
        viewPager.setAdapter(new GuideAdapter());
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                currentItem = position;
                Log.i("Guide","监听改变"+position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        viewPager.setOnTouchListener(new View.OnTouchListener() {
            float startX;
            float startY;
            float endX;
            float endY;
            @Override
            public boolean 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);
                        int width=size.x;
                        //首先要肯定的是,是否到了最后一页,而后判断是否向左滑动,而且滑动距离是否符合,我这里的判断距离是屏幕宽度的4分之一(这里能够适当控制)
                        if(currentItem==(imageViews.size()-1)&&startX-endX>0&&startX-endX>=(width/4)){
                            Log.i(LOG,"进入了触摸");
                            goToMainActivity();
                            overridePendingTransition(R.anim.slide_in_right,R.anim.slide_in_left);
                        }
                        break;
                }
                return false;
            }
        });
    }

    private void goToMainActivity() {
        Intent intent=new Intent(this,MainActivity.class);
        startActivity(intent);
        finish();
    }

    /**
     * Viewpager适配器
     */
    private class GuideAdapter extends PagerAdapter {

        @Override
        public int getCount() {
            return imageViews.size();
        }

        /**
         * 判断当前分页是否是view
         * 因为ViewPager里面的分页能够填入Fragment
         *
         * @param view
         * @param object
         * @return
         */
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        /**
         * 清理内存
         * 从第一页滑动到第二页,此时第一页的内存应该释放
         *
         * @param container
         * @param position
         * @param object
         */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
           container.removeView(imageViews.get(position));//释放滑动事后的前一页
        }

        /**
         * 获得---->暂时是没有用的
         *
         * @param object
         * @return
         */
        @Override
        public int getItemPosition(Object object) {
            return super.getItemPosition(object);
        }

        /**
         * 初始化分页
         *
         * @param container
         * @param position
         * @return
         */
        @Override
        public Object 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);//设置图片的宽高

            return imageView;
        }
    }
}

复制代码

 

如下为动画资源代码

slide_in_left.xml

复制代码

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="1000"
        android:fromXDelta="0%p"
        android:toXDelta="-100%"
        />

</set>

复制代码

 

slide_in_right.xml

复制代码

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="1000"
        android:fromXDelta="100%p"
        android:toXDelta="0"
        />

</set>

复制代码

 

如下是动画效果

这里写图片描述

好文要顶 关注我 收藏该文  ide

灰色飘零
关注 - 45
粉丝 - 224post

+加关注动画

0ui

0this

posted @ 2019-12-26 17:31  灰色飘零  阅读(2)  评论(0)  编辑 收藏spa

相关文章
相关标签/搜索