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().

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...