gpt4 book ai didi

java - Android:更新窗口内 View 的线程

转载 作者:太空狗 更新时间:2023-10-29 14:57:11 24 4
gpt4 key购买 nike

我有一个 Service,它可以使用包含自定义 View< 的 SYSTEM_ALERT_WINDOW 在所有应用程序之上绘制一个 Canvas/.

我正在尝试使用调用 Canvas.draw(...)postInvalidate 的 ThreadCanvas 对象设置动画() - 我希望这会在屏幕上“移动”形状。它不起作用。

我尝试将我的自定义 View 放入 ViewGroup 容器中,并将其添加到 WindowManager 对象中 - 基于以下帖子:

Animate system alert type view

WindowManager with Animation (is it possible?)

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

这是我的代码...

CursorService.java

    public class CursorService extends Service {

private WindowManager windowManager;
private ViewGroup cursorContainer;
private Cursor cursor;

@Override
public IBinder onBind(Intent intent) {
return null;
}


public void onCreate() {
super.onCreate();

go();
}

public void go(){

windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
PixelFormat.TRANSLUCENT
);

cursor = new Cursor(this);
cursorContainer = new LinearLayout(this);
cursorContainer.addView(cursor);
windowManager.addView(cursorContainer, params);


new Thread(new Runnable() {
@Override
public void run() {
cursor.x+=1;
cursor.y+=1;
cursor.radius=100;
}
}).start();
}


public void onDestroy() {
super.onDestroy();
if (cursorContainer!=null) windowManager.removeView(cursorContainer);
}
}

游标.java

public class Cursor extends View {

public float x;
public float y;
public float radius;
public Paint paint;

public Cursor(Context context) {
super(context);

x=0;
y=0;
radius=0;
paint=new Paint();
paint.setColor(Color.RED);

new Thread(new Runnable() {
public void run() {
while (true){
try{
Thread.sleep(100);
postInvalidate();
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
}).start();
}

@Override
protected void onDraw(Canvas canvas){
canvas.drawCircle(x, y, radius, paint);
}
}

最佳答案

首先,您需要在 runnable 中加入类似 while(true){} 的循环,因为在您的代码中,postInvalidate() 方法只会被调用一次。

但是在onDraw 中调用invalidate() 方法并使用当前时间计算你的圆圈位置会好得多。

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();
}
}

关于java - Android:更新窗口内 View 的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30276508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com