美文网首页
在onDraw中绘制可实时旋转的bitmap

在onDraw中绘制可实时旋转的bitmap

作者: 最简单的实现 | 来源:发表于2017-06-08 10:18 被阅读0次

    最近项目需求里有这么一个功能需求,在家庭平面图(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设置

    新图像素起始点示例.png
    上图的参数是
    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

    结语:

    旋转位图其实是通过创建一个矩阵,旋转该矩阵,用矩阵和原图创建一个新的原图副本(矩阵就是相框,副本就是相片),很简单。

    相关文章

      网友评论

          本文标题:在onDraw中绘制可实时旋转的bitmap

          本文链接:https://www.haomeiwen.com/subject/wyszfxtx.html