我正在参与「启航方案」,这是我参与的第1篇文章。
前段时间比较闲,参与了日新方案更文活动,至今已快三个月了。现在再次提笔,我就来分享下在这之间学习到的新技能,既是记载自己常识的堆集,也希望经过自己的分享可以帮助到我们。
还记得之前曾写过一篇完成一个自定义有限制区域的图例(视点自识别)涂鸦东西类,分为上中下三篇,在最终一篇中介绍到关于涂鸦的旋转功能,这是之前的作用图:
其关键代码便是经过设置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" />
经过测验发现:是可以完成平铺中间无缝隙的作用的,阐明咱们在设置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内部特点。所以只需修改了视点,即使画笔保存了对应视点,最终重绘后都是当时设置的视点。
此时的作用其实已经相当挨近需求了,看来还得是在BitmapShader中动刀。所以又仔细进入BitmapShader,它承继于Shader,所以再看看Shader:
好家伙,又看到了矩阵!!!之前设置bitmap的时候有用到过,接着还发现有个揭露的setLocalMatrix(Nullable Matrix localM)的办法,总算是大出一口气。
至此每换一只笔视点也不会跟着改动,涂鸦东西算是完美完成了。
我是一个喜爱Jay、Vae的安卓开发者,喜欢结交五湖四海的兄弟姐妹,欢迎我们到沸点来点歌!