zoukankan      html  css  js  c++  java
  • 如何利用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);

    }

     


  • 相关阅读:
    winform窗体扁平化设置,窗体移动,关闭
    WPF按钮控件模板
    C#连接Sqlite报错:{"试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)"}
    C#SQLite使用教程笔记
    C#自定义控件导航菜单(自定义事件,属性)
    LCS局域网屏幕监控系统安装指导
    System.Data.SQLite.dll 未安装或者版本冲突,按下面步骤操作即可 1、从Nuget卸载所有项目的System.Data.SQLite.dll 和SqlSugar,检查引用中是否还存在,存在直接删掉引用,然后Nuget重新安装即可
    C#项目脱落NuGet
    JavaScript跨域总结与解决办法
    回流与重绘:CSS性能让JavaScript变慢?
  • 原文地址:https://www.cnblogs.com/lws520/p/5871068.html
Copyright © 2011-2022 走看看