之前整理过一些属性动画的基本操作,这一段时间的动画相关需求都安然度过了。直到这次……

一、另一种动画需求

多数交互中的动画都是让单个页面元素动起来,这种就很适合用属性动画实现。但是对于 多个元素、非页面内元素 的动画需求,就不方便用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绘制相关推荐

  1. android覆盖扩散动画,[Android]多层波纹扩散动画——自定义View绘制

    之前整理过一些属性动画的基本操作,这一段时间的动画相关需求都安然度过了.直到这次-- 一.另一种动画需求 多数交互中的动画都是让单个页面元素动起来,这种就很适合用属性动画实现.但是对于 多个元素.非页 ...

  2. Android 常见界面控件(ListView、RecyclerView、自定义View篇)

    Android 常见界面控件(ListView.RecyclerView.自定义View篇) 目录 3.3 ListView的使用 3.3.1 ListView控件的简单使用 3.3.2 常用数据适配 ...

  3. Android 自定义View绘制电池图标

    /*** @anthor GrainRain* @funcation 自定义View绘制电池* @date 2019/8/27*/ public class DrawBatteryView exten ...

  4. android自定义弧度按钮,Android 自定义View 绘制六边形设置按钮

    今天逛酷安的时候,发现酷安的设置按钮(截图的右上角),是一个六边形 + 中心圆的图标,所以又是一个自定义View练习对象了.画圆很简单,知道半径即可,而重点就在画出六边形. 酷安截图.png 最终效果 ...

  5. Android自定义View绘制闹钟

    Android自定义View绘制闹钟 本文简单实现了一个闹钟,扩展View,Canvas绘制 效果如下: 代码如下: package com.gaofeng.mobile.clock_demo;imp ...

  6. Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解

    Android绘图机制(二)--自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解 我们要想画好一些炫酷的View,首先我们得知道怎么去画一些基础的图案,比如矩形,圆 ...

  7. Android Fragment 生命周期及其正确使用(建议使用自定义View替换Fragment)

    使用Fragment 官方例子中显示: 例如:一个学生Fragment,需要传入studentId,进行http请求显示,那么setArguments后防止杀掉Fragment后,参数为0,显示不了数 ...

  8. android 自定义饼图半径不定,【Android】仿支付宝账单统计饼状图的自定义view

    仿支付宝统计饼状图的自定义view,如下图: 项目地址:https://github.com/bigeyechou/CustomViewCollection 目录:customviewcollecti ...

  9. Android自定义View绘制流程

    Android视图层次结构简介 在介绍View绘制流程之前,咱们先简单介绍一下Android视图层次结构以及DecorView,因为View的绘制流程的入口和DecorView有着密切的联系. 我们平 ...

最新文章

  1. Python3 try-except、raise和assert解析
  2. 程序设计第三次作业附加 代码规范
  3. 不清楚 spring 的这几个知识点,面试直接挂了!
  4. linux 输出gc日志,Tomcat输出保存JVM GC日志文件
  5. English debate for sports motion with notes from PM (feedback included)
  6. ITK:获取图像中标记区域的统计属性
  7. ajax返回数据报406,ajax – 406返回JSON对象时出错 – 意外内容
  8. 听说你对 ES6 class 类还不是很了解
  9. 如何在Debian 9 / Debian 8上安装MariaDB 10.3
  10. Kubernetes 部署 Mysql 8.0 数据库(单节点)
  11. Java多线程学习九:怎样确定线程数量及CPU 核心数和线程数的关系||如何定制自己的线程池
  12. Python补充之函数
  13. oracle 数据迁移跑批,Oracle数据库纯数据的导出与导入
  14. HLSL效果框架-多光源效果
  15. Matlab中table2array函数使用
  16. BING搜索引擎技巧
  17. vue 加headers_(vue.js)axios interceptors 拦截器中添加headers 属性
  18. sap税码配置_SAP那些事-技巧篇-42-Billing plan预收款税码问题
  19. python删除第一行_python学习之删除DataFrame某一行/列内容
  20. Unable to add window android.view.ViewRootImpl$W@c1bf05d -- permission denied for window type 2003

热门文章

  1. 箭头函数与普通函数,以及使用场景
  2. 使用HTML Purifier防止xss攻击
  3. iOS 实战开发课程笔记
  4. 可道云kodexplorer修改小记
  5. 微信小程序(5)——如何制作好看的表格
  6. JAVA POI删除word里面的批注comment
  7. 用C语言来实现扫雷小游戏
  8. 同构网络vs异构网络
  9. 安卓APP证书Android签名证书.keystore文件制作生成
  10. TokenInsight 对话首席——隐私安全计算,价值几何?