首页 > 代码库 > 【安卓】给gallery内"控件"挂载事件,滑动后抬起手指时也触发事件(滑动时不应触发)的解决、!
【安卓】给gallery内"控件"挂载事件,滑动后抬起手指时也触发事件(滑动时不应触发)的解决、!
思路:
1.gallery内控件挂载事件(如:onClickListener)的方法类似listview,可直接在baseAdapter.getView内给控件挂载(详细方法百度)。
2.貌似没问题,但滑动后(手指在挂载了事件的控件上)抬起手指时仍会触发事件,这是不正确的。
解决方法时,若为滑动(x有偏移),则在gallery.onInterceptTouchEvent中拦截事件,子控件自然接受不到事件。
注:1>不能简单的推断x有偏移就拦截,有些设备犯贱,即使原地抬起也有可能有偏移,此时本应触发onClick却也被拦截掉了。
所以为兼容大多数机器,需水平移动超过一定阈值时再拦截。
所以在阈值范围内,gallery是不动的。
3.问题又来了,缓慢滑动第2项时,会发现"子项"有明显的突变(x坐标突变)。
基本原因是看似滑动超过阈值后,gallery才開始正常移动,事实上在手開始移动时(gallery尚未移动时),gallery也做了一些初始化,导致gallery真正移动时存在误差。
解决方法时,在阈值内滑动手指时,不断做这样的初始化,这样在gallery真正開始运动时,初始化就没有误差了。
public class MyGallery extends Gallery { float mLastMotionX = 0; public MyGallery(Context context) { super(context); // TODO Auto-generated constructor stub } public MyGallery(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } public MyGallery(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { final int action = ev.getAction(); final float x = ev.getX(); switch (action) { case MotionEvent.ACTION_MOVE: final int xDiff = (int) Math.abs(x - mLastMotionX); if (xDiff >50) { return true; } break; case MotionEvent.ACTION_DOWN: mLastMotionX = x; //防止滑动"第2项"时,发生突变 onTouchEvent(ev); break; } return false; } }
【安卓】给gallery内"控件"挂载事件,滑动后抬起手指时也触发事件(滑动时不应触发)的解决、!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。