加入帧率控制
核心代码
while (isRunning) {
long startMs = System.currentTimeMillis();
draw();
long endMs = System.currentTimeMillis();
long needTime = 1000 / fps;
long usedTime = endMs - startMs;
if (usedTime < needTime) {
try {
Thread.sleep(needTime - usedTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
完整代码
package com.example.zhangyu.cutvideomusic;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import com.example.zhangyu.cutvideomusic.utils.ThumbUtils;
public class BgSurfaceView extends SurfaceView {
private SurfaceHolder holder;
private Canvas canvas;
private Thread thread;//用于绘制的线程
private boolean isRunning;//线程的控制开关
//设置绘制的fps
private int fps = 30;
public BgSurfaceView(Context context) {
this(context, null);
}
public BgSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
holder = getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
isRunning = true;
thread = new Thread(new Runnable() {
@Override
public void run() {
//不断绘制
while (isRunning) {
long startMs = System.currentTimeMillis();
draw();
long endMs = System.currentTimeMillis();
long needTime = 1000 / fps;
long usedTime = endMs - startMs;
if (usedTime < needTime) {
try {
Thread.sleep(needTime - usedTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
});
thread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
isRunning = false;
}
});
}
Bitmap bitmapCache;
private void draw() {
//SurfaceView被销毁,但是子线程可能还在进行操作,可能抛出一些异常
try {
canvas = holder.lockCanvas();
//按home或者back,SurfaceView被销毁,所以需要判空canvas
if (canvas != null) {
if (bitmapCache == null) {
bitmapCache = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvasCache = new Canvas(bitmapCache);
drawCache(canvasCache);
canvas.drawBitmap(bitmapCache, 0, 0, null);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (canvas != null) {
try {
//手动try catch一下这个方法,让程序在4.3的手机上不至于崩溃,部分Android13也会崩溃
holder.unlockCanvasAndPost(canvas);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
private void drawCache(Canvas canvas) {
//todo 开始绘制
}
}