4

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

在此处输入图像描述

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

现在我想允许用户在屏幕上移动手指时移动这个红色圆圈。这是我的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 anActivity`。

编辑:我将一项活动传递给我的班级,以便我可以使用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;
4

2 回答 2

2

我认为您需要拖放功能

参考http://www.vogella.com/articles/AndroidDragAndDrop/article.html

于 2013-01-29T10:19:37.187 回答
2

如果它是简单的指针,您可以将其绘制CanvasDrawable

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

    super.onDraw(canvas);
}

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

于 2013-01-29T11:16:09.157 回答