在onTouchEvent()中的MotionEvent.ACTION_MOVE期间重绘视图

时间:2013-01-29 10:10:13

标签: android touch

我已经创建了我自己的扩展RelativeLayout的组件,在其中我有一个View类型的字段,该字段位于边距:

enter image description here

蓝色四边形代表我的父视图,红色圆圈代表一个孩子。

现在我想让用户在屏幕上移动手指时移动此红圈。 这是我的onTouchEvent()方法:

@Override
public boolean onTouchEvent(MotionEvent event) {

    int eventAction = event.getAction();

    switch (eventAction) {
        case MotionEvent.ACTION_DOWN: 
            // finger touches the screen
            break;

        case MotionEvent.ACTION_MOVE:
                marginX = (int)event.getX();
                marginY = (int)event.getY();
                RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)pointer.getLayoutParams(); // pointer is this red circle
                lp.setMargins(marginX, marginY, 0, 0);

            break;

        case MotionEvent.ACTION_UP:   
            // finger leaves the screen
            break;
    }


    return true;
}

但我很快发现,当用户在屏幕上移动手指时,它不会刷新它的位置,而是只有当用户从屏幕上释放手指时才会这样做。所以基本上,当我移动我的手指时,圆圈保持在相同的位置,但是当我停止移动时,圆圈被绘制在新的位置。我尝试在父视图和子视图上使用invalidate()方法,但它没有帮助。我假设它可能与UI线程有关,但我无法访问runOnUiThread()' method as it's not an Activity`。

编辑: 我将一个活动传递给了我的班级,以便我可以使用runOnUiThread()。我的case: ACTION_MOVE现在看起来像这样:

case MotionEvent.ACTION_MOVE:      
    marginX = (int)event.getX();
    marginY = (int)event.getY();

    activity.runOnUiThread(new Runnable() {
        public void run() { 
        RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)pointer.getLayoutParams();
        lp.setMargins(marginX, marginY, 0, 0);
        pointer.invalidate();
        }
    });

break;

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

如果它是简单的指针,您可以Canvas作为Drawable绘制它:

@Override
protected void onDraw(Canvas canvas) {
    pointer.setBounds(marginX, marginY, marginX + pointerWidth, marginY + pointerHeight);
    pointer.draw(canvas);

    super.onDraw(canvas);
}

然后在invalidate()方法中的指针上调用onTouchEvent()