• 【安卓】给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;
    	}
    }


  • 相关阅读:
    [NOI2009]管道取珠
    Rebalance再均衡
    生产者分区写入策略
    Kafka事务
    幂等性
    消费者组
    Kafka中的重要概念
    偏移量offset
    服务注册和发现的意思,Spring cloud如何实现?
    负载平衡的意义
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6722536.html
Copyright © 2020-2023  润新知