iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android怎么使用cos和sin绘制复合曲线动画
  • 549
分享到

Android怎么使用cos和sin绘制复合曲线动画

2023-06-14 05:06:46 549人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关Android怎么使用cos和sin绘制复合曲线动画,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在开发新需求的时候,设计给了一份类似这样的动画:看着不难,即使一遍看不懂,嘿嘿

这篇文章将为大家详细讲解有关Android怎么使用cos和sin绘制复合曲线动画,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

开发新需求的时候,设计给了一份类似这样的动画:

Android怎么使用cos和sin绘制复合曲线动画

看着不难,即使一遍看不懂,嘿嘿,不还有设计稿。

Android怎么使用cos和sin绘制复合曲线动画

作为一个平时很少写动画的 Android 开发仔,看到一段段的缓入缓出曲线的设计稿时,我的心情是这样的:

虽然,Android 动画默认的插值器 AccelerateDecelerateInterpolator 有这样缓入缓出的效果:

Android怎么使用cos和sin绘制复合曲线动画

我总不能一整个动画给它拆成4段动画来写,还别说,我第一次写的代码还真的是这么干的。

第一次分析

本着能少写一行绝不多写一字的原则,询问了大佬同事的意见,大佬大手一挥:PathInterpolator(后证实有问题)。

简单看了一下使用方式,需要使用 Path,再看了一眼,好家伙,有可能会用到贝塞尔曲线,放弃~

为了能够快速的解决问题,就使用了上面谈到的方案:

