如何利用Thread制作简单的android动画

须知少年凌云志,曾许人间第一流。这篇文章主要讲述如何利用Thread制作简单的android动画相关的知识,希望能为你提供帮助。
【如何利用Thread制作简单的android动画】最近按照老板要求要做一个简单动画,内容可以简单概括为一个箭头在屏幕中心自动旋转。我知道android API里面有animation类,它已经提供了rotation的函数。可是,老板要求不用它的API。所以我的制作如下:
1.先了解一下线程(Thread)
多线程指的是一个应用程序当中有多个线程,线程是并列运行的,一起抢占CPU。我们平时写的主函数就是一个线程,如果我们继承了Thread类,则又开发了一个新的线程。
它有两种实现方法:
一个是继承Thread类,并override里面的run()函数。
另一个方法是implement Runnable(),并override里面的run()函数。
如下:

class myThread extends Thread{

public void run(){ //写要运行的代码 }

}

//启动线程

myThread.start();

另一种方法:

class PrimeRun implements Runnable {
 
          public void run() {
              // compute primes larger than minPrime
              . . .
          }
      }
  //启动线程

PrimeRun p = new PrimeRun();
      new Thread(p).start();

我利用的是Thread类中的方法:myThread.sleep();
这个方法可以让系统每隔一段时间运行一次,我设置的间隔时间是100ms。而每次我画的指针都会变动它的位置,因此连起来看上去就是它在自己转动。代码如下:


private final Runnable moveThread = new Runnable(){@Override public void run() { // TODO Auto-generated method stub while(true){ degree=degree+0.1; b = 300*Math.cos(Math.toRadians(degree)); a = 300*Math.sin(Math.toRadians(degree)); try{ Thread.sleep(100); }catch(InterruptedException e){ e.printStackTrace(); } postInvalidate(); //每变动完一次之后重新绘图。 } }}; new Thread(moveThread).start();

接下来写画直线的代码:需要创建一个MyView来继承View,并override里面的onDraw()函数
public class MyView extends View{public MyView (Context context){ super(context); public void onDraw(Canvas canvas){

  super.onDraw(canvas);
float Xcenter = (float)getWidth()/2;
float Ycenter = (float)getHeight()/2;
Vector(Xcenter,Ycenter,(float)(Xcenter+a),(float)(Ycenter+b),p,canvas);  //随着每100ms,a和b的值一直在变动,最后的效果就是一个箭头在屏幕中间绕半径为300的圆自动旋转。
} }}

//Vector函数用来画一个箭头,是自己定义的函数如下:

public void Vector(float x1,float y1,float x2,float y2,Paint paint,Canvas canvas){
double Vdeg = Math.toDegrees(Math.atan2(y2-y1, x2-x1));
double deldeg = 10;
canvas.drawLine(x1, y1, x2, y2,paint);
double arrowsize = 0.8*Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
double Vrad = (Vdeg-deldeg)*Math.PI/180.0;
canvas.drawLine((float)(x1+arrowsize*Math.cos(Vrad)),(float)(y1+arrowsize*Math.sin(Vrad)),x2,y2,paint);
Vrad = (Vdeg+deldeg)*Math.PI/180.0;
canvas.drawLine((float)(x1+arrowsize*Math.cos(Vrad)),(float)(y1+arrowsize*Math.sin(Vrad)),x2,y2,paint);

}
 

 
 




    推荐阅读