最近项目需求里有这么一个功能需求,在家庭平面图(ImageView)上实时绘制一个小物件,并且能可视该物件的实时转角。
思路:
解决方案一:两层图层,地图是ImageView,顶图是该物件,通过属性动画控制其旋转;
解决方案二:一层图层,地图是ImageView,直接在该ImageView上绘制该小物件Bitmap,并通过Mextra来旋转物件。
问题:
方案一确实好用,但是有个问题,两个图层会把问题复杂化,最简单的就是时时需要考虑统一坐标。
下面说说方案二,很简单。
在onDraw里通过旋转矩阵的方式来旋转Bitmap
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (pointX != 0 || pointY != 0) {
matrix.setRotate(0);
matrix.setRotate(degree);
Bitmap bitmap = Bitmap.createBitmap(robotBitmap, 0, 0, robotBitmapWidth, robotBitmapHeight, matrix, true);
canvas.drawBitmap(bitmap, pointX - bitmap.getWidth() / 2, pointY - bitmap.getHeight() / 2, mRobotBitmapPaint);
canvas.drawCircle(pointX, pointY, robotRadius, robotPaint); // 目标点
}
}
至此问题已经解决,下面是对createBitmap的解释,时间紧的可以不看了。
解释:
第一步:matrix.setRotate(0),把矩阵回归到0度,因为矩阵旋转后就保持在最后一次旋转的角度(在onDraw里面不要new Matrix()太频繁,所以直接在初始化的时候new Matrix(),因此该步骤需要设置0度);
第二步:matrix.setRotate(degree),设置Bitmap要旋转的角度,此处是°,不是弧度;
第三步:Bitmap bitmap = Bitmap.createBitmap(robotBitmap, 0, 0, robotBitmapWidth, robotBitmapHeight, matrix, true),通过一个bitmap创建一个新的Bitmap,不剪裁但旋转该Bitmap;
第四步: canvas.drawBitmap(bitmap, pointX - bitmap.getWidth() / 2, pointY - bitmap.getHeight() / 2, mRobotBitmapPaint),绘制新的bitmap(pointX - bitmap.getWidth() / 2和pointY - bitmap.getHeight() / 2的作用是位图的中心就是我们点击的地方);
第五步:定位手指点击的位置并画出来,用于辅助查看要绘制的bitmap位置(因为绘制点没什么说,点哪里绘制哪里,bitmap的绘制就不一样了,bitmap的绘制是从该图的左上角开始绘制的,如下图)
picture1.png
API
public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height,Matrix m, boolean filter)
参数一:Bitmap,子bitmap,也就是原图;
参数二:x,source中的第x列
参数三:y,source中的第y列,x,y决定了我们新的bitmap开始于source的第几个像素
参数四:width,新的bitmap每一行的像素数量
参数五:height,新的bitmap每一列的像素数量
参数六:m,矩阵,可以理解为bitmap是相片,matrix是相框,相框怎么摆相片就怎么摆
参数七:filter,如果m不仅仅是移动,则最好修改为true,下面有图参考
注意该异常:java.lang.IllegalArgumentException: x + width must be <= bitmap.width(),在我们给定的参数里,x+width<=source.width(), width is <= 0, or height is <= 0
参数四、五、六、七解释
看图知意,就是裁剪,如果不想裁剪,那么就按0,0,bitmapWidth,bitmapHeight设置
上图的参数是
Bitmap bitmap = Bitmap.createBitmap(robotBitmap, 20, 20, robotBitmapWidth - 20, robotBitmapHeight - 20, matrix, true);
参数七 filter 解释
直接看图
图一是原图:
原图.jpg
图二是旋转-10°,但filter为true
filter为true.png
图三是旋转-10°,但filter为false
filter为false.png
结语:
旋转位图其实是通过创建一个矩阵,旋转该矩阵,用矩阵和原图创建一个新的原图副本(矩阵就是相框,副本就是相片),很简单。
网友评论