Android View動畫進行中事件無效解決方法打賞

Android View動畫運行時,在運動的View上綁定的事件將不能被觸發,因為諸如點擊事件等,觸發點是綁定在View控件初始化時所在位置的點擊,當動畫移動后點擊坐標就發生了改變,通過查詢一些資料,了解到,Android 3.0以下,動畫存在問題,它只移動了View繪制顯示的地方,卻沒有移動View的物理位置,具體底層實現大家可以看源代碼了解,我不大清楚底層,這里就不多說了,下面說說簡單的解決方法。

只需繼承父級布局,覆蓋onTouchEvent(或者其他需要捕獲的事件)。這里我以FrameLayout為例,因為要捕獲點擊事件,實現onTouchEvent,然后通過獲取當前點擊坐標計算出當前點擊范圍內包含的View控件,找到第一個就直接觸發該View的事件,然后break,示例代碼如下:

public class ExtendFrameLayout extends FrameLayout {

    public ExtendFrameLayout(Context context) {
	super(context);
    }
	
    public ExtendFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
    public ExtendFrameLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
	switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			float x = event.getX();
			float y = event.getY();
			for(int i=0;i < getchildcount();i++){
                                View child = getChildAt(i);
                                if(child!=null){ 
                                        if (containPoint(child, x, y)) { 
                                                Toast.makeText(getContext(), "Touch->"+x+":"+y, Toast.LENGTH_SHORT).show();
						child.performClick();
						break;
					}
				}
			}
		}
		return super.onTouchEvent(event);
    }

    private boolean containPoint(View view, float x, float y) {
	Transformation trans = new Transformation();
		Animation anim = view.getAnimation();
		if(anim!=null){
                    anim.getTransformation(view.getDrawingTime(), trans);
		}
		Matrix matrix = trans.getMatrix();

		int dx = view.getLeft();
		int dy = view.getTop();

		x -= dx;
		y -= dy;

		Matrix mat = new Matrix();
		if (matrix.invert(mat)) {
		    float[] pointsSrc = new float[] { x, y };
		    float[] pointsEnd = new float[] { 0, 0 };

		    mat.mapPoints(pointsEnd, pointsSrc);

	            x = pointsEnd[0] + dx;
		    y = pointsEnd[1] + dy;
		}

		Rect rect = new Rect();
		view.getHitRect(rect);
		return rect.contains((int) x, (int) y);
	}
}

以上示例代碼參考網上資源修改而來,僅方便初學者,另外這里只是傳統的View動畫,因為要兼容低版本Android設備,這里沒有考慮屬性動畫,本人非專業Android開發人員,高手勿笑。

Android View動畫進行中事件無效解決方法
文章《Android View動畫進行中事件無效解決方法》二維碼
  • 微信打賞
  • 支付寶打賞

已有4條評論

  1. 好想談戀愛

    呵呵,不錯

    2015-10-05 08:57 回復
  2. 大哥帶我玩

    [趕火車]

    2015-10-04 21:04 回復
  3. 侶行515

    謝謝博主,學習啦。

    2015-09-01 10:57 回復
  4. af論壇

    謝謝博主,學習啦。

    2015-08-31 16:14 回復

(必填)

(必填)

(可選)

黑龙江22选5开奖