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 接口绘制一个多边形,在华为手机上遇到图片变形错位的问题.
记录点点滴滴,如果有问题请指点