什么叫做view的双缓冲机制?顾名思义,双缓冲意味着会有两个缓冲层,缓冲的出现就是为了提高view的刷新速度。
我们知道,由于人眼的原因,1秒24帧的动画才能让人感觉到顺畅,因此每一帧的时间大概也就是41ms,而且这41ms并不是全部留给Android代码的,最后留给Android发挥的时间也就只有16ms左右,当我们需要绘制一个重量级的动画时,16ms不足以将整个view重新绘制一边,这时该怎么办?这时就该双缓冲登场了。
实现双缓冲很简单,分三步:
-
创建一个跟实际绘图区域同样大小的缓冲区(Bitmap);
-
创建一个画布(Canvas),设置画布Canvas的Bitmap为创建好的缓冲区;
-
把需要绘制的图像绘制到缓冲区,再将缓冲区的图像一次性绘制到屏幕上。
如图:
双缓冲机制一般使用在动态view中,可以将一个view中的静态部分先绘制在自定义的缓冲区中,刷新view时只需重绘动态部分即可。
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
/**
* @author shuai
* @date 2019/3/16
* @description:自定义小球弹跳view
*/
public class BounceView extends View {
/*自定义属性*/
private int ballColor;
private float ballRadius;
private int wallColor;
private float wallStrike;
private boolean simultaReality;
private double velocity;
private double direction;
private double offsetX;
private double offsetY;
private Paint ballPaint;
/*使用双缓冲机制*/
private Bitmap bufferBitmap;
private Canvas bufferCancas;
public BounceView(Context context) {
this(context,null);
}
public BounceView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public BounceView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
final TypedArray array = context.obtainStyledAttributes(attrs,R.styleable.BounceView)