自定义View会呼吸的圆CricleView
/**
* 会呼吸的圆
*/
//1. 继承SurfaceView 实现 surfaceholder.callBack接口
public class CricleView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holder;
private DrawThread thread;
public CricleView(Context context) {
super(context);
init();
}
public CricleView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
// 2 实例化SurfaceHolder 对象
holder = getHolder();
//3 添加监听
holder.addCallback(this);
// 实例化绘制线程
thread = new DrawThread();
}
// surfaceView 创建
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
// 开启一个 绘制线程
thread.start();
}
// surface View 发生大小尺寸格式改变的时候调用
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
//当surfaceView 销毁的时候 调用
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
// 绘制线程
class DrawThread extends Thread {
@Override
public void run() {
super.run();
//画笔
Paint mPaint = new Paint();
mPaint.setColor(Color.RED);
//设置画笔的宽度
mPaint.setStrokeWidth(5);
//画笔线抗锯齿
mPaint.setAntiAlias(true);
//圆的直径
int radus = 0;
while (true) {
if (radus > 150)
radus = 0;
// 获取surfaceView的 画布 锁定一个画布
Canvas canvas = holder.lockCanvas();
// 绘制
radus += 5;
if(canvas!=null){
canvas.drawColor(Color.GREEN);//设置画布的颜色
//画一个圆
canvas.drawCircle(200, 200, radus, mPaint);
// 绘制结束后 解锁画布 并将修改的画布提交
holder.unlockCanvasAndPost(canvas);
}
}
}
}
}
奔跑的爆米花BoomFlowerView
/**
* 会跳舞的爆米花
*/
// 继承surfaceView 并实现接口
public class BoomFlowerView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holder;
private DrawThread thread;
public BoomFlowerView(Context context) {
super(context);
init();
}
public BoomFlowerView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
// 实例化surfaceHolder 并添加监听 并实例化 绘制线程
private void init() {
holder = getHolder();
holder.addCallback(this);
thread = new DrawThread();
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
//启动绘制线程
thread.start();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
class DrawThread extends Thread {
@Override
public void run() {
super.run();
//获取资源管理者
AssetManager manager = getResources().getAssets();
Paint paint = new Paint();//实例化画笔
int i = 1;
while (true) {
String fileName = null;
//获取 画布 锁定画布
Canvas canvas = holder.lockCanvas();
// 获取文件名称
if (i >= 10)
fileName = "loading00" + i + ".png";
else
fileName = "loading000" + i + ".png";
InputStream stream = null;
try {
// 读取文件流
stream = manager.open(fileName);
// 将流转换为 Bitmap
Bitmap bitmap = BitmapFactory.decodeStream(stream);
if(canvas!=null){
canvas.drawColor(Color.BLACK);//设置一下画布的颜色
//绘制 一个bitmap
canvas.drawBitmap(bitmap, 100, 100, paint);
//解锁画布并提交
holder.unlockCanvasAndPost(canvas);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (stream != null) {
try {
// 关闭流
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 叠加i 如果大于26 循环
i++;
if (i > 26) {
i = 1;
}
}
}
}
}
在activity中使用
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="alice.bw.com.day03surfaceview.cricleview_demo.CricleviewActivity">
<alice.bw.com.day03surfaceview.view.CricleView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>