成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Android 使用cos和sin繪制復合曲線動畫

瀏覽:3日期:2022-09-20 14:59:05
前言

前兩周在開發新需求的時候,設計給了一份類似這樣的動畫:

Android 使用cos和sin繪制復合曲線動畫

看著不難,即使一遍看不懂,嘿嘿,不還有設計稿。

Android 使用cos和sin繪制復合曲線動畫

作為一個平時很少寫動畫的 Android 開發仔,看到一段段的緩入緩出曲線的設計稿時,我的心情是這樣的:

Android 使用cos和sin繪制復合曲線動畫

雖然,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 得出,最后改一下中心點。

總結

本次的動畫案例不難,在面對復合緩入緩出曲線的情形,我們可以拆成一段段,用 sin 或者 cos 去描述,這樣的好處是可以只使用一個屬性動畫,且可以循環播放。

如果你有更好的方案,歡迎評論區交流。

以上就是Android 使用cos和sin繪制復合曲線動畫的詳細內容,更多關于Android 繪制復合曲線動畫的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲成av人影院| av激情综合网| 91色九色蝌蚪| 日韩欧美国产一区二区在线播放 | 老司机精品福利视频| 亚洲美女屁股眼交3| 精品动漫av| 久久久久久久综合色一本| 成人在线综合网站| 欧美一区二区在线视频| 国产主播一区二区三区| 欧美日韩精品欧美日韩精品 | 久久亚洲午夜电影| 亚洲一区二区三区在线| 一本久久综合| 亚洲视频在线观看一区| 一本久道久久综合婷婷鲸鱼| 一区二区三区日韩欧美| 一本一本久久| 亚洲国产精品久久久男人的天堂| 亚洲欧美日韩国产综合精品二区 | 亚洲一区二区欧美| 先锋影音久久久| 天天影视网天天综合色在线播放| 色婷婷综合久久久| 奇米精品一区二区三区在线观看| 欧美亚洲禁片免费| 久久99蜜桃精品| 欧美日韩国产高清一区二区三区 | 红桃视频欧美| 亚洲另类在线制服丝袜| 精品1区2区| 一区二区三区视频在线观看| 久久久国产精品一区二区三区| 日本少妇一区二区| 3d动漫精品啪啪一区二区竹菊| 成人美女在线视频| 国产日韩欧美高清在线| 欧美日韩精品一区| 亚洲日本一区二区| 午夜亚洲精品| 久久99精品久久只有精品| 欧美一区二区三区不卡| 99久久精品99国产精品| 国产欧美日韩激情| aⅴ色国产欧美| 日韩av一级电影| 欧美一区国产二区| 欧美99久久| 亚洲欧美另类小说| 色婷婷综合五月| 高清视频一区二区| 国产欧美日产一区| 免费日韩av| 国产一区二区三区四| 精品成人一区二区三区| 尹人成人综合网| 亚洲一区二区三区小说| 在线观看中文字幕不卡| 成人毛片视频在线观看| 国产精品家庭影院| 久久亚洲国产精品一区二区| 国产乱对白刺激视频不卡| 久久久激情视频| 国产视频精品网| 九色porny丨国产精品| 26uuu亚洲| 国产精品视频免费观看| 韩国欧美一区二区| 欧美韩日一区二区三区| 欧美亚洲免费在线| 成人禁用看黄a在线| 亚洲欧美日本韩国| 欧美精品xxxxbbbb| 欧美午夜视频在线| 日韩电影一区二区三区| 日韩欧美高清一区| 在线成人亚洲| 精品亚洲国内自在自线福利| 国产亚洲精久久久久久| 久久成人免费| 国产一区二区剧情av在线| 中文字幕av一区二区三区高 | 亚洲欧美国产不卡| 国产成人午夜视频| 亚洲精品水蜜桃| 777午夜精品视频在线播放| 黑人巨大精品欧美一区二区小视频 | 欧美国内亚洲| 婷婷综合五月天| 久久久久88色偷偷免费| 91极品美女在线| 午夜精品久久| 男女性色大片免费观看一区二区 | 亚洲日本中文字幕区| 777奇米四色成人影色区| 激情综合自拍| 国产乱子轮精品视频| 国产精品私人影院| 在线观看国产日韩| 欧美久久久久| 麻豆精品视频在线| 亚洲欧洲一区二区在线播放| 欧美女孩性生活视频| 亚洲国产精品一区二区第四页av| 精品在线视频一区| 亚洲欧洲日韩一区二区三区| 欧美美女直播网站| 亚洲精品精选| 波多野结衣中文一区| 午夜精品久久久| 亚洲国产精品国自产拍av| 欧美天堂亚洲电影院在线播放| 亚洲电影在线| 高潮精品一区videoshd| 婷婷久久综合九色综合绿巨人| 久久―日本道色综合久久| 一本久道中文字幕精品亚洲嫩| 欧美日本不卡高清| 精品无人区卡一卡二卡三乱码免费卡| 国产精品久久久久永久免费观看 | 欧美一区综合| 狠狠狠色丁香婷婷综合久久五月| 日韩美女视频19| 欧美tickling网站挠脚心| 在线观看欧美精品| 国产欧美日韩综合一区在线观看 | 视频一区欧美精品| 国产精品久久久久影院亚瑟| 欧美一区二区福利在线| 奶水喷射视频一区| 91丨九色丨尤物| 国产一区二区看久久| 日本不卡一区二区三区高清视频| 成人免费在线视频观看| 精品久久久久久亚洲综合网| 欧美视频日韩视频在线观看| 亚洲在线日韩| 亚洲网站啪啪| 波波电影院一区二区三区| 韩日欧美一区二区三区| 亚洲va韩国va欧美va精品| 中文字幕一区二区三区不卡在线 | 亚洲一卡二卡三卡四卡五卡| 国产欧美久久久精品影院| 欧美一级理论性理论a| 久久中文字幕一区二区三区| 在线国产欧美| 欧美日韩综合久久| 91丨九色丨蝌蚪富婆spa| 国产成人综合视频| 国内精品国产成人国产三级粉色| 日日摸夜夜添夜夜添精品视频| 亚洲激情图片qvod| 国产三级一区二区三区| 日韩美女视频在线| 欧美日韩精品欧美日韩精品| 色国产综合视频| 欧美亚洲三级| 亚洲欧美卡通另类91av| 极品日韩久久| 国产精品激情| 欧美在线精品一区| av一本久道久久综合久久鬼色| 成人在线综合网| 成人一二三区视频| 国产69精品久久99不卡| 国产在线播放一区| 精品一区二区三区免费观看| 免费欧美日韩国产三级电影| 午夜精品久久久久久久| 亚洲v中文字幕| 午夜在线电影亚洲一区| 亚洲v精品v日韩v欧美v专区| 午夜精品福利一区二区蜜股av | 精品一二三四在线| 精品一区二区在线观看| 美女一区二区在线观看| 日本vs亚洲vs韩国一区三区二区| 日本美女一区二区三区视频| 日本成人在线一区| 韩国精品一区二区| 国产麻豆午夜三级精品| 国产成人午夜精品影院观看视频| 国产成人日日夜夜| 不卡电影免费在线播放一区| 91免费观看视频在线| 国内精品久久久久久久影视麻豆 | 亚洲色图欧美激情| 一区二区三区在线视频播放| 亚洲综合色视频| 午夜成人免费电影| 美女高潮久久久| 激情六月婷婷久久| 福利电影一区二区三区| 91麻豆精品一区二区三区| 亚洲午夜精品一区二区| 国产精品日本| 91久久免费观看| 欧美日韩二区三区|