android开发之定制ViewPager滑动事件

明天还要加班,苦逼的程序猿,简单说说最近遇到的一个问题吧。

我在viewpager+fragment学习笔记中简单介绍过ViewPager+Fragment的用法,其实并不难,当时实现了一个如下图所示的效果:





然而,在实际开发中这一点技术可能根本不够用,项目中会有各种各样奇葩的需求,我最近就遇到了一个怪异的需求,捣鼓之后还是解决了,今天和大家聊聊。

由于涉及到公司项目,我在这里就使用我自己制作的一个Demo来和大家介绍。

我们要实现的效果如下图:





这里一共有三个Fragment,其中两个通过左右滑动显示,第三个要通过点击右上角的+来显示,在第三个Fragment上我们通过点击Fragment上的一个按钮再回到第一个Fragment上。其实这个要做非常简单,就是重写ViewPager的onTouch事件,在onTouch中判断当前的item,如果是1则取消向左滑动的动作。大致的一个思路就是这样。看代码:

public class MyViewPager extends ViewPager {

    private int startX;
    private float currentX;

    public MyViewPager(Context context) {
        super(context);
    }

    public MyViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            startX = (int) ev.getX();
            Log.i("lenve", "ACTION_DOWN");
            break;
        case MotionEvent.ACTION_MOVE:
            Log.i("lenve", "ACTION_MOVE");
            currentX = ev.getX();
            break;
        case MotionEvent.ACTION_UP:
            Log.i("lenve", "ACTION_UP");
            break;
        }
        if (getCurrentItem() == 1 && currentX < startX) {
            return false;
        } else if (getCurrentItem() == 2) {
            return false;
        } else {
            return super.onTouchEvent(ev);
        }
    }
}

我在项目中是重写了onInterceptTouchEvent方法。但是这里重写onInterceptTouchEvent不管用,还是得重写onTouchEvent事件,个中原因想到周日好好研究研究,明天还要加班,今天就说这么多吧。有问题欢迎讨论。

源码下载

版权声明:本文为博主原创文章,未经博主允许不得转载。若有错误地方,还望批评指正,不胜感激。

时间: 2024-10-18 01:22:09

android开发之定制ViewPager滑动事件的相关文章

SwipeListview拦截ViewPager滑动事件(改进)

前几天解决了SwipeListview拦截ViewPager滑动事件,今天在ViewPager下面增加一些常规布局,发现在新增布局中设置完点击事件后,在这些新增布局范围内,ListView不能上下滑动,查看SwipeListview中onInterceptTouchEvent()方法,发现不能简单将滑动事件分配给子View,应当对移动事件重写,在判定为上下滑动时,将事件拦截在此,最后改进的结果如下: downPosition = pointToPosition((int) x, (int) y)

android ViewPager滑动事件讲解

首先ViewPager在处理滑动事件的时候要用到OnPageChangeListener OnPageChangeListener这个接口需要实现三个方法:(onPageScrollStateChanged,onPageScrolled ,onPageSelected) onPageScrollStateChanged(int arg0)   ,此方法是在状态改变的时候调用,其中arg0这个参数 有三种状态(0,1,2).arg0 ==1的时辰默示正在滑动,arg0==2的时辰默示滑动完毕了,a

android ViewPager滑动事件(OnPageChangeListener)讲解

首先ViewPager在处理滑动事件的时候要用到OnPageChangeListener OnPageChangeListener这个接口需要实现三个方法:(onPageScrollStateChanged,onPageScrolled ,onPageSelected) onPageScrollStateChanged(int arg0)   ,此方法是在状态改变的时候调用,其中arg0这个参数 有三种状态(0,1,2).arg0 ==1的时辰默示正在滑动,arg0==2的时辰默示滑动完毕了,a

Android开发实战之ViewPager的轮播

在安卓开发的许多控件中,如果你没有使用过ViewPager,就不能算是一个安卓开发工程师,在本篇博文中,我会总结ViewPager的使用方法, 以及一些开发中的拓展.希望本篇博文对你的学习和工作有所帮助. **ViewPager的基本使用** ViewPager的使用遵循MVC模式,M(模型),V(视图),C(控制器).模型就是viewpager对象,视图就是xml视图,控制器就是适配器adapter.所以, 要实现一个完整的ViewPager这三个东西一个都不能少. xml: <?xml ve

SwipeRefreshLayout与ViewPager滑动事件冲突解决

问题描述: 开发中发现,SwipeRefreshLayout的下拉刷新,与ViewPager开发的banner的左右滑动事件有一点冲突,导致banner的左右滑动不够顺畅.很容易在banner的左右滑动的过程中,触发SwipeRefreshLayout的下拉刷新,从而导致banner左右滑动的体验很差. 解决方案: 可以在ViewPager的滑动时候设置SwipeRefreshLayout暂时不可用,ViewPager的滑动效果就变得很流畅了. 代码示例: mViewPager.setOnTou

为Android开发人员定制的搜索引擎

我在谷歌上定制了一个专门针对Android开发人员的搜索引擎.载入慢的童鞋考虑FanQiang吧,作为技术人员使用Google才是王道. 在此推荐给大家:Android搜索引擎 搜索内容:Android方面的问答.技术文章.API.开源项目等. 搜索范围:StackOverflow.Github.Google Code.Eoe.开源中国.CSDN.博客园.Android巴士.搜集的各种Android开源小站等. 效果图:

SwipeListview拦截ViewPager滑动事件

最近在做一个项目,用到下拉刷新跟侧滑删除SwipeListView,在SwipeListView中用addHeaderView()方法添加一个ViewPager,发现ViewPager滑动不了,查看源码看到在SwipeListView中滑动事件被拦截了,因此ViewPager得不得滑动事件. 我的解决思路是在SwipeListview中的onInterceptTouchEvent()方法中,判断当前触发滑动事件Item位置,判断当为HeaderView时不拦截,此方法亦可解决问题. downPo

Android开发之使用ViewPager做引导页面

引导页面相信大家都不会陌生,安装了一个新的App后第一次打开,都会有类似下图,相当于说明文档 实现效果 程序目录结构 在主layout里main.xml定义一个帧布局,在viewPager上有多少页就显示多少个点 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

Android开发之使用ViewPager做引导页面(转载)

转载自:deng0zhaotai http://blog.csdn.net/deng0zhaotai/article/details/24744637 MainActivity.java package com.example.viewpagerdemo; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.