在线程动画中,要用到线程,然而线程不方便直接访问界面上的组件,需要用到SurfaceView间接去访问界面上的组件。SurfaceView需要继承SurfaceHolder.Callback接口,在该接口中有三个方法:

//当surfaceview被创建时调用public void surfaceCreated(SurfaceHolder holder) {}         //当横竖屏幕切换时调用public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}//当surfaceview 被销毁时调用public void surfaceDestroyed(SurfaceHolder holder) {}

 下面是小球运动的线程代码:

          activity_main.xml文件主要设计组件:

 

 

            

 

         在MainActivity.java主要是设计界面图层和实现按钮监听器的方法:

 

 

 

package com.example.surface;import android.app.Activity;import android.os.Bundle;import android.view.View;public class MainActivity extends Activity {private MySurfaceView mv;protected void onCreate(Bundle savedInstanceState) {//调用父类中的onCreate方法super.onCreate(savedInstanceState);//设置界面图层setContentView(R.layout.activity_main);//根据id地址找到mySurfaceView对象mv=(MySurfaceView)findViewById(R.id.mySurfaceView1);} //实现给按钮添加监听器的方法public void found(View v){//根据id地址判断那一个按钮if(v.getId() == R.id.button1){System.out.println("======");mv.addBall();}if(v.getId() == R.id.button2){     Data.setPauseflag(true);}if(v.getId() == R.id.button3){   Data.setPauseflag(false);}if(v.getId() == R.id.button4){while(!Data.list.isEmpty()){Ball ba = Data.list.remove(0);}}}}

 

          在MySurfaceView.java主要实现线程间接访问界面组件:

package com.example.surface;import android.content.Context;import android.util.AttributeSet;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;public class MySurfaceView extends SurfaceView implements Callback{private SurfaceHolder holder;private DrawThread dt;//带一个参数的构造方法,并调用带两个参数的构造方法public MySurfaceView(Context context) {this(context, null);}//带两个参数的构造方法,并调用带三个参数的构造方法public MySurfaceView(Context context, AttributeSet attrs) {this(context, attrs, 0);}//带三个参数的构造方法,并继承父类中的方法public MySurfaceView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);//获取画布holder = this.getHolder();//回调方法holder.addCallback(this);//setFocusable(true);}//当surfaceview被创建时调用public void surfaceCreated(SurfaceHolder holder) {System.out.println("surfaceCreated");//创建线程对象,并开始线程dt = new DrawThread(this,holder);    dt.start();}//当横竖屏幕切换时调用public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {System.out.println("surfaceChanged");}//当surfaceview 被销毁时结束线程public void surfaceDestroyed(SurfaceHolder holder) {System.out.println("surfaceDestroyed");//结束线程dt.setRunflag(false);}//添加小球的方法public void addBall(){Ball ball = new Ball(this);    Data.list.add(ball);}}

 

      在DrawThread.java类中继承Thread,实现run方法:

package com.example.surface;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Style;import android.view.SurfaceHolder;public class DrawThread extends Thread{private SurfaceHolder holder;private boolean runFlag=true;private Paint paint = new Paint();private Canvas canvas;private MySurfaceView mv;public DrawThread(MySurfaceView mv, SurfaceHolder holder){this.mv = mv;this.holder = holder;}//便于在其它类里面获取runFlagpublic void setRunflag(boolean runFlag) {this.runFlag = runFlag;}//线程中的run方法public void run(){while(runFlag){try {Thread.sleep(40);} catch (InterruptedException e) {e.printStackTrace();}//获取Surfaceview上的画布对象,并且锁定if(Data.pauseflag){continue;}try {canvas = holder.lockCanvas();//画的风格设为填充式、颜色为白色paint.setStyle(Style.FILL);paint.setColor(Color.WHITE);//用长方形填充一下背景canvas.drawRect(0, 0, mv.getWidth(), mv.getHeight(), paint);//遍历队列for(int i=0; i

 

    在Data.java中主要存一些项目中经常用到的数据:

 

package com.example.surface;import java.util.ArrayList;public class Data {public static ArrayList list = new ArrayList();public static boolean pauseflag = false;//便于在其它类里面获取pauseflagpublic static void setPauseflag(boolean pauseflag) {Data.pauseflag = pauseflag;}}

 

       在Ball.java中主要实现小球的绘画与运动:

 

package com.example.surface;import java.util.Random;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;public class Ball extends Entity{private float x, y, vx, vy, radius;private MySurfaceView mv;public Ball(MySurfaceView mv){this.mv = mv;inint();}//初始化一些参数public void inint(){//创建随机对象,让小球的移动速度与半径随机生成Random r = new Random();vx = r.nextInt(5)+5;vy = r.nextInt(5)+5;radius = r.nextInt(20)+20;}//画小球的方法public void draw(Canvas c){Paint paint = new Paint();paint.setColor(Color.GREEN);c.drawCircle(x, y, radius, paint);}//小球移动的方法public void move(){    x+=vx;    y+=vy;    if(x<=0){    vx=5;    }if(x>=mv.getWidth()-radius){    vx=-5;    }if(y<=0){    vy=5;    }if(y>=mv.getHeight()-radius){    vy=-5;    }}}

 

      Entity.java一些绘画图片的父类:

 

 

 

package com.example.surface;import android.graphics.Canvas;public class Entity {public void draw(Canvas c){}public void move(){}}

 

 

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Smali动态调试方法
  3. Launcher 安装APK快捷方式出现在末尾空白位置
  4. android Bundle saveInsanceState
  5. Android(安卓)Service组件的生命周期及用法总结
  6. Android(java)学习笔记73:线程组的概述和使用
  7. 解决Android(安卓)5.0以上版本Button自带阴影效果的方法
  8. [置顶] Android(安卓)Studio快捷键
  9. 屏幕触点

随机推荐

  1. android百度地图开发总结
  2. Android(安卓)Notes 之 自定义View(1) 之
  3. Android系统安全大纲
  4. Android(安卓)ListView中 每一项都有不同
  5. [Android进阶]Android(安卓)开发最佳实践
  6. Android(安卓)禁止屏幕旋转 & 旋转屏幕时
  7. Android(安卓)依赖库的使用
  8. 【Medium 万赞好文】ViewModel 和 LIveDa
  9. Activity class {package/class} does no
  10. Activity中的onSaveInstanceState()解析