Android(安卓)绘制线程动画
16lz
2021-01-26
在线程动画中,要用到线程,然而线程不方便直接访问界面上的组件,需要用到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(){}}
更多相关文章
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
- Smali动态调试方法
- Launcher 安装APK快捷方式出现在末尾空白位置
- android Bundle saveInsanceState
- Android(安卓)Service组件的生命周期及用法总结
- Android(java)学习笔记73:线程组的概述和使用
- 解决Android(安卓)5.0以上版本Button自带阴影效果的方法
- [置顶] Android(安卓)Studio快捷键
- 屏幕触点