android画图双缓冲模拟

android中的Surfaceview实现了双缓冲机制,所谓双缓冲,就是会保存上一次绘图的内容,然后再上一次的基础上继续绘图,这样是为了保证绘制的图像不丢失。

但是view本身并没有实现双缓冲机制,下面我们来模拟一下双缓冲

先说明一下思路:当程序再view绘图是,并不直接绘制在view上,而是绘制到内存中的bitmap图片上,等内存中的bitmap绘制好了之后,在一次性把bitmap绘制到view

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class MyView extends View {
	float preX;  
    float preY;  
    private Path path;  
    public Paint paint = null;  
    final int VIEW_WIDTH = 640;  
    final int VIEW_HEIGHT = 960;  
    //定义一个内存中的图片,该图片将作为缓冲区  
    Bitmap cacheBitmap = null;  
    //定义cacheBitmap上的canvas对象  
    Canvas cacheCanvas = null;  
    public MyView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        //创建一个与该View相同大小的缓存区  
        cacheBitmap = Bitmap.createBitmap(VIEW_WIDTH,VIEW_HEIGHT,Config.ARGB_8888);  
        cacheCanvas = new Canvas();  
        path = new Path();  
        //设置cacheCanvas将会绘制到内存中的cacheBitmap上  
        cacheCanvas.setBitmap(cacheBitmap);  
        //设置画笔的颜色  
        paint = new Paint(Paint.DITHER_FLAG);  
        paint.setColor(Color.RED);  
        //设置画笔的风格  
        paint.setStyle(Paint.Style.STROKE);  
        paint.setStrokeWidth(1);  
        //反锯齿  
        paint.setAntiAlias(true);  
        paint.setDither(true);  
    }  
    public boolean onTouchEvent(MotionEvent event)  
    {  
        //获取拖动事件发生的位置  
        float x = event.getX();  
        float y = event.getY();  
        switch(event.getAction())  
        {  
            case MotionEvent.ACTION_DOWN:  
                 path.moveTo(x, y);  
                 preX = x;  
                 preY = y;  
                 break;  
            case MotionEvent.ACTION_MOVE:  
                 path.quadTo(preX, preY, x, y);  
                 preX = x;  
                 preY = y;  
                 break;  
            case MotionEvent.ACTION_UP:  
                 cacheCanvas.drawPath(path, paint);  
                 path.reset();  
                 break;  
        }  
        invalidate();  
        //返回true表明处理方法已经处理该事件  
        return true;  
    }  
    public void onDraw(Canvas canvas)  
    {  
        Paint bmpPaint = new Paint();  
        //将cacheBitmap绘制到该View组件上  
        canvas.drawBitmap(cacheBitmap, 0, 0, bmpPaint);  
        //沿着path绘制  
        canvas.drawPath(path, paint);  
    }  
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值