Follows是一个SSCCE来理解动画时序,从一个更复杂的例子中提取。这个例子在完成后应该做的是创建一个圆圈并每秒在红色和绿色之间改变它的填充颜色。现在它只是绘制一个红色圆圈,然后没有别的。我已经尝试将Runnable,Timer,Thread和Handler代码放在不同的位置,但它似乎从未做过任何事情。我在run()方法中遇到的另一个问题是需要引用Canvas和当前颜色,我获得它们的唯一方法是为它们创建成员数据,特别是在Canvas的情况下,它看起来像是馊主意。对于我最终要做的事情,图形对象的旋转和转换,SampleView和随附的Canvas似乎几乎肯定是必要的,所以我想让SampleView保持原位。我认为这是问题的一部分,我遇到的大多数动画示例都将时间代码放在一个Activity中但由于必须使用内部View的画布来更新颜色,因此无法正常工作(除非我遗漏了一些东西)
在内部运行方法中,我使用了类似代码的变体。
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);
}
}
}