日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:42日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
伊人久久亚洲热| 亚洲高清二区| 国产精品一区二区av日韩在线| 国产精品欧美在线观看| 成人日韩av| 亚洲永久字幕| 国产精品自拍区| 久久精品主播| 亚洲3区在线| 日韩综合一区| 蜜桃视频在线观看一区二区| 麻豆国产一区| 亚洲午夜av| 日韩国产高清在线| 9999国产精品| 免费观看在线色综合| 国产美女久久| 国产综合婷婷| 国产日产精品一区二区三区四区的观看方式 | 国产精久久久| 久久国产小视频| 日韩国产在线观看| 91精品韩国| 日韩av网站在线观看| 私拍精品福利视频在线一区| 亚洲18在线| 久久久久国产精品一区二区| 在线观看亚洲精品福利片| 97精品中文字幕| 日韩av一区二| 亚洲精品网址| 精品久久中文| 一二三区精品| 久久天堂成人| 久久99青青| 日韩中文字幕一区二区三区| 国产成人精品福利| 日韩三级精品| 国产一区清纯| 久久精品伊人| 亚洲精品女人| 精品欧美激情在线观看| 国产亚洲高清在线观看| 99在线观看免费视频精品观看| 精品久久网站| 欧美专区一区| 日韩精品一区第一页| 日韩一区二区在线免费| 国产欧美三级| 中文字幕中文字幕精品| 亚洲电影在线| 国内不卡的一区二区三区中文字幕| 一区二区高清| 中文日韩在线| 日韩中文在线电影| 久久av免费| 日韩免费精品| 欧美天堂亚洲电影院在线观看| 成人精品动漫一区二区三区| 欧美一级久久| 亚洲精品精选| 欧美专区18| 欧美高清一区| 成人久久一区| 国产福利片在线观看| 欧美a在线观看| 国产精品亚洲片在线播放| 蜜桃视频一区二区三区在线观看| 亚洲婷婷免费| 亚洲天堂av影院| 精品久久视频| 美女视频黄久久| 91亚洲无吗| 婷婷综合电影| 蜜臀精品久久久久久蜜臀 | 国产一二在线播放| 国内一区二区三区| 免费精品一区| 国产精品一区二区三区美女| 日韩中出av| 日韩在线麻豆| 亚洲精品系列| 亚洲精品九九| 日韩三区四区| 视频一区中文字幕精品| 蜜臀久久久99精品久久久久久| 国产亚洲福利| 妖精视频成人观看www| 在线精品视频在线观看高清| 亚洲午夜久久久久久尤物| 久久天堂成人| 国内精品福利| 亚洲激情精品| 蜜桃一区二区三区在线观看| 亚洲乱码视频| 欧美一级久久| 免费看久久久| 成人在线视频区| 国产精品久久久久久久久久10秀 | 视频在线观看91| 伊人久久一区| 日韩黄色在线观看| 国产伦精品一区二区三区视频 | 麻豆精品少妇| 国产精品麻豆久久| 国产99久久| 精品欧美激情在线观看| 久久中文字幕二区| 国产精品免费看| 亚洲精品国模| 国产精品黄色片| 色婷婷亚洲mv天堂mv在影片| av在线日韩| 在线观看免费一区二区| 男人的天堂久久精品| 天堂俺去俺来也www久久婷婷| 日本成人在线视频网站| 欧美91在线| 亚洲综合在线电影| 日韩视频中文| 日韩国产欧美一区二区三区| 国产欧美日韩影院| 精品美女在线视频| 激情婷婷亚洲| 日韩欧美三区| 国产第一亚洲| 五月天久久久| 青草av.久久免费一区| 精品国产亚洲一区二区三区在线 | 免费不卡中文字幕在线| 亚洲欧美不卡| 国产乱码精品| 少妇久久久久| 午夜性色一区二区三区免费视频| 欧美国产视频| 99精品视频精品精品视频| 久久亚洲美女| 国产精品高潮呻吟久久久久| 丝袜美腿诱惑一区二区三区| 免费日韩av片| 欧美国产另类| 欧美日韩黑人| 国产欧美日韩影院| 久久国产日韩| 亚洲美女91| 伊人久久在线| 婷婷综合国产| 日韩欧美另类一区二区| 日韩在线黄色| 久久天堂成人| 国产欧美日韩一区二区三区在线| 亚洲国产综合在线看不卡| 欧美视频久久| 欧美成a人免费观看久久| 亚洲欧美日本国产| 高清在线一区| 亚洲三级毛片| 88xx成人免费观看视频库| 中文字幕av一区二区三区人 | 亚洲电影有码| **爰片久久毛片| 亚洲a一区二区三区| 日韩精品一区二区三区中文| 樱桃视频成人在线观看| 无码日韩精品一区二区免费| 91tv亚洲精品香蕉国产一区| 青青伊人久久| 伊人精品在线| 国产一区二区三区视频在线| 久热精品在线| 中文av在线全新| 日韩国产在线一| 91九色精品| 麻豆一区在线| 自拍自偷一区二区三区| 久久视频精品| 红杏一区二区三区| 日韩超碰人人爽人人做人人添| 欧美日韩一二三四| 国产精品hd| 亚洲理论在线| 欧美日韩一区二区综合 | 日本午夜大片a在线观看| 91亚洲精品视频在线观看 | 99riav国产精品| 亚洲伊人av| 免费在线观看一区| 亚洲精品在线二区| 婷婷激情图片久久| 国产拍在线视频| 国产欧美在线| 亚洲欧洲美洲国产香蕉| 精品日韩毛片| 日韩av首页| 精品免费在线| 国产精品久久国产愉拍| 亚洲香蕉久久| 丝袜美腿亚洲色图| 亚洲国产专区| 国产精品字幕|