本文参考
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. 华为认证物联网开发利器:小熊派IoT开发板
  2. [ASP.NET 控件实作 Day31] TBContextMenu 控件三种不同模式的 Click 动作
  3. opencv进阶学习笔记13:图像形态学操作大全(膨胀,腐蚀,开闭,黑帽,顶帽,梯度)python版
  4. OpenCV解码格雷码模式
  5. web browser 发展史
  6. ACID中C与CAP定理中C的区别
  7. 数据分析团队的价值_您的数据科学团队的价值
  8. C++从0到1的入门级教学(十一)——友元
  9. java flask_将Java与Python Flask连接
  10. 使用Arduino和超声波传感器实现简单测距
  11. 全世界都误会我们了。。。。。。。。
  12. python 字符串以及通过dos命令运行py脚本
  13. C64x+ CPU中断 .
  14. php月考勤统计,考勤系统功能实现——统计
  15. 电子元件知识汇总3-厂商
  16. 银行卡号码显示每隔4位数空一格
  17. 浏览器交互导出excel
  18. via自定义搜索引擎代码_VIA浏览器自定义logo设置
  19. java代码校验手机号码_校验手机号码的正则表达式写法 (java实现)
  20. 你好,李焕英!贾玲痛哭,一句话戳痛2.3亿中国人

热门文章

  1. 计算机田亩公式,怎样计算土地亩数?
  2. 如何评价FAIR的新论文DETR?
  3. html 学习 常用标签
  4. 自己怎么做百度百科词条,在百度发布个人简介信息的操作
  5. FishNet网络结构阅读笔记
  6. 机器人导航(仿真)(一)——SLAM建图
  7. 2022-4-16 服务器集中写
  8. Win10中文语言包安装方法
  9. DL|CNN可视化研究综述(一)
  10. MySQL左连接之后引起的排序问题