2014-04-01 158 views
0

在我的Android应用我有我的布局像这样引用一个定制的视图对象:自定义视图动画

<view 
    class="com.usmaan.game.MenuBall" 
    android:layout_width="30dp" 
    android:layout_height="30dp"/> 

类看起来是这样的:

public class MenuBall extends View { 

public MenuBall(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    Paint paint = new Paint(); 
    paint.setColor(Color.LTGRAY); 
    canvas.drawCircle(getMeasuredWidth() * 0.5f, getMeasuredHeight() * 0.5f, getMeasuredHeight() * 0.5f, paint); 
} 
} 

球/ circle正在屏幕上完美地画出来。

但是我想做的事情是让球体动起来,让它垂直和/或水平移动。任何想法如何我可以实现这一目标?

+0

你看过[动画指南](http://developer.android.com/guide/topics/graphics/prop-animation.html)吗? 您可以将该视图放在RelativeLayout中并使用属性动画来移动它。 – FMontano

+0

你没有提到的是你想要球移动的方式。你想要它onTouch,传感器,其他? – a54studio

+0

@digiholic嗨digiholic。目前,我只想让球在没有任何用户输入的情况下移动。例如,我希望球从它的当前位置移动到位置X,然后再返回。 – Subby

回答

1

此睡眠应该在一个线程中进行,以免锁定用户界面时,但会给你一个办法的想法。有几种方法可以实现,实际上只取决于您希望它与用户/应用程序事件相关的操作。

float x= getMeasuredWidth() * 0.5f; 
float destinationX= getMeasuredWidth() * 0.8f; 
boolean isRunning=true; 
Paint paint = new Paint(); 
paint.setColor(Color.LTGRAY); 

@Override 
protected void onDraw(Canvas canvas) { 
super.onDraw(canvas); 

while (isRunning) { 
      Thread.sleep(200); // Waits for .2 second (200 milliseconds) 
      if(x<destinationX){ 
       x+=5;} 
      else {isRunning=false;} 
      canvas.drawCircle(x,y, getMeasuredHeight() * 0.5f, paint); 
      invalidate(); 
} 
} 
+0

是否让睡眠动画在实例化后略微启动,以便用户有机会查看页面,然后看到动画开始?此外,我如何确保它不会锁定用户界面? – Subby

+0

通过说你想让球在不同位置之间移动,实际上并没有提供你想要完成的任何信息。上面的代码将在两个位置之间移动球。睡眠每秒重绘5次。让循环离开主线程,这样线程的睡眠不在主线上。如果你正在尝试做动画然后显示一个视图,那么isRunning被设置为false,那么你可以调用一个视图或其他任何东西,但是如果你只想把某些东西当作动画或其他东西,那么有更简单的方法。 – a54studio