- 我们想要使另一个物体绕着多边形运动。这个当然也可以通过
AVD实现。但它还是需要很多事前工作去计算想生成的轨迹。 - 我们想把绕多边形物体的运动进度与多边形的显示分离开来,独立控制。
因此我选择用自定义 Drawable 来实现,其中包含多个 Path 对象。Path 是对图形形状的基本描绘(AVD 中实际也使用了 Path!),而且 Android Canvas 的 API也是借助 Path 来生成各种有趣的效果。在实现一些效果之前,我想强烈推荐 Romain Guy 这篇写得很好的文章,里面展示的很多技巧就是我在本文所用到的:
Android Recipe #4, path tracing
极坐标系
当定义 2d 形状的时候,我们通常在笛卡尔坐标系 (x,y) 中进行定义。通过指定 x 轴和 y 轴上离原点的距离,来定义图形形状。而另一个我们可选用的极坐标系,则是定义离原点的角度和半径长度。

笛卡尔坐标系(左边)vs 极坐标系(右边)
我们可以通过这两条公式进行极坐标系和笛卡尔坐标系之间的转换:
val x = radius * Math.cos(angle);
val y = radius * Math.sin(angle);
我强烈推荐读下面这篇文章以了解更多关于极坐标系的内容:
为了能生成规则的多边形(例如每个内角的度数相同),极坐标系能起到非常大的作用。为了生成想要的边数,你可以通过计算求出对应的度数(因为内角度数和是 360 度),然后借助同一个半径,再利用这个度数的多个倍数关系去描绘出每个点。 你可以用图形 API 将这些点坐标转化为笛卡尔坐标。下面是一个通过给定的边数和半径生成多边形 Path 的函数:
fun createPath(sides: Int, radius: Float): Path {
val path = Path()
val angle = 2.0 * Math.PI / sides
path.moveTo(
cx + (radius * Math.cos(0.0)).toFloat(),
cy + (radius * Math.sin(0.0)).toFloat())
for (i in 1 until sides) {
path.lineTo(
cx + (radius * Math.cos(angle * i)).toFloat(),
cy + (radius * Math.sin(angle * i)).toFloat())
}
path.close()
return path
}

所以为了生成想要的多边形组合,我们创建了一个有不同边数、半径和颜色的多边形 list 集合。Polygon 是一个持有这些信息和计算相应 Path 的类:
private val polygons = listOf(
Polygon(sides = 3, radius = 45f, color = 0xffe84c65.toInt()),
Polygon(sides = 4, radius = 53f, color = 0xffe79442.toInt()),
Polygon(sides = 5, radius = 64f, color = 0xffefefbb.toInt()),
…
)

有效的 path 绘制
绘制一个 Path 只需简单地调用 Canvas.drawPath(path, paint) 但是 Paint 类的参数支持 PathEffect,借助这个我们可以去更改 path 被绘制时的效果。 例如我们可以使用 CornerPathEffect 去把我们的多边形的各个角圆滑化处理或者是用 DashPathEffect 去分段地画出 Path(虚线效果,译者注)(关于这个技巧的更多细节,请阅读前面提到的那篇 Path tracing 文章 ):

另外一种画分段 path 的方法是使用 PathMeasure#getSegment,它能复制 path 的某一部分到一个新的 Path 对象。我是直接使用了能画出虚线的方法,就像自己改变了绘制的时间间隔和分段绘制实现的效果一样。
通过暴露这些控制 drawable 特性的参数,我们可以很容易地生成动画:
object PROGRESS : FloatProperty(“progress”) {
override fun setValue(pld: PolygonLapsDrawable, progress: Float) {
pld.progress = progress
}
override fun get(pld: PolygonLapsDrawable) = pld.progress
}
…
ObjectAnimator.ofFloat(polygonLaps, PROGRESS, 0f, 1f).apply {
duration = 4000L
interpolator = LinearInterpolator()
repeatCount = INFINITE
repeatMode = RESTART
}.start()
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。




由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)

总结
最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
相信它会给大家带来很多收获:


上述【高清技术脑图】以及【配套的架构技术PDF】可以关注我免费获取
360)]
上述【高清技术脑图】以及【配套的架构技术PDF】可以关注我免费获取
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

1917

被折叠的 条评论
为什么被折叠?



