下面是一个 SSCCE,用于理解动画时间,从一个更复杂的示例中提取。这个示例完成后应该做的是创建一个圆圈并每秒在红色和绿色之间更改其填充颜色。现在它只是画了一个红色的圆圈,然后什么都没有。我尝试将 Runnable、Timer、Thread 和 Handler 代码放在不同的位置,但它似乎从来没有做任何事情。我在 run() 方法中遇到的另一个问题是需要对 Canvas 和当前颜色的引用,而我获得它们的唯一方法是为它们创建成员数据,尤其是在 Canvas 的情况下,这看起来像是馊主意。对于我最终要做的事情,图形对象、SampleView 和随附的 Canvas 的旋转和平移似乎几乎肯定是必要的,所以我想将 SampleView 留在原处。
在内部运行方法中,我对这样的代码使用了变体。
if (color == Color.RED)
color = Color.GREEN;
else color = Color.RED;
canvas.drawOval(rectF, p);
hand.postDelayed(run, GET_DATA_INTERVAL);
那些对颜色和画布的引用一直很痛苦。
package com.example.circles;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new SampleView(this));
}
private static class SampleView extends View {
public SampleView(Context context) {
super(context);
setFocusable(true);
p = new Paint();
}
Paint p;
int color;
RectF rectF = new RectF(0, 0, 50, 50);
@Override
protected void onDraw(Canvas canvas) {
p.setStyle(Paint.Style.FILL);
color = Color.RED;
p.setColor(color);
canvas.drawOval(rectF, p);
}
}
}