Android setPolyToPoly遇到的问题(二)

Android setPolyToPoly遇到的问题(二)

问题:

问题还是上一篇(Android setPolyToPoly遇到的问题(一))的问题,上一篇采用硬件加速解决但是他有可能会在一些手机上会出现绘制的四边形周围有黑边,怀疑是matrix 对 canvas 作用后,透明处理出了问题.

解决办法:

matrix 作用在一些系统的 canvas 上面有问题,那我们自定义一个 canvas,先把图形画到自己的画布上,最后再把自定义canvas画到系统 canvas 上.

封装一个CanvasWrapper来实现

public class CanvasWrapper {

    private int mWidth;
    private int mHeight;
    private final Canvas mCanvas = new Canvas();
    private final Rect mDstRect = new Rect();
    private Bitmap mDrawBitmap;

    public CanvasWrapper() {}

    public void setCanvasSize(int width, int height) {
        if (width <= 0 || height <= 0) {
            return;
        }

        mWidth = width;
        mHeight = height;
        mDstRect.set(0, 0, width, height);
        createDrawBitmap();
    }

    public void drawBitmap(Bitmap bitmap, Matrix matrix, Paint mPaint) {
        if (null != bitmap && null != matrix) {
            mCanvas.drawBitmap(bitmap, matrix, mPaint);
        }
    }

    public void draw(Canvas canvas) {
        if (mDrawBitmap != null) {
            canvas.drawBitmap(mDrawBitmap, null, mDstRect, null);
        }
    }

    public Canvas getCanvas() {
        return mCanvas;
    }

    private void createDrawBitmap() {
        final int width = mWidth;
        final int height = mHeight;
        if (null != mDrawBitmap) {
            if (mDrawBitmap.getWidth() != width || mDrawBitmap.getHeight() != height) {
                mDrawBitmap = null;
            }
        }

        if (mDrawBitmap == null) {
            try {
                mDrawBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            } catch (Exception e) {
                e.printStackTrace();
            } catch (OutOfMemoryError e) {
                e.printStackTrace();
            }
        }

        if (mDrawBitmap != null) {
            reset();
            mCanvas.setBitmap(mDrawBitmap);
        }
    }

    private void reset() {
        if (mDrawBitmap != null) {
            mDrawBitmap.eraseColor(Color.TRANSPARENT);
        }
    }

然后onDraw()改成这样

    @Override
    protected void onDraw(Canvas canvas) {
        mCanvasWrapper.setCanvasSize(canvas.getWidth(), canvas.getHeight());
        mCanvasWrapper.drawBitmap(mBitmap, mPolyMatrix, pointPaint);
        super.onDraw(mCanvasWrapper.getCanvas());
        mCanvasWrapper.draw(canvas);
    }
这样通过自定义canvas也可以解决Matrix.setPolyToPoly 接口绘制一个多边形,在华为手机上遇到图片变形错位的问题.

记录点点滴滴,如果有问题请指点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值