本文参考
https://www.jianshu.com/p/fea4d1f6512a

概述

近期碰到曲线动画的实现问题,写本文记录下。

动画类似“剑与远征”游戏的金币动画,动画路径如下图:

思路

  1. 通过贝塞尔曲线计算出x和y的位置(各个点的位置需要自己微调)
    (此部分内容参考此文:https://www.jianshu.com/p/fea4d1f6512a)
  2. 通过ValueAnimator来实现动画

demo如下:

注意:
此demo使用到了屏幕的宽高,因此如果要demo显示正常,需要把状态栏显示透明,把acitionbar去掉。

源码

MainActivity.java

public class MainActivity extends AppCompatActivity {//uiprivate Button btnOne;private Button btnTwo;private Button btnAnim;//dataprivate int screenHeight;private int screenWidth;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//设置透明状态栏setContentView(R.layout.activity_main);screenHeight=getResources().getDisplayMetrics().heightPixels;screenWidth=getResources().getDisplayMetrics().widthPixels;initViews();}private void initViews() {btnOne = findViewById(R.id.btn_one);btnTwo = findViewById(R.id.btn_two);btnAnim = findViewById(R.id.btn_anim);final ValueAnimator valueAnimator=new ValueAnimator();valueAnimator.setDuration(2000);valueAnimator.setObjectValues(new PointF(0, 0));valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {PointF point = (PointF) animation.getAnimatedValue();btnAnim.setX(point.x);btnAnim.setY(point.y);}});btnOne.setOnClickListener(new View.OnClickListener() {@Override public void onClick(View v) {valueAnimator.setEvaluator(new TypeEvaluator() {@Override public Object evaluate(float fraction, Object startValue, Object endValue) {return BezierUtil.calculateBezierPointForQuadratic(fraction,new PointF(btnAnim.getLeft(), btnAnim.getTop()),new PointF(screenWidth, screenHeight/2),new PointF(btnAnim.getLeft(), screenHeight));}});valueAnimator.start();}});btnTwo.setOnClickListener(new View.OnClickListener() {@Override public void onClick(View v) {valueAnimator.setEvaluator(new TypeEvaluator() {@Override public Object evaluate(float fraction, Object startValue, Object endValue) {return BezierUtil.calculateBezierPointForCubic(fraction,new PointF(btnAnim.getLeft(), btnAnim.getTop()),new PointF(screenWidth, screenHeight/3),new PointF(0, screenHeight/3*2),new PointF(btnAnim.getLeft(), screenHeight));}});valueAnimator.start();}});}
}

BezierUtil.java

public class BezierUtil {/*** B(t) = (1 - t)^2 * P0 + 2t * (1 - t) * P1 + t^2 * P2, t ∈ [0,1]** @param t 曲线长度比例* @param p0 起始点* @param p1 控制点* @param p2 终止点* @return t对应的点*/public static PointF calculateBezierPointForQuadratic(float t, PointF p0, PointF p1, PointF p2) {PointF point = new PointF();float temp = 1 - t;point.x = temp * temp * p0.x + 2 * t * temp * p1.x + t * t * p2.x;point.y = temp * temp * p0.y + 2 * t * temp * p1.y + t * t * p2.y;return point;}/*** B(t) = P0 * (1-t)^3 + 3 * P1 * t * (1-t)^2 + 3 * P2 * t^2 * (1-t) + P3 * t^3, t ∈ [0,1]** @param t 曲线长度比例* @param p0 起始点* @param p1 控制点1* @param p2 控制点2* @param p3 终止点* @return t对应的点*/public static PointF calculateBezierPointForCubic(float t, PointF p0, PointF p1, PointF p2,PointF p3) {PointF point = new PointF();float temp = 1 - t;point.x = p0.x * temp * temp * temp+ 3 * p1.x * t * temp * temp+ 3 * p2.x * t * t * temp+ p3.x * t * t * t;point.y = p0.y * temp * temp * temp+ 3 * p1.y * t * temp * temp+ 3 * p2.y * t * t * temp+ p3.y * t * t * t;return point;}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_one"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="二阶贝塞尔曲线"/><Buttonandroid:id="@+id/btn_two"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="三阶贝塞尔曲线"/><Buttonandroid:id="@+id/btn_anim"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="Anim"/>
</LinearLayout>

Android实现 曲线路径动画相关推荐

  1. android动画框架,GitHub - azhengyongqin/CustomAnimationFramework: Android自定义曲线路径动画框架...

    Android自定义曲线路径动画框架 最近在一个项目中需要一个像QQ打开个人爱好那样的动画效果如下图: 可以看出每个小球都是以顺时针旋转出来的,说明像这样的曲线动画用Android中自带的平移动画是很 ...

  2. 【SwiftUI模块】0008、SwiftUI-自定义启动闪屏动画-App启动闪屏曲线路径动画

    SwiftUI小功能模块系列 0001.SwiftUI自定义Tabbar动画效果 0002.SwiftUI自定义3D动画导航抽屉效果 0003.SwiftUI搭建瀑布流-交错网格-效果 0004.Sw ...

  3. Android 贝塞尔曲线解析

    相信很多同学都知道"贝塞尔曲线"这个词,我们在很多地方都能经常看到.利用"贝塞尔曲线"可以做出很多好看的UI效果,本篇博客就让我们一起学习"贝塞尔曲线 ...

  4. android贝塞尔曲线实例,android中贝塞尔曲线的应用示例

    前言: 贝塞尔曲线又称贝兹曲线,它的主要意义在于无论是直线或曲线都能在数学上予以描述.最初由保罗·德卡斯特里奥(Paul de Casteljau)于1959年运用德卡斯特里奥演算法开发(de Cas ...

  5. html5 路径运动,探秘神奇的运动路径动画 Motion Path

    CSS 中有一个非常有意思的模块 -- CSS Motion Path Module Level 1,翻译过来也就是运动路径.本文将对 motion path 一探究竟,通过本文,你可以了解到:什么是 ...

  6. android svg路径动画,五、Android SVG动画

    SVG的全称是Scalable Vector Graphics(可缩放矢量图形),它不会因为图像放大而失真,且占用内存小,同时搭配Path动画,能够实现一些意想不到的效果. Android中的SVG图 ...

  7. Android自定义控件开发入门与实战(6)路径动画,android脚本开发工具

    前面几章所讲的内容其实都只是比较普通.简单的动画,这章开始学习较难.较为有深度.也比较可以实现更加炫酷效果的动画,通过PathMeasure和SVG动画来实现. PathMeasure实现路径动画 P ...

  8. android波浪动画简书,Android贝塞尔曲线————波浪效果(大波浪)

    Hello大家好,很高兴又一次与大家见面,今天是农历丁酉鸡年(大年初四),现在跟大家拜年有点晚,算是拜晚年,祝大家晚年幸福. 这么快大伙都到了晚年了,Android贝塞尔曲线我也准备以一个大波浪来结束 ...

  9. android文字轨迹动画,文字转化为路径动画 TextPathView

    介绍 大家新年快乐,TextPathView是一个把文字转化为路径动画然后展现出来的自定义控件.效果如上图: 使用 主要的使用流程就是输入文字,然后设置一些动画的属性,还有画笔特效,最后启动就行了. ...

最新文章

  1. UITextField中文搜索
  2. 友元函数 友元类 友元成员函数
  3. 最强动画制作人书包_声优访谈丨恋与制作人动画中配声优访谈——夏磊
  4. 用计算机录制声音让音质更好,电脑有什么好用的录音软件吗
  5. 计算机视觉与机器视觉的区别和联系
  6. 实训报告html前端开发,web前端开发实习报告比你想象中简单
  7. java囧囧西游之大闹天宫下载_最新囧囧西游之大闹天宫榜单下载_九游
  8. 亲自体验跑跑卡丁车2010年魔改单机版(附安装包)
  9. crt计算机显示器,crt显示器最高分辨率_crt显示器最高刷新率
  10. PSP Skype 使用国内卡
  11. 类型数组HTML5 中的新数组
  12. Buffon投针问题
  13. 多态父类引用指向子类对象时,如何调用子类的独有方法?
  14. [文摘20110220]会理财胜过高薪水
  15. 2017.10.27涩会题大乱斗部分题解
  16. 架构就是bull shit
  17. Null value appeared in non-nullable field java.lang.NullPointerException
  18. 从苏宁电器到卡巴斯基第17篇:我在苏宁电器当营业员 VIII
  19. 【转载】网络文件夹目前是以其他用户名和密码进行映射的。
  20. PX4中文维基——光流部分

热门文章

  1. Java 为什么不new 而用反射,为什么用Java反射机制
  2. 吐血分享 HID 2个接口设备的描述符代码
  3. Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理
  4. safari浏览器兼容css3旋转同时位移处理
  5. Mysql主从异常 表被回滚_Mysql主从同步 异常Slave_SQL_Running: No
  6. 慢学英文版UNIX/Linux系统管理员手册13
  7. 2022-3-31 Leetcode 415.字符串相加
  8. anchorwave进行复杂基因组比对(1)
  9. if函数的语法c语言并列,if函数多个条件并列
  10. Hbase启动没有HMaster进程问题解决