У меня есть Service
, который может нарисовать Canvas
поверх всех приложений, используя SYSTEM_ALERT_WINDOW
, который содержит пользовательский View
.Android: Thread to Update View Inside Window
Я пытаюсь оживить Canvas
объект с помощью Thread
, который вызывает Canvas.draw(...)
и postInvalidate()
- Я надеялся, что это будет «двигаться» форму по экрану. Это не работает.
Я попытался положить мой обычай View
внутри ViewGroup
контейнера и добавил это к WindowManager
объекта - на основе следующих сообщений: положение объекта
Animate system alert type view
WindowManager with Animation (is it possible?)
Холст не изменяется - Что я делаю не так?
Вот мой код ...
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);
}
}
Cursor.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);
}
}
Трассировка стека предполагает, что вы вызываете 'invalidate', но код, который вы отправили, вызывает' postInvalidate'. Вы должны вызвать 'postInvalidate', чтобы аннулировать представление из другого потока. – pathfinderelite
Я отредактировал сообщение - оказывается, ошибок нет! – calcha3991