我想用简单的动画开发我的应用程序。我使用了很多来源:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Arcs.html
我的代码:
public class Animation extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
private static class AnimView extends View {
private Paint myPaint;
private Paint myFramePaint;
private RectF bigOval;
private float myStart;
private float mySweep;
private static final float SWEEP_INC = 1;
public AnimView(Context context) {
super(context);
init();
}
public AnimView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
myPaint = new Paint();
myPaint.setAntiAlias(true);
myPaint.setStyle(Paint.Style.FILL);
myPaint.setColor(Color.RED);
bigOval = new RectF(40, 10, 280, 250);
myFramePaint = new Paint();
myFramePaint.setAntiAlias(true);
myFramePaint.setColor(Color.BLACK);
}
private void drawArcs(Canvas canvas, RectF oval, boolean useCenter, Paint paint) {
canvas.drawRect(oval, myFramePaint);
canvas.drawArc(oval, myStart, mySweep, useCenter, paint);
}
@Override
protected void onDraw(Canvas canvas) {
drawArcs(canvas, bigOval, true, myPaint);
myStart = -90;
mySweep -= SWEEP_INC;
invalidate();
}
}}
我在我的xml文件中以这种方式使用我的视图:
<view
class="go.android.Animation$AnimView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
它运作正常。我知道这不是自定义动画。但是这可以设置这个动画的速度(以ms或秒为单位)?或者停止此动画(例如在OnClick或OnTouch侦听器中),并了解此动画何时完成?
我也希望得到第一个整圈,并在动画结束时 - 缺少圆圈。只需改变这个动画的方向。这可能吗?
我不想使用逐帧动画。我想要连续动画。有没有可能获得类似的动画(设置速度等...) 我还想要制作一种颜色的动画,而不是一个圆形的绘画。
提前谢谢你。对不起我的英语技能。
答案 0 :(得分:0)
可能有更好更精确的方法来控制你的动画(你可以考虑使用OpenGL),但是你可以根据你现有的代码相对容易地改变动画的速度和方向。
速度由SWEEP_INC
字段控制(代表我猜的扫描增量)。每次调用onDraw()
方法时,它都会将楔形的大小增加1度。如果您希望动画的速度提高5倍,请将SWEEP_INC
设置为5而不是1.如果您希望动画的速度提高一半,请将SWEEP_INC
设置为0.5。
您也可以设置一个标志,以便在每次完成时反转动画。我已经使用addToCircle
布尔值修改了代码,以便在每次到达结尾时进行反转。
public class Animation extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
private static class AnimView extends View {
private Paint myPaint;
private Paint myFramePaint;
private RectF bigOval;
private float myStart;
private float mySweep;
private float SWEEP_INC = 1;
//Use this flag to control the direction of the arc's movement
private boolean addToCircle = true;
public AnimView(Context context) {
super(context);
init();
}
public AnimView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
myPaint = new Paint();
myPaint.setAntiAlias(true);
myPaint.setStyle(Paint.Style.FILL);
myPaint.setColor(Color.RED);
bigOval = new RectF(40, 10, 280, 250);
myFramePaint = new Paint();
myFramePaint.setAntiAlias(true);
myFramePaint.setColor(Color.BLACK);
}
private void drawArcs(Canvas canvas, RectF oval, boolean useCenter, Paint paint) {
canvas.drawRect(oval, myFramePaint);
canvas.drawArc(oval, myStart, mySweep, useCenter, paint);
}
public void setIncrement(float newIncrement)
{
SWEEP_INC = newIncrement;
}
@Override
protected void onDraw(Canvas canvas) {
drawArcs(canvas, bigOval, true, myPaint);
myStart = -90;
//If the arc is currently getting bigger, decrease the value of mySweep
if(addToCircle)
{
mySweep -= SWEEP_INC;
}
//If the arc is currently getting smaller, increase the value of mySweep
else
{
mySweep += SWEEP_INC;
}
//If the animation has reached the end, reverse it
if(mySweep%360 == 0)
{
addToCircle = !addToCircle;
}
invalidate();
}
}
}
修改强>
如果您从final
中删除static
和SWEEP_INC
修饰符,则可以使用我添加的setIncrement(float newIncrement)
函数在运行时更改动画的速度。
您可以致电setIncrement(0)
停止动画。
但是,我不认为调用onDraw的速率是恒定的。所以我不知道如何为这个动画分配持续时间(以秒为单位)。为此,您可能希望研究更复杂的动画方法。