android 水波纹扩散动画,[Android]多层波纹扩散动画——自定义View绘制
之前整理过一些属性动画的基本操作,这一段时间的动画相关需求都安然度过了。直到这次……
一、另一种动画需求
多数交互中的动画都是让单个页面元素动起来,这种就很适合用属性动画实现。但是对于 多个元素、非页面内元素 的动画需求,就不方便用View+属性动画实现了。
举个例子,也就是这次做的:
波纹效果需要同时绘制 多个 同心圆,而且这些圆 不是页面内的元素,未触发之前不需要显示。如果用属性动画实现,至少需要在xml布局文件中添加多个ImageView画圆,效率低还不易复用。
二、WaveView分析
使用自定义View绘制动画的主要思路是这样的:
分解动画成帧,考虑如何在onDraw中绘制每一帧
提取出绘制所需参数,分为随时间变化和不可变两种,不可变参数可以暴露出去(setter方法/attribute设置)
总结随时间变化的参数变化规律,实现时间轴
按需求提供出播放,暂停,停止,重置等等方法
按照这个思路,一步步实现一下WaveView吧。
第一步:
在onDraw中画圆需要用到canvas.drawCircle方法,四个参数:圆心x、y坐标,半径和Paint。WaveView绘制的每一帧都是圆,区别是圆的半径,数量,透明度。还需要设置圆的最小半径和最大半径,以及扩散的时候两个圆的半径差。
每次绘制只需要把所有的圆画出来:
第二步:
扩散过程中随时间变化的参数只有半径和透明度。圆的数量,最小最大半径和半径差则是不可变参数。所有的都加了默认值,防止
第三步:
最艰难的一步,时间轴。我们需要一个定时触发的机制去改变mWaveList中的每一个值,还要同时修改paint的alpha值。这个变量嘛,还是越少越方便,波纹的效果是半径越大alpha越小,只要控制半径变化就可以计算出alpha。然后便是循环的问题,当波纹半径大于最大半径波纹就会消失,此时便可循环使用,再从最小半径扩散一次。
我这里的时间轴用了CountDownTimer,应该不是一种很好的选择,只是个人习惯写起来顺手了…
第四步:
最后这个就简单了,直接控制CountDownTimer的start和cancel就可以了。
三、再完善一下?
内部功能已经实现了,还要提取参数的设置方法,方便其他地方使用呀。java中需要添加setter/getter方法,用模版代码生成就好,kotlin的话直接把需要暴露的field改为public即可。
如果需要在xml布局文件中设置默认参数,还需要添加对应的attribute,现在这样已经够用了,我就不加了
android 水波纹扩散动画,[Android]多层波纹扩散动画——自定义View绘制相关推荐
- android覆盖扩散动画,[Android]多层波纹扩散动画——自定义View绘制
之前整理过一些属性动画的基本操作,这一段时间的动画相关需求都安然度过了.直到这次-- 一.另一种动画需求 多数交互中的动画都是让单个页面元素动起来,这种就很适合用属性动画实现.但是对于 多个元素.非页 ...
- Android 常见界面控件(ListView、RecyclerView、自定义View篇)
Android 常见界面控件(ListView.RecyclerView.自定义View篇) 目录 3.3 ListView的使用 3.3.1 ListView控件的简单使用 3.3.2 常用数据适配 ...
- Android 自定义View绘制电池图标
/*** @anthor GrainRain* @funcation 自定义View绘制电池* @date 2019/8/27*/ public class DrawBatteryView exten ...
- android自定义弧度按钮,Android 自定义View 绘制六边形设置按钮
今天逛酷安的时候,发现酷安的设置按钮(截图的右上角),是一个六边形 + 中心圆的图标,所以又是一个自定义View练习对象了.画圆很简单,知道半径即可,而重点就在画出六边形. 酷安截图.png 最终效果 ...
- Android自定义View绘制闹钟
Android自定义View绘制闹钟 本文简单实现了一个闹钟,扩展View,Canvas绘制 效果如下: 代码如下: package com.gaofeng.mobile.clock_demo;imp ...
- Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解
Android绘图机制(二)--自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解 我们要想画好一些炫酷的View,首先我们得知道怎么去画一些基础的图案,比如矩形,圆 ...
- Android Fragment 生命周期及其正确使用(建议使用自定义View替换Fragment)
使用Fragment 官方例子中显示: 例如:一个学生Fragment,需要传入studentId,进行http请求显示,那么setArguments后防止杀掉Fragment后,参数为0,显示不了数 ...
- android 自定义饼图半径不定,【Android】仿支付宝账单统计饼状图的自定义view
仿支付宝统计饼状图的自定义view,如下图: 项目地址:https://github.com/bigeyechou/CustomViewCollection 目录:customviewcollecti ...
- Android自定义View绘制流程
Android视图层次结构简介 在介绍View绘制流程之前,咱们先简单介绍一下Android视图层次结构以及DecorView,因为View的绘制流程的入口和DecorView有着密切的联系. 我们平 ...
最新文章
- Python3 try-except、raise和assert解析
- 程序设计第三次作业附加 代码规范
- 不清楚 spring 的这几个知识点,面试直接挂了!
- linux 输出gc日志,Tomcat输出保存JVM GC日志文件
- English debate for sports motion with notes from PM (feedback included)
- ITK:获取图像中标记区域的统计属性
- ajax返回数据报406,ajax – 406返回JSON对象时出错 – 意外内容
- 听说你对 ES6 class 类还不是很了解
- 如何在Debian 9 / Debian 8上安装MariaDB 10.3
- Kubernetes 部署 Mysql 8.0 数据库(单节点)
- Java多线程学习九:怎样确定线程数量及CPU 核心数和线程数的关系||如何定制自己的线程池
- Python补充之函数
- oracle 数据迁移跑批,Oracle数据库纯数据的导出与导入
- HLSL效果框架-多光源效果
- Matlab中table2array函数使用
- BING搜索引擎技巧
- vue 加headers_(vue.js)axios interceptors 拦截器中添加headers 属性
- sap税码配置_SAP那些事-技巧篇-42-Billing plan预收款税码问题
- python删除第一行_python学习之删除DataFrame某一行/列内容
- Unable to add window android.view.ViewRootImpl$W@c1bf05d -- permission denied for window type 2003