微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我创建了自己的组件,它扩展了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);

            break;

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


    return true;
}

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

编辑:
我将一个活动传递给了我的班级,以便我可以使用runOnUiThread().我的情况: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,0);
        pointer.invalidate();
        }
    });

break;

解决方法

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

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

    super.onDraw(canvas);
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