Android 嵌套ViewPager实现连贯双滑动
来源:互联网 发布:淘宝评价怎么发视频 编辑:程序博客网 时间:2024/06/01 08:44
ViewPager嵌套ViewPager后,滑动事件没法在子ViewPager里面响应。
解决办法是自定义子ViewPager。
通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
getParent().requestDisallowInterceptTouchEvent(true);
同时实现了子ViewPager滑动到最后一个的时候,再滑动时父ViewPager会进行滑动
package com.example.viewpager;import android.content.Context;import android.graphics.PointF;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.view.MotionEvent;public class MyViewPager extends ViewPager{/** 触摸时按下的点 **/ PointF downP = new PointF(); /** 触摸时当前的点 **/ PointF curP = new PointF(); float oldx=0.0f; float first=0.0f; OnSingleTouchListener onSingleTouchListener; public MyViewPager(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public MyViewPager(Context context) { super(context); // TODO Auto-generated constructor stub } @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { // TODO Auto-generated method stub //当拦截触摸事件到达此位置的时候,返回true, //说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent return true; } @Override public boolean onTouchEvent(MotionEvent arg0) { // TODO Auto-generated method stub //每次进行onTouch事件都记录当前的按下的坐标 curP.x = arg0.getX(); curP.y = arg0.getY(); if(arg0.getAction() == MotionEvent.ACTION_DOWN){ //记录按下时候的坐标 //切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变 downP.x = arg0.getX(); downP.y = arg0.getY(); oldx=downP.x; first=0.0f; //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰 getParent().requestDisallowInterceptTouchEvent(true); } if(arg0.getAction() == MotionEvent.ACTION_MOVE){ float newx=arg0.getX(); int curpostion=getCurrentItem(); int count=this.getAdapter().getCount()-1; //预测本次滑动的的方向(first>0 说明本次手势向右滑动) if(first==0.0f){ //第一次进来 if(Math.abs(newx-oldx)>0){ first=newx-oldx; } } //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰 //当子viewpager的position处于0时,检测如果是向右滑动说明要通知父ViewPager滑动; //当子viewpager的position处于size-1时,检测如果是向左滑动说明要通知父ViewPager滑动; //(newx-oldx)实时检测滑动方向 if((curpostion==count && (newx-oldx)<0 && first<0) ||(curpostion==0 && (newx-oldx)>0 &&first>0)){ getParent().requestDisallowInterceptTouchEvent(false); }else{ getParent().requestDisallowInterceptTouchEvent(true); } oldx=newx; } if(arg0.getAction() == MotionEvent.ACTION_UP){ //在up时判断是否按下和松手的坐标为一个点 //如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick if(downP.x==curP.x && downP.y==curP.y){ onSingleTouch(); return true; } } return super.onTouchEvent(arg0); } /** * 单击 */ public void onSingleTouch() { if (onSingleTouchListener!= null) { onSingleTouchListener.onSingleTouch(); } } /** * 创建点击事件接口 * @author wanpg * */ public interface OnSingleTouchListener { public void onSingleTouch(); } public void setOnSingleTouchListener(OnSingleTouchListener onSingleTouchListener) { this.onSingleTouchListener = onSingleTouchListener; } }
还有一种实现方式
import android.content.Context;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.view.MotionEvent;public class ChildViewPager extends ViewPager {public ChildViewPager(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}private float mLastMotionX;private boolean flag = false;public boolean dispatchTouchEvent(MotionEvent ev) {// TODO Auto-generated method stubfinal float x = ev.getX();switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:getParent().requestDisallowInterceptTouchEvent(true);flag = true;mLastMotionX = x;break;case MotionEvent.ACTION_MOVE:if (flag) {if (x - mLastMotionX > 5 && getCurrentItem() == 0) {flag = false;getParent().requestDisallowInterceptTouchEvent(false);}if (x - mLastMotionX < -5&& getCurrentItem() == getAdapter().getCount() - 1) {flag = false;getParent().requestDisallowInterceptTouchEvent(false);}}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:getParent().requestDisallowInterceptTouchEvent(false);break;}return super.dispatchTouchEvent(ev);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {// TODO Auto-generated method stubreturn super.onInterceptTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubreturn super.onTouchEvent(event);}}
1 0
- Android 嵌套ViewPager实现连贯双滑动
- android viewpager嵌套viewpager点击滑动
- Android解决ViewPager嵌套Fragment,Fragment嵌套ViewPager滑动冲突
- Android解决ViewPager嵌套Fragment,Fragment嵌套ViewPager滑动冲突
- Android之viewPager嵌套viewPager无法滑动子viewPager
- ViewPager 嵌套 ListView实现简单动态滑动
- Android listview嵌套viewpager滑动冲突问题
- Android Listview嵌套viewpager 滑动冲突解决
- android scrollview嵌套viewpager滑动冲突
- android SwipeRefreshLayout嵌套ViewPager 滑动冲突问题
- Android ViewPager嵌套ViewPager滑动冲突的解决方法
- Android ViewPager嵌套ViewPager滑动冲突的解决方法
- Android中Viewpager,ScrollView嵌套ViewPager滑动冲突解决
- Android viewpager嵌套viewpager滑动冲突的解决
- viewpager嵌套viewpager滑动处理
- 两个ViewPager嵌套滑动
- Android 垂直滑动ViewPager实现
- Android实现滑动图片(ViewPager)
- 如何让android的service一直在后台运行
- C#多线程
- POJ_P3415 Common Substring(后缀数组+单调栈)
- 原型以及原型链
- Java单例模式深入详解
- Android 嵌套ViewPager实现连贯双滑动
- Android EditView获取和隐藏键盘以及清除文本
- IP地址转换java
- java.lang.IllegalArgumentException: AppIndex: The URI host must match the package name and follow th
- 中文分词学习总结
- POJ-1274-The Perfect Stall【二分图最大匹配】【模板题】
- 初始化与清理(2)
- 循环的数学应用
- 小明的筷子java