private fun animateTagView(tagView: TextView) { // [0,200]区间的动画  val valueAnimatorOne = ValueAnimator.ofInt(0, 200) valueAnimatorOne.addUpdateListener {  val per = it.animatedValue as Int / 200f  tagView.rotation = 4 * per  tagView.scaleX = (1 - 0.1 * per).toFloat()  tagView.scaleY = (1 - 0.1 * per).toFloat() } valueAnimatorOne.duration = 200 // [200,560]区间的动画 val valueAnimatorTwo = ValueAnimator.ofInt(200, 560) valueAnimatorTwo.addUpdateListener {  val per = (it.animatedValue as Int - 200) / 360f  tagView.rotation = 3 - 11 * per  tagView.scaleX = (0.9 + 0.1 * per).toFloat()  tagView.scaleY = (0.9 + 0.1 * per).toFloat() } valueAnimatorTwo.duration = 360 // [560,840]区间的动画 val valueAnimatorThree = ValueAnimator.ofInt(560, 840) valueAnimatorThree.addUpdateListener {  val per = (it.animatedValue as Int - 560) / 280f  tagView.rotation = -8 + 12 * per  tagView.scaleX = (1 - 0.2 * per).toFloat()  tagView.scaleY = (1 - 0.2 * per).toFloat() } valueAnimatorThree.duration = 280 // [840,1000]的动画 val valueAnimatorFour = ValueAnimator.ofInt(840, 1000) valueAnimatorFour.addUpdateListener {  val per = (it.animatedValue as Int - 840) / 160f  tagView.rotation = 4 - 4 * per  tagView.scaleX = (0.8 + 0.2 * per).toFloat()  tagView.scaleY = (0.8 + 0.2 * per).toFloat() } valueAnimatorFour.duration = 160 // 使用AnimatorSet串行执行动画 val animationSet = AnimatorSet() animationSet.playSequentially(valueAnimatorOne, valueAnimatorTwo, valueAnimatorThree, valueAnimatorFour) tagView.post {  tagView.pivotX = 0f  tagView.pivotY = ad_tag_two.measuredHeight.toFloat()  animationSet.start() }}

整个动画被我拆成了[0,200]、[200,560]、[560,840]和[840,1000]四段属性动画,因为产品说只需要播放一次,所以使用 AnimatorSet 将动画组装起来,就可以解决问题。

第二次分析

第一次得到的方案虽然能够解决问题,如果遇到循环播放,AnimatorSet 就不行了,有没有其他方案呢?

趁着周末的时间,学了一下 PathInterpolator,发现这个玩意也解决不了问题,或者说不好解决问题,虽然可以用三阶贝塞尔曲线分段画出上述曲线,但 PathInterpolator 要求起点和终点分别在 (0,0) 和 (1,1)。

既然插值器不行,可以试试估值器,但一个估值器也解决不了旋转和缩放两种动画,看来得靠 AnimatorUpdateListener 去解决问题。

回头想一下,插值器是将均匀的时间片段转化成加速或者减速的行为,我们也可以将均匀的时间片段转化成对应的曲线,只要做好两点:

使用线性的插值器 LinearInterpolator。
将上面的曲线拆分,通过不同的 sin 或者 cos 方法表达。
以旋转动画为例,拆成的 sin 函数:

Android怎么使用cos和sin绘制复合曲线动画

另外一段动画的函数可以参考代码:

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val tvContent = findViewById<TextView>(R.id.tv_content) val valueAnimatorOne = ValueAnimator.ofFloat(0.0f, 1.5f) valueAnimatorOne.addUpdateListener {  // 通过对应的sin和cos设置rotation和scale  val per = it.animatedValue as Float  var rotation: Float = 0f  var scale: Float = 0f  if(per >= 0 && per < 0.2f){   rotation = sin((per / 0.2f) * Math.PI.toFloat() - Math.PI.toFloat() / 2) * 1.5f + 1.5f   scale = cos(per / 0.2f * Math.PI.toFloat()) * 0.05f + 0.95f  }  if(per >= 0.2f && per < 0.56f){   rotation = sin(Math.PI.toFloat() / 2 + Math.PI.toFloat() * ( per - 0.2f) / 0.36f) * 5.5f - 2.5f   scale = cos((per - 0.2f) / 0.36f * Math.PI.toFloat() + Math.PI.toFloat()) * 0.05f + 0.95f  }  if(per >= 0.56f && per < 0.84f){   rotation = sin(Math.PI.toFloat() * (per - 0.56f) / 0.28f - Math.PI.toFloat() / 2) * 6f - 2f   scale = cos((per - 0.56f) / 0.28f * Math.PI.toFloat()) * 0.1f + 0.9f  }  if(per in 0.84f..1f){   rotation = sin(Math.PI.toFloat() / 2 + Math.PI.toFloat() * (per - 0.84f) / 0.16f ) * 2f + 2f   scale = cos((per - 0.84f) / 0.16f * Math.PI.toFloat() + Math.PI.toFloat()) * 0.1f + 0.9f  }  // 设置停止时间  if(per > 1f && per <= 1.5f){   rotation = 0f   scale = 1.0f  }  tvContent.rotation = rotation  tvContent.scaleX = scale  tvContent.scaleY = scale } // 设置线性插值器 valueAnimatorOne.interpolator = LinearInterpolator() // 动画时间 valueAnimatorOne.duration = 1500 // 无线循环 valueAnimatorOne.repeatCount = -1 tvContent.post {  // 设置中心点  tvContent.pivotX = 0f  tvContent.pivotY = tvContent.measuredHeight.toFloat()  valueAnimatorOne.start() }}

整个代码还是比较简单的,旋转动画曲线由 sin 得出,缩放由 cos 得出,最后改一下中心点。

关于“Android怎么使用cos和sin绘制复合曲线动画”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Android怎么使用cos和sin绘制复合曲线动画

本文链接: https://www.lsjlt.com/news/268373.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android 使用cos和sin绘制复合曲线动画
    目录前言第一次分析第二次分析总结前言 前两周在开发新需求的时候,设计给了一份类似这样的动画: 看着不难,即使一遍看不懂,嘿嘿,不还有设计稿。 作为一个平时很少写动画的 Andr...
    99+
    2024-04-02
  • Android怎么使用cos和sin绘制复合曲线动画
    这篇文章将为大家详细讲解有关Android怎么使用cos和sin绘制复合曲线动画,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在开发新需求的时候,设计给了一份类似这样的动画:看着不难,即使一遍看不懂,嘿嘿...
    99+
    2023-06-14
  • Android怎么利用贝塞尔曲线绘制动画
    本篇内容主要讲解“Android怎么利用贝塞尔曲线绘制动画”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android怎么利用贝塞尔曲线绘制动画”吧!彩虹系列通过动画控制绘制的结束点,就可以让贝...
    99+
    2023-06-30
  • Android怎么实现动态曲线绘制
    这篇文章主要介绍了Android怎么实现动态曲线绘制的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android怎么实现动态曲线绘制文章都会有所收获,下面我们一起来看看吧。我们在安卓开发中,有时会用到统计图表的...
    99+
    2023-07-02
  • Android利用贝塞尔曲线绘制动画的示例代码
    目录彩虹系列弹簧动画复杂立体感动画总结前面我们花了几篇介绍了贝塞尔曲线的原理和绘制贝塞尔曲线,着实让我们见识到了贝塞尔曲线的美。好奇心驱使我想看看贝塞尔曲线动起来会是什么样?本篇就借...
    99+
    2024-04-02
  • 使用Canvas怎么绘制一个贝赛尔曲线轨迹动画
    本篇文章为大家展示了使用Canvas怎么绘制一个贝赛尔曲线轨迹动画,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。二次贝赛尔曲线   function draw...
    99+
    2023-06-09
  • 怎么使用Python+pyecharts绘制双动态曲线
    这篇“怎么使用Python+pyecharts绘制双动态曲线”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用Pytho...
    99+
    2023-07-02
  • CSS中怎么绘制曲线图形及展示动画
    这篇文章主要介绍CSS中怎么绘制曲线图形及展示动画,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!理解 box-shadow首先,回顾一下box-shadow这个属性。基本属性用法就是给元素创造一层阴影。再简单提一下,...
    99+
    2023-06-15
  • Android怎么用Canvas绘制贝塞尔曲线
    这篇文章主要介绍了Android怎么用Canvas绘制贝塞尔曲线的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android怎么用Canvas绘制贝塞尔曲线文章都会有所收获,下面我们一起来看看吧。用Canvas...
    99+
    2023-07-02
  • 怎么使用HTML5的Canvas绘制曲线
    今天小编给大家分享一下怎么使用HTML5的Canvas绘制曲线的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们...
    99+
    2024-04-02
  • 怎么用html5的canvas画布绘制贝塞尔曲线
    这篇文章主要介绍“怎么用html5的canvas画布绘制贝塞尔曲线”,在日常操作中,相信很多人在怎么用html5的canvas画布绘制贝塞尔曲线问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2024-04-02
  • 使用canvas怎么绘制一个连线动画
    这篇文章将为大家详细讲解有关使用canvas怎么绘制一个连线动画,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。step1:绘制点首先创建个标签<canvas id="canv...
    99+
    2023-06-09
  • 怎么使用Python+NumPy绘制常见曲线
    这篇“怎么使用Python+NumPy绘制常见曲线”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用Python+Num...
    99+
    2023-07-02
  • 使用python怎么绘制一个高斯曲线
    这篇文章将为大家详细讲解有关使用python怎么绘制一个高斯曲线,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。源码:import numpy as npimpo...
    99+
    2023-06-06
  • 怎么用Android贝塞尔曲线绘制一个波浪球
    本篇内容介绍了“怎么用Android贝塞尔曲线绘制一个波浪球”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果如下所示:先来总结下 Wave...
    99+
    2023-06-30
  • 使用R语言怎么绘制函数曲线图
    这期内容当中小编将会给大家带来有关使用R语言怎么绘制函数曲线图,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。R 中 curve() 函数可以绘制函数的图像,代码格式如下:curve(expr, ...
    99+
    2023-06-15
  • 怎么使用Android LineChart绘制折线图
    这篇文章主要介绍“怎么使用Android LineChart绘制折线图”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Android LineChart绘制折线图”文章能帮...
    99+
    2023-07-05
  • 使用matplotlib怎么绘制一个正余弦曲线图
    这篇文章主要介绍了使用matplotlib怎么绘制一个正余弦曲线图,此处通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考价值,需要的朋友可以参考下:1:首先我们需要导入基本的库matplotlib numpymatplot...
    99+
    2023-06-06
  • 怎么使用CSS实现图片帧动画与曲线运动
    这篇文章将为大家详细讲解有关怎么使用CSS实现图片帧动画与曲线运动,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。css是什么意思css是一种用来表现HTML或XML等文件样式的计算机语言,主要是用来设计网...
    99+
    2023-06-08
  • 使用Canvas怎么绘制一个下雨动画
    今天就跟大家聊聊有关使用Canvas怎么绘制一个下雨动画,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。使用方法如下:function anim() { ...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作