Android自定义View——从零开始实现书籍翻页效果(性能优化篇)

Σ( ° △ °|||)︴尼玛手机这是要炸了么,赶紧翻代码找原因。一番检查后,发现View每次在执行触摸翻页操作时,都新建了A、B、C区域内容Bitmap,造成了不必要的开销,实际上如果各区域显示内容不变的情况下,内容Bitmap只需要初始化一次,以后每次绘制时仅需要重用原来的Bitmap即可。同理,View中能重用的对象就要尽量重用,修改我们的BookPageView

public class BookPageView extends View {
//省略部分代码…
private float[] mMatrixArray = { 0, 0, 0, 0, 0, 0, 0, 0, 1.0f };
private Matrix mMatrix;

private GradientDrawable drawableLeftTopRight;
private GradientDrawable drawableLeftLowerRight;

private GradientDrawable drawableRightTopRight;
private GradientDrawable drawableRightLowerRight;
private GradientDrawable drawableHorizontalLowerRight;

private GradientDrawable drawableBTopRight;
private GradientDrawable drawableBLowerRight;

private GradientDrawable drawableCTopRight;
private GradientDrawable drawableCLowerRight;

private Bitmap pathAContentBitmap;//A区域内容Bitmap
private Bitmap pathBContentBitmap;//B区域内容Bitmap
private Bitmap pathCContentBitmap;//C区域内容Bitmap

private void init(Context context, @Nullable AttributeSet attrs){
//省略部分代码…
mMatrix = new Matrix();
createGradientDrawable();
}

private void drawPathAContentBitmap(Bitmap bitmap,Paint pathPaint){
Canvas mCanvas = new Canvas(bitmap);
//下面开始绘制区域内的内容…
mCanvas.drawPath(getPathDefault(),pathPaint);
mCanvas.drawText(“这是在A区域的内容…AAAA”, viewWidth-260, viewHeight-100, textPaint);

//结束绘制区域内的内容…
}

private void drawPathBContentBitmap(Bitmap bitmap,Paint pathPaint){
Canvas mCanvas = new Canvas(bitmap);
//下面开始绘制区域内的内容…
mCanvas.drawPath(getPathDefault(),pathPaint);
mCanvas.drawText(“这是在B区域的内容…BBBB”, viewWidth-260, viewHeight-100, textPaint);

//结束绘制区域内的内容…
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int height = measureSize(defaultHeight, heightMeasureSpec);
int width = measureSize(defaultWidth, widthMeasureSpec);
setMeasuredDimension(width, height);

viewWidth = width;
viewHeight = height;
a.x = -1;
a.y = -1;
pathAContentBitmap = Bitmap.createBitmap(viewWidth, viewHeight, Bitmap.Config.RGB_565);
drawPathAContentBitmap(pathAContentBitmap,pathAPaint);

pathBContentBitmap = Bitmap.createBitmap(viewWidth, viewHeight, Bitmap.Config.RGB_565);
drawPathBContentBitmap(pathBContentBitmap,pathBPaint);

pathCContentBitmap = Bitmap.createBitmap(viewWidth, viewHeight, Bitmap.Config.RGB_565);
drawPathAContentBitmap(pathCContentBitmap,pathCPaint);
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(a.x==-1 && a.y==-1){
drawPathAContent(canvas,getPathDefault());
}else {
if(f.xviewWidth && f.y0){
drawPathAContent(canvas,getPathAFromTopRight());
drawPathCContent(canvas,getPathAFromTopRight());
drawPathBContent(canvas,getPathAFromTopRight());
}else if(f.xviewWidth && f.yviewHeight){
drawPathAContent(canvas,getPathAFromLowerRight());
drawPathCContent(canvas,getPathAFromLowerRight());
drawPathBContent(canvas,getPathAFromLowerRight());
}
}
}

/**

  • 初始化各区域阴影GradientDrawable
    */
    private void createGradientDrawable(){
    int deepColor = 0x33333333;
    int lightColor = 0x01333333;
    int[] gradientColors = new int[]{lightColor,deepColor};//渐变颜色数组
    drawableLeftTopRight = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, gradientColors);
    drawableLeftTopRight.setGradientType(GradientDrawable.LINEAR_GRADIENT);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值