java粒子特效教程_教你用Canvas实现简单粒子动画
使用场景:
o SplashActivity?
o …
o 好像真的不多 = =
效果看着还可以,有那么几个点一定需要知道实现。
o 粒子效果
o 几个坐标的计算方式
o 文字从左往右像素级显示
只要想清楚以上三点的实现过程,这个动画就没问题了。
一、粒子效果
简单四个字概括:二维数组。
[代码]java代码:1
2
3
4
5private final int ROW_NUM = 10;
private final int COLUMN_NUM = 10;
private Particle[][] mParticles = new Particle[ROW_NUM][COLUMN_NUM];
private Particle[][] mMinParticles = new Particle[ROW_NUM][COLUMN_NUM];
为何会有两个二维数组?
因为粒子有个从大到小的过程,那么就需要有个起始particle[][]和一个终点particle[][]咯,来看看Particle的结构:
[代码]java代码:01
02
03
04
05
06
07
08
09
10
11
12
13
14public class Particle {
public float x;
public float y;
public float radius;
public Particle() {
}
public Particle(float x, float y, float radius) {
this.x = x;
this.y = y;
this.radius = radius;
}
}
由x坐标,y坐标和半径构成,那么Particle究竟由起点到终点经过了怎样的转换呢?来看看TypeEvaluator的实现:
[代码]java代码:01
02
03
04
05
06
07
08
09
10public class LineEvaluator implements TypeEvaluator {
@Override
public Particle evaluate(float fraction, Particle startValue, Particle endValue) {
Particle particle = new Particle();
particle.x = startValue.x + (endValue.x - startValue.x) * fraction;
particle.y = startValue.y + (endValue.y - startValue.y) * fraction;
particle.radius = startValue.radius + (endValue.radius - startValue.radius) * fraction;
return particle;
}
}
就是根据插值进行了一个简单的线性计算。
这样一来由二维数组构成的粒子实现方案已经有了,那么问题来了,动画中那种类似书本翻页的效果是如何实现的呢?
我用了一个很巧妙的方法,那就是对每个粒子设置的Duration都不同。
[代码]java代码:01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18for (int i = 0; i < ROW_NUM; i++) {
for (int j = 0; j < COLUMN_NUM; j++) {
final int tempI = i;
final int tempJ = j;
ValueAnimator animator = ValueAnimator.ofObject(new LineEvaluator(), mParticles[i][j], mMinParticles[i][j]);
animator.setDuration(1000 + 20 * i + 30 * j);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mParticles[tempI][tempJ] = (Particle) animation.getAnimatedValue();
if (tempI == ROW_NUM - 1 && tempJ == COLUMN_NUM - 1) {
invalidate();
}
}
});
animList.add(animator);
}
}
关键代码:
[代码]java代码:1animator.setDuration(1000 + 20 * i + 30 * j);
这样一来,所有粒子同一时间开始,动画的duration不同,那自然类似翻书效果就达到了。
细心的朋友看出来了,我还对粒子做了渐变处理。
[代码]java代码:01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21Shader linearGradient = new LinearGradient(mWidth / 2 - getTextWidth(mParticleText, mCirclePaint) / 2f,
mHeight / 2 - getTextHeight(mParticleText, mCirclePaint) / 2,
mWidth / 2 - getTextWidth(mParticleText, mCirclePaint) / 2,
mHeight / 2 + getTextHeight(mParticleText, mCirclePaint) / 2,
new int[]{mParticleColor, Color.argb(120, getR(mParticleColor), getG(mParticleColor), getB(mParticleColor))}, null, Shader.TileMode.CLAMP);
mCirclePaint.setShader(linearGradient);
private int getR(int color) {
int r = (color >> 16) & 0xFF;
return r;
}
private int getG(int color) {
int g = (color >> 8) & 0xFF;
return g;
}
private int getB(int color) {
int b = color & 0xFF;
return b;
}
二、几个坐标的计算方式
其实做任何动画这一点都尤为重要,整个Canvas都是你的,coordinate那一定得算好。在这个动画里我觉得比较复杂坐标计算的就是最后那个HostText的位移和ParticleText的位移,为什么这么说呢?因为两个Text的textSize不同,但是最终又要保证他俩动画后保持居中。
我用的方案其实很简单,只要精准计算HostText和ParticleText的x坐标就好了,而不用去计算他们各自的偏移量这么复杂。
[代码]java代码:1
2
3
4
5ValueAnimator particleTextXAnim = ValueAnimator.ofFloat(mStartMinP.x + dip2px(4),
mWidth / 2 - (getTextWidth(mHostText, mHostTextPaint) + getTextWidth(mParticleText, mParticleTextPaint)) / 2 + getTextWidth(mHostText, mHostTextPaint));
ValueAnimator hostTextXAnim = ValueAnimator.ofFloat(mStartMinP.x,
mWidth / 2 - (getTextWidth(mHostText, mHostTextPaint) + getTextWidth(mParticleText, mParticleTextPaint) + dip2px(20)) / 2);
这两个属性动画的值域很重,各位看官可以仔细看下。
三、文字从左往右像素级显示
这也是此次动画需要解决的最后一个问题,各位朋友可以自己想想咋整。
我这里也是用了一个很巧妙的方式,那就是先drawText,再drawRect进行覆盖,drawRect通过属性动画逐步变小,这样drawText就可以达到像素级的移动效果了。
[代码]java代码:1
2canvas.drawText(mHostText, mHostTextX, mHeight / 2 + getTextHeight(mHostText, mHostBgPaint) / 2, mHostBgPaint);
canvas.drawRect(mHostTextX + mHostRectWidth, mHeight / 2 - getTextHeight(mHostText, mHostBgPaint) / 1.2f, mHostTextX + getTextWidth(mHostText, mHostTextPaint), mHeight / 2 + getTextHeight(mHostText, mHostBgPaint) / 1.2f, mHostTextPaint);
mHostRectWidth是通过属性动画变化的,范围就是0到整个hostText的长度咯。
[代码]java代码:1ValueAnimator animator = ValueAnimator.ofFloat(0, getTextWidth(mHostText, mHostTextPaint));
以上就是实现此次粒子动画的关键步骤,其余的相信各位同学看看代码一会就能领悟了。
项目地址:
推荐:
java粒子特效教程_教你用Canvas实现简单粒子动画相关推荐
- java粒子特效教程_使用particles.js实现网页背景粒子特效
得知途径 B3log提供了两套博客系统,一个是用Java开发的,叫做Solo,我也是在网上搜索Java博客系统时发现了它,之后才了解了B3log:还有一个是用Go语言开发的,叫做Pipe.其中Solo ...
- android 矢量粒子动画,android 手摸手教你用 Canvas 实现简单粒子动画
Article Attributes name format description 中文解释 pv_host_text string set left host text 设置左边主文案 pv_ho ...
- python新手入门教程思路-Python新手入门教程_教你怎么用Python做数据分析
Python新手入门教程_教你怎么用Python做数据分析 跟大家讲了这么多期的Python教程,有小伙伴在学Python新手教程的时候说学Python比较复杂的地方就是资料太多了,比较复杂.很多网上 ...
- java制作音乐播放器教程_教你轻松制作java音乐播放器
一.音乐播放器的实现原理 Javase的多媒体功能很弱,所以有一个专门处理多媒体的插件叫JMF,JMF提供的模型可大致分为七类 * 数据源(Data source) * 截取设备(Capture De ...
- java游戏修改文件_教你使用JavaMagic来改JAVA手机游戏软件键值和改全屏
教你使用JavaMagic来改JAVA手机游戏软件键值和改全屏 作者:admin教程来源:百科原创点击数:6688 更新时间:2009-6-4 JavaMagic是一款为解决手机Java游戏某些兼容性 ...
- java web swing 教程_好程序员Java教程解读什么是swing
原标题:好程序员Java教程解读什么是swing 好程序员Java教程解读什么是swing,swing是java GUI应用程序,也就是java做的桌面应用.运行swing程序要求用户电脑上有java ...
- arm搭建云手机教程_教你从0开始部署阿里云服务器,阿里云服务器搭建网站教程...
教你从0开始部署阿里云服务器,阿里云服务器部署网站的办法,阿里云搭建项目的办法,阿里云服务器搭建网站教程 1.购买 登录官网点击下面链接: 企业上云甄选partner.aliyun.com 查看云服 ...
- python头像教程_教你用 Python 生成一张全体微信好友的头像墙
|前言 还记得前阵子这篇文章么: 『又来瞎鼓捣』微信群友相隔远?那也一键生成全家福 ,用来给群好友生成一张头像全家福的. 搞完那个之后我就在想,要不写一个微信好友全家福的吧?我微信里有一千多号人,生成 ...
- QQ复读机java脚本怎么用_教你制作一个QQ复读机机器人【1】接收消息
随便说点 作为一个非常不合格的代码搬运工,一直写代码这方面都属于咸鱼级别. 但是咸鱼也是有梦想的,每天都在想着各种骚操作. 虽然不能像电影或者游戏里那样,各种神通广大,但是写一些简单小功能,还是很轻松 ...
最新文章
- 用好idea这几款插件,可以帮你少写30%的代码!
- LeetCode算法题12:递归和回溯-字符串中的回溯问题
- 如何在Google文档中的图片周围换行
- CF623E Transforming Sequence(多项式/倍增fft/动态规划)
- Primefaces Spring和Hibernate集成示例教程
- SpringCloud系列-Feign的基本应用
- android 偏好设置,SharedPreferences保存、显示用户偏好设置
- sql server实用工具sql prompt的安装与注册
- gc java root_深入理解Java中的Garbage Collection
- 网管日志-06.07.13
- Android 网络学习之获取服务器的图片
- 【CC2530入门教程-01】CC2530微控制器开发入门基础
- echarts重写图例点击事件
- Bootstrap3部分理解
- 祭 事 本
- c语言程序设计第二版(张磊),C语言程序设计教程(第2版) 教学课件 张磊 第9章 文件程序设计.pdf...
- p二、使用 docker-compose 安装 Prometheus+Alertmanager+Grafana
- 震惊!英伟达 4 月的发布会全部是合成的
- 高精度三维扫描仪用于医疗器械注塑件尺寸公差测量
- python中计算整商的运算符_常见的促进安眠的食物有小米、牛奶、糖水、莲子、香蕉、蜂蜜、莴苣、葵花籽、核桃、桂圆、红枣、桑葚和鲜藕等。...
热门文章
- 智慧厕所解决方案优势
- H.264和H.265
- Android获取本机电话号码及运营商信息
- JAVA第七章-- 面向对象核心技术总结
- 前端工作一年半,离职了!!!
- 计算机二级考试答题无法启动ppt,计算机二级考试MSOffice考精彩试题库ppt操作题附问题详解...
- python 打开csv文件,报错'utf-8' codec can't decode bytes in position 16: invalid continuation byte
- 总线控制 总线基本概念
- 8g内存一般占用多少_8g存储空间win10开机占用多少
- 拯救你寻找资料之苦!浏览器隐藏在角落里的三个神奇搜索技巧,让你叹为观止!