ParallaxHeaderViewPager改进
来源:互联网 发布:网络监测工具 编辑:程序博客网 时间:2024/06/08 12:28
ParallaxHeaderViewPager项目头部控件如果设置了事件,HeaderFameLayout.dispatchTouchEvent方法就会返回true,OuterFameLayout.dispatchTouchEvent方法就不会继续分配事件,导致viewpager接收不到事件,listview就不能滚动。
如果想在设置了点击事件的控件上滑动时,viewpager也能接收事件,需从下面几个点出发:
1、HeaderFameLayout.dispatchTouchEvent返回true时,OuterFameLayout.dispatchTouchEvent方法中手动调用viewpager.dispatchTouchEvent方法。
2、滚动的时候不触发HeaderFameLayout中的click事件,HeaderFameLayout.dispatchTouchEvent中需要判断,如果是滚动就直接返回,并取消之前的down,move事件。
3、HeaderViewPager.dispatchTouchEvent中需要对异常进行捕捉
具体代码:
布局文件
<?xml version="1.0" encoding="utf-8"?><com.astuetz.OuterFameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/outer"android:layout_width="match_parent"android:layout_height="match_parent" ><com.astuetz.HeaderViewPagerandroid:id="@+id/pager"android:layout_width="match_parent"android:layout_height="match_parent" /><com.astuetz.HeaderFameLayoutandroid:id="@+id/header"android:layout_width="match_parent"android:layout_height="@dimen/header_height" ><com.flavienlaurent.notboringactionbar.KenBurnsSupportViewandroid:id="@+id/header_picture"android:layout_width="match_parent"android:layout_height="match_parent" /><ImageViewandroid:id="@+id/header_logo"android:layout_width="@dimen/header_logo_size"android:layout_height="@dimen/header_logo_size"android:layout_gravity="center"android:src="@drawable/ic_header_logo" /><com.astuetz.PagerSlidingTabStripandroid:id="@+id/tabs"android:layout_width="match_parent"android:layout_height="48dip"android:layout_gravity="bottom"android:background="@android:color/transparent" /></com.astuetz.HeaderFameLayout></com.astuetz.OuterFameLayout>
HeaderFameLayout.java
public class HeaderFameLayout extends FrameLayout{public static boolean consume = false; public HeaderFameLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { if(OuterFameLayout.isScrolled) { MotionEvent event = MotionEvent.obtain(ev); event.setAction(MotionEvent.ACTION_CANCEL); super.dispatchTouchEvent(event); event.recycle(); return false; } boolean result = super.dispatchTouchEvent(ev); consume = result; return result; } }
public class OuterFameLayout extends FrameLayout{private ViewPager mViewPager; private float startX, startY, curX, curY; public static boolean isScrolled = false; public void setViewPager(ViewPager viewPager) { mViewPager = viewPager; } public OuterFameLayout(Context context, AttributeSet attrs) { super(context, attrs); } private boolean _isFirstTime = false; private MotionEvent _downEvent = null; @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: startX = ev.getX(); startY = ev.getY(); curX = startX; curY = startY; _downEvent = MotionEvent.obtain(ev); _isFirstTime = true; isScrolled = false; break; case MotionEvent.ACTION_MOVE: curX = ev.getX(); curY = ev.getY(); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: isScrolled = false; break; } float dx = Math.abs(curX - startX); float dy = Math.abs(curY - startY); isScrolled = dx > 10 || dy > 10; boolean result = super.dispatchTouchEvent(ev); if(HeaderFameLayout.consume && isScrolled && mViewPager != null) { //HeaderFameLayout.dispatchTouchEvent返回true并且是滚动的前提下才给viewpager分配事件 if (_isFirstTime) { _isFirstTime = false; mViewPager.dispatchTouchEvent(_downEvent);//只有分配了down事件,move事件才能生效 _downEvent.recycle(); _downEvent = null; } else { MotionEvent event = MotionEvent.obtain(ev); mViewPager.dispatchTouchEvent(event); event.recycle(); } } return result; }}
public class HeaderViewPager extends ViewPager{public HeaderViewPager(Context context, AttributeSet attrs){super(context, attrs);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev){try{return super.dispatchTouchEvent(ev);}catch (IllegalArgumentException ex){ex.printStackTrace();}return false;}}
1 0
- ParallaxHeaderViewPager改进
- ParallaxHeaderViewPager源码解析
- 使用协调者布局CoordinatorLayout 来实现ParallaxHeaderViewPager的效果,超简单
- 改进sp_lock
- 改进eboot
- JPivot改进
- codeeditor--- 改进
- suDebug 改进~~
- fckeditor 改进
- 改进FlickCharm
- FTPPROXY 改进
- 复制改进
- 改进 汉诺塔
- 成绩管理系统改进
- 反思,改进 。
- ucguimenu改进
- 过程改进
- SlopOne 改进
- 过滤导致json.parse出现SyntaxError的特殊字符
- 61单片机项目 - 使用C语言实现A口作为输入口、B口作为输出口
- DELPHI短信接口开发经验及具体开发实现
- HDU 5428
- javascript 整型与字符串比较大小
- ParallaxHeaderViewPager改进
- NOIP 2000 方格取数 NOIP 2008 传纸条 多线程DP
- Java获取某个月的天数
- 在window 下安装Memcache详解
- java IO流分析,java文件读写
- 转载 [置顶] 计算机视觉领域的一些牛人博客,超有实力的研究机构等的网站链接
- 个人经验不能代替需求
- android-------截屏的两种方法
- 利用脚本修复WINDOWS引导文件丢失