Android:线程更新视图内部窗口

时间:2015-05-16 13:51:33

标签: java android multithreading canvas

我有Service可以使用包含自定义Canvas的{​​{1}}在所有应用程序之上绘制SYSTEM_ALERT_WINDOW

我正在尝试使用调用ViewCanvas的{​​{1}}来设置Thread对象的动画。我希望这会“移动”#34;整个屏幕的形状。它不起作用。

我尝试将自定义Canvas.draw(...)放入postInvalidate()容器中,并根据以下帖子将其添加到View对象中:

Animate system alert type view

WindowManager with Animation (is it possible?)

Canvas对象位置没有改变 - 我做错了什么?

这是我的代码......

CursorService.java

ViewGroup

Cursor.java

WindowManager

2 个答案:

答案 0 :(得分:2)

首先,您需要在runnable中使用while(true){}周期的smth,因为在您的代码中postInvalidate()方法只会被调用一次。

但最好在invalidate()中调用onDraw方法,并使用当前时间计算您的圈位。

public class Cursor extends View {    
    public Cursor(Context context) {
        super(context);
        startTime = System.currentTimeMills();
    }

    @Override
    protected void onDraw(Canvas canvas){
        long delta = System.currentTimeMills() - startTime;
        // ... calculate x and y using delta
        canvas.drawCircle(x, y, radius, paint);
        invalidate();
    }
}

答案 1 :(得分:-1)

由于您要从单独的线程更改xyradius,因此您应该使它们变得不稳定。否则,您的视图(在UI线程上)将不会看到您对这些变量(来自后台线程)所做的更改。

public volatile float x;
public volatile float y;
public volatile float radius;