Android自定义View炫酷的剑气加载效果实现
看到一个非常炫的加载效果,文章中大佬是通过 css 实现的,今天咱们来用 Android 的自定义 View 来实现一下这是理想中的效果
这是现实的效果
不能说百分百还原吧,只能说精髓
开工
这个效果仔细看,就是有三个类似月牙形状的元素进行循环转动,我们只需要拆解出一个月牙来做效果即可,最后再将三个月牙组合起来就可以达到最终效果了 月牙
先画一个圆
再画个大一丢丢的
再把这个大圆往右移一丢丢,裁切出来的左右两个都是月牙
实现
老司机应该一眼就能看出来,只要在两次绘制圆中只要使用一个叠加模式就能达到裁剪出一个月牙的效果了。那么是什么模式呢,我去搜索一下~
当当当,就是它~ PorterDuff.Mode.DST_OUT
相关源码如下: canvas.drawColor(Color.BLACK) val layerId = canvas.saveLayer(0f, 0f, width.toFloat(), height.toFloat(), null, Canvas.ALL_SAVE_FLAG) val halfW = width / 2f val halfH = height / 2f val radius = min(width, height) / 3f paint.color = Color.WHITE canvas.drawCircle(halfW, halfH, radius, paint) paint.color = Color.BLACK paint.xfermode = xfermode canvas.drawCircle(halfW, halfH - 0.05f * radius, radius * 1.01f, paint) canvas.restoreToCount(layerId) paint.xfermode = null
运行起来我们就得到了一弯浅浅的月牙
立体空间变化
我们可以看出效果图里的每一个月牙并不是那么方正,而是有一定的空间旋转,再加上绕着 Z 轴旋转。这里需要利用 Camera 与 Matrix 实现3D效果(相关知识可参考:https://www.jianshu.com/p/34e0fe5f9e31)
我们先给它在 x 轴转 35 度 ,y 轴转 -45 度(参考开头文章的数据)rotateMatrix.reset() camera.save() camera.rotateX(35F) camera.rotateY(-45F) camera.getMatrix(rotateMatrix) camera.restore() val halfW = width / 2f val halfH = height / 2f rotateMatrix.preTranslate(-halfW, -halfH) rotateMatrix.postTranslate(halfW, halfH) canvas.concat(rotateMatrix)
运行效果如下,从普通的月牙变成了帅气的剑气
动画
我们上面做了固定角度的 X, Y 轴的旋转,这个时候我们只要加上一个 Z 轴的调转动画,这个剑气就动起来了。 val anim = ValueAnimator.ofFloat(0f, -360f).apply { // Z 轴是逆时针,取负数,得到顺时针的旋转 interpolator = null repeatCount = RotateAnimation.INFINITE duration = 1000 addUpdateListener { invalidate() } } // 省略前面已写代码... camera.rotateZ(anim.animatedValue as Float) // 在合适的地方启动动画 view.anim.start()
运行效果:
举一反三
有了这一个完整的剑气旋转,只要再来两道,组成完整的剑气加载就可以了。
将前面的代码抽象成一个方法private fun drawSword(canvas: Canvas, rotateX: Float, rotateY: Float) { val layerId = canvas.saveLayer(0f, 0f, width.toFloat(), height.toFloat(), null, Canvas.ALL_SAVE_FLAG) rotateMatrix.reset() camera.save() camera.rotateX(rotateX) camera.rotateY(rotateY) camera.rotateZ(anim.animatedValue as Float) camera.getMatrix(rotateMatrix) camera.restore() val halfW = width / 2f val halfH = height / 2f rotateMatrix.preTranslate(-halfW, -halfH) rotateMatrix.postTranslate(halfW, halfH) canvas.concat(rotateMatrix) canvas.drawCircle(halfW, halfH, radius, paint) paint.xfermode = xfermode canvas.drawCircle(halfW, halfH - 0.05f * radius, radius * 1.01f, paint) canvas.restoreToCount(layerId) paint.xfermode = null }
绘制三道剑气verride fun onDraw(canvas: Canvas) { super.onDraw(canvas) canvas.drawColor(Color.BLACK) // 偏移角度来源开关文章 drawSword(canvas,35f, -45f) drawSword(canvas,50f, 10f) drawSword(canvas,35f, 55f) }
跑起来看看
Emm... 这动画也太整齐划一了
错开三道剑气
在 Z 轴旋转上,我们给每道剑气一个初始值的旋转值(360/3 = 120),这样它们就能均匀的错开了。
相关实现如下: private fun drawSword(canvas: Canvas, rotateX: Float, rotateY: Float, startValue: Float) { //... 省略未改动代码 camera.rotateZ(anim.animatedValue as Float + startValue) //... 省略未改动代码 } override fun onDraw(canvas: Canvas) { super.onDraw(canvas) canvas.drawColor(Color.BLACK) drawSword(canvas,35f, -45f, 0f) drawSword(canvas,50f, 10f, 120f) drawSword(canvas,35f, 55f, 240f) }
最终效果
和我们开头预期的效果图一模一样
完整代码:https://github.com/samwangds/DemoFactory/blob/master/app/src/main/java/demo/com/sam/demofactory/view/SwordLoadingView.kt 最后
在这里还分享一份由大佬亲自收录整理的学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料
这些都是我现在闲暇时还会反复翻阅的精品资料。里面对近几年的大厂面试高频知识点都有详细的讲解。相信可以有效地帮助大家掌握知识、理解原理,帮助大家在未来取得一份不错的答卷。
当然,你也可以拿去查漏补缺,提升自身的竞争力。
真心希望可以帮助到大家,Android路漫漫,共勉!
如果你有需要的话,只需私信我【进阶】即可获取
上海车展5G备受关注,高通携手众多车厂,共同打造智能汽车这几天,上海国际车展赚足了眼球,成为中国汽车爱好者的关注热点。本届车展有一个很明显的趋势,很多迹象已经表明,整体汽车工业的变化拐点已经到来,下一阶段是5GAI等科技深度绑定汽车工业
圈粉国内外用户,FindX3系列靠的是这些独特气质2021年第一季度已经过去,这一时期全球智能手机市场又悄然发生了变化。从StrategyAnalytics的最新研究数据来看,该时期全球智能手机出货量为3。4亿部,其中OPPO稳居
以后将无工可打?这个国产品牌的智能工厂厉害了一个小黑屋里,没有一个人,却能源源不断的生产出高端产品,这里就是小米的黑灯智能工厂。作为小米最顶尖蕴含科技力量最多的地方,小米智能黑灯工厂设计年产能可以达到百万级,不仅仅可以作为高
三翼鸟全民开麦唱,智慧全场景圈粉成主角把家庭变成K歌房,拿起话筒想唱就唱,是很多唱歌爱好者的梦想。而现在,三翼鸟体验店让用户的这个梦想变成了现实。5月10日17日期间,在青岛市辽阳西路富尔玛的三翼鸟体验店,三翼鸟全民开
追剧或娱乐,高品价比华为智慧屏SE系列统统满足每逢周末假期,有的小伙伴特别喜欢出门逛街旅游之类。而也有许多小伙伴,趁着好不容易的休息时间,放空自己,宅家回血。不过,宅在家里也只是一觉睡到自然醒,特别容易无聊,而且还会觉得更累。
父母不会用智能机?只需一招,教你简化智能机有一种孝顺,是带父母跟上这个信息时代父母年纪大了买个智能手机让他们也感受一下网络世界上网看看花花世界可是他们却不会用?眼睛花了,看不清手机上的字了?跟着小V,一招教你简化智能机让父
新能源综合知识(第三季)美天优理赔汽车保险理赔公众号1接触式电池特点是简单效率高,但是充电电流较小,其通常充电时间是(C)A13hB35hC58hD811h2耶律勇在公路上看到一辆纯电动汽车,因为他看到车
灯具设计千奇百怪的创意灯分享灯的出现让人类征服了黑夜,到现在它已经变成了人类生活中不可或缺的一部分。在现如今在这个追求新颖创新的时代里,灯具已经不仅仅只是用作照明,它同样可以设计的很不一样。一Othello这
外卖骑手送餐途中出交通意外,算工伤吗?国家相关文件出台了假如有这么一份工作你每天的工作时间从上午12点到晚上12点,早上还要参加公司晨会,工作要统一穿工作服,遵守公司各项规章制度,工作内容为这家公司承包的外卖业务送货,每月工资20日固定
在水杯里看鱼儿飞上天,寻觅自由勇敢的灵魂边界为何不可以打破?是谁说天性不可以挣脱?开花不结果又有什么?是鱼就一定要游泳?中国传统文化里,鱼一直都是带来好运和招财进宝的象征,而飞鱼,为传统锦鲤形象赋予新的生命力。艾优旗下品
中国飞天式浪漫,香薰竟然上太空了从风云海洋北斗天问悟空墨子,再到天宫嫦娥玉兔鹊桥神舟天舟,浪漫的中华民族神话故事传递者华夏儿女的共同夙愿上天!一般人是没法实现了,除非是宇航员或马斯克,但最近一个硬核科技企业做到了