Andriod 自定义View视图双缓冲画图

在画的像素点多的时候,为了遍免出现闪烁的情况,需要进行双缓冲画图。

所谓双缓冲画图,意思就是先在内存中将Bitmap画好。然后再显示到界面上

写了个小Demo做示例:

package com.ndt.eutg.view;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;

public class RulerTopAView extends View {

    Paint paint = null;

    private Bitmap bitmapCache; // 缓存位图,避免重复创建
    private Canvas canvasCache; // 缓存画布,用于绘制bitmapCache

    public RulerTopAView(Context context) {
        super(context);
        InitPaint();
    }

    public RulerTopAView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        InitPaint();
    }

    public RulerTopAView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        InitPaint();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (bitmapCache != null) { /
            // 先在bitmapCache上绘制内容,然后绘制到屏幕上,减少闪烁
            canvasCache.drawColor(Color.WHITE); // 清屏或绘制背景等操作...
            Rect rect = new Rect(10,10,200,200);
            canvasCache.drawRect(rect,paint);            // 在canvasCache上绘制你的图形...

            //先在内存画好后,再一次性画到界面上
            canvas.drawBitmap(bitmapCache, 0, 0, null); // 将bitmapCache的内容绘制到屏幕上
        }
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        bitmapCache = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); // 创建或重新创建bitmap缓存
        canvasCache = new Canvas(bitmapCache); // 创建画布用于绘制bitmapCache
    }

    private void InitPaint() {
        paint = new Paint();
        paint.setColor(Color.GREEN);
        paint.setTextSize(20);
        paint.setStrokeWidth(2);
    }
}

 

posted @ 2025-03-26 15:45  春天又来了  阅读(19)  评论(0)    收藏  举报