我正在参与「启航方案」,这是我参与的第1篇文章。

前段时间比较闲,参与了日新方案更文活动,至今已快三个月了。现在再次提笔,我就来分享下在这之间学习到的新技能,既是记载自己常识的堆集,也希望经过自己的分享可以帮助到我们。

还记得之前曾写过一篇完成一个自定义有限制区域的图例(视点自识别)涂鸦东西类,分为上中下三篇,在最终一篇中介绍到关于涂鸦的旋转功能,这是之前的作用图:

Android:涂鸦工具关于旋转的优化

其关键代码便是经过设置Bitmap中矩阵的视点:

//旋转+缩放
val dstbmp = Bitmap.createBitmap(
    bmp, 0, 0, bmp.width, bmp.height,
    Matrix().apply {
        // 缩放原图
        postScale(0.5f, 0.5f)
        // 向左旋转45度,参数为正则向右旋转
        postRotate(defaultDegrees, bmp.width / 2f, bmp.height / 2f)
    }, true
)
//设置着色器
paint.shader = BitmapShader(
    dstbmp,
    Shader.TileMode.REPEAT,
    Shader.TileMode.REPEAT
)

很明显,只需有视点发生,涂鸦出来后会呈现有缝隙的摆放,中间会呈现很多底色,这并不是咱们想要的作用。但BitmapShader的结构函数咱们并没发现有关于旋转的设置,接下来就只能慢慢研究其间奥义了。

1. 测验创立一个bitmap的xml文件,平铺办法也设置为重复,再经过ImageView显现:

xml文件(test2.xml):
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@mipmap/ic_go_off"
    android:tileMode="repeat"
    android:dither="true"/>
布局办法:
<ImageView
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:layout_centerInParent="true"
    android:rotation="-70"
    android:scaleType="fitXY"
    android:src="@drawable/test2" />

Android:涂鸦工具关于旋转的优化

经过测验发现:是可以完成平铺中间无缝隙的作用的,阐明咱们在设置bitmap旋转那里有问题。既然在bitmap上动刀不行,那就再次转化注意力到BitmapShader。

2.BitmapShader中躲藏的mLocalMatrix

因为之前仔细看过BitmapShader中的办法和变量,并未发现猫腻,所以刚开始的方案是在创立BitmapShader时尝试看有没有设置旋转的办法,一试还真有,apply中设置视点:

 paint.shader = BitmapShader(
                dstbmp,
                Shader.TileMode.REPEAT,
                Shader.TileMode.REPEAT
            )
            ).apply {
                rotation=degrees
            }

激动的运行起应用后发现确实没有缝隙了,但只需修改画笔视点,之前的视点会变成当时的视点,明显又不是咱们想要的结果。呈现这样的问题起初以为是每只画笔视点保存的问题,后来测验发现:这是上面代码的问题!

rotation=degrees,这个特点设置跟踪一波发现,原来设置的是View的特点,并不是BitmapShader内部特点。所以只需修改了视点,即使画笔保存了对应视点,最终重绘后都是当时设置的视点。

Android:涂鸦工具关于旋转的优化

此时的作用其实已经相当挨近需求了,看来还得是在BitmapShader中动刀。所以又仔细进入BitmapShader,它承继于Shader,所以再看看Shader:

Android:涂鸦工具关于旋转的优化

好家伙,又看到了矩阵!!!之前设置bitmap的时候有用到过,接着还发现有个揭露的setLocalMatrix(Nullable Matrix localM)的办法,总算是大出一口气。

至此每换一只笔视点也不会跟着改动,涂鸦东西算是完美完成了。

我是一个喜爱Jay、Vae的安卓开发者,喜欢结交五湖四海的兄弟姐妹,欢迎我们到沸点来点歌!