Android在视图之间传输触摸事件

时间:2011-11-17 10:41:32

标签: android touch

这是我的问题。

我在线性布局中有大约7个按钮,我试图在它们之间“滑动”,在手指经过时突出显示每个按钮。

到目前为止,我已经看到接收动作down事件的视图被锁定并接收每个后续动作事件,直到动作为止。

这就是我的尝试:

public class LinearRoot extends LinearLayout {

    @SuppressWarnings("unused")
    private static final String TAG = LinearRoot.class.getSimpleName();

    public LinearRoot(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
    }

    private LinearRoot(Context context) {
    super(context);
    init();
    }

    private void init() {
    getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {

        for (int i = 0; i < getChildCount(); i++) {
            Rect r = new Rect();
            getChildAt(i).getHitRect(r);
            Log.e(TAG, r.flattenToString());
            map.put(r, getChildAt(i));
        }
        LinearRoot.this.getViewTreeObserver().removeGlobalOnLayoutListener(this);

        }
    });
    }

    /* (non-Javadoc)
     * @see android.view.ViewGroup#onInterceptTouchEvent(android.view.MotionEvent)
     */
    View lastView;

    private final HashMap<Rect, View> map = new HashMap<Rect, View>();

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        return false;
    }
    Rect rect = new Rect();
    if (lastView != null) {
        lastView.getGlobalVisibleRect(rect);
        if (dispatchTouchToSpecificView(rect, ev)) {
        lastView.dispatchTouchEvent(ev);
        return false;
        } else {
        ev.setAction(MotionEvent.ACTION_CANCEL);
        lastView.dispatchTouchEvent(ev);
        }
    }

    Iterator<Rect> iterator = map.keySet().iterator();
    while (iterator.hasNext()) {
        rect = iterator.next();
        if (dispatchTouchToSpecificView(rect, ev)) {
        lastView = map.get(rect);
        map.get(rect).dispatchTouchEvent(ev);
        return false;
        }
    }
    return false;
    }

    private boolean dispatchTouchToSpecificView(Rect r, MotionEvent ev) {
    Log.e(TAG, "X: " + (int) ev.getX() + " Y" + (int) ev.getY());
    Log.e(TAG, r.flattenToString());
    return r.contains((int) ev.getRawX(), (int) ev.getRawY());
    }
}

这是所有按钮的根布局,通过获取其全局命中矩形并查看触摸事件是否在内部,将触摸事件委派给相应的按钮。

现在这只是部分工作,我对解决方案不满意,请提供一些评论或尝试的可能性。

我想要实现的是一个布局,其中有大量的按钮非常小,我想在发布之前突出显示所触摸的按钮,以便用户可以调整他的点击。

0 个答案:

没有答案