我正在寻找一种在Android中动画自定义视图的简单方法。我试图避免使用动画对象,但希望使用原始线程。我所做的是通过创建一个扩展 android.view.View的类来创建自定义视图。然后我覆盖 onDraw 方法并使用画布绘制矩形。我想要的是收缩的矩形,所以我保留一个变量来表示矩形右边的x值。然后,我希望矩形的右边缘随着时间的推移而缩小。我想要做的是创建一个新线程,启动它并让它改变矩形的值。在您调用 View.invalidate 之前,除了视图之外的所有工作都不会更新。问题是我无法从我生成的线程中调用它,因为它不是UI线程。我阅读了使用Handler的解决方案......但我仍然不确定这是否是正确的解决方案,以及如何使用它们。
package com.example.practicum;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;
public class TimerControl extends View implements Runnable, Handler.Callback
{
private Paint paint;
private Rect rect;
private Thread t;
private Handler h;
public TimerControl(Context context, AttributeSet attrs)
{
super(context, attrs);
// TODO Auto-generated constructor stub
paint = new Paint();
paint.setColor(Color.BLUE);
rect = new Rect(0,0,60,60);
t = new Thread(this);
t.start();
h = new Handler(this);
//h.post(this);
}
@Override
public void onDraw(Canvas canvas)
{
canvas.drawRect(rect, paint);
}
@Override
public void run()
{
rect.right = rect.right-1;
while(true)
{
rect.right = rect.right-1;
this.invalidate();
try
{
Thread.sleep(5000);
h.sendEmptyMessage(0);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public boolean handleMessage(Message msg)
{
return false;
}
}
答案 0 :(得分:2)
你可以定义一个全局处理程序(在UI线程中):
Handler mHandler = new Handler();
然后,从您的主题,致电:
mHandler.post(new Runnable() {
public void run() {
// call some method on the UI thread
}
});