android 檢視動畫遇到的坑
阿新 • • 發佈:2019-01-09
Android中檢視動畫使用率越來越少了,很多大神都使用屬性動畫了。但個人覺得檢視動畫比屬性動畫使用起來更簡單,所以能用檢視動畫實現的就不考慮用屬性動畫。
今天在專案中使用檢視動畫時,遇到了幾個坑,記錄下來,供踩到同樣坑的同學參考一下~
一、平移與縮放衝突
使用檢視動畫,常使用到動畫集合AnimationSet,然後在動畫集合中新增平移、綻放,旋轉等動畫。
比如,想實現一個先平移後放大的動畫,正常思維下的程式碼如下:
執行。。。。。AnimationSet set = new AnimationSet(true); // 先平移 int moveX = (large.x + lWidth / 2) - (sLeft + sWidth / 2); int moveY = (large.y + lHeight / 2) - (sTop + sHeight / 2); Animation move = new TranslateAnimation(0, moveX, 0, moveY); move.setInterpolator(new AccelerateDecelerateInterpolator()); move.setDuration(1300); set.addAnimation(move); // 再放大 Animation scale = new ScaleAnimation(1.0f, 2.23f, 1.0f, 2.23f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); scale.setInterpolator(new DecelerateInterpolator()); scale.setStartOffset(1300);// 延遲播放 scale.setDuration(1000); scale.setFillAfter(true); set.addAnimation(scale);
執行效果不一致:實際效果是,先平移,後一邊平移一邊放大
為什麼? 看程式碼沒發現有問題
查了好多資料,才恍然大悟:原來動畫集合中平移和縮放會衝突,是因為動畫集合中運用了矩陣的知識,想實現先平移後縮放,那麼在建立矩陣時,必須先縮放後平移,即動畫集合中要先新增縮放後新增平移。
所以實現先平移後放大的程式碼應該如下:
AnimationSet set = new AnimationSet(true); // 再放大 Animation scale = new ScaleAnimation(1.0f, 2.23f, 1.0f, 2.23f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); scale.setInterpolator(new DecelerateInterpolator()); scale.setStartOffset(1300);// 延遲播放 scale.setDuration(1000); scale.setFillAfter(true); set.addAnimation(scale); // 先平移 int moveX = (large.x + lWidth / 2) - (sLeft + sWidth / 2); int moveY = (large.y + lHeight / 2) - (sTop + sHeight / 2); Animation move = new TranslateAnimation(0, moveX, 0, moveY); move.setInterpolator(new AccelerateDecelerateInterpolator()); move.setDuration(1300); set.addAnimation(move);
二、控制元件操作動畫後不能夠隱藏(INVISIBLE)
某個控制元件實現瞭如下動畫:操作漸變,從透明到可見
然後操作隱藏,發現隱藏不了
先上程式碼吧:
漸變的base_fade_in.xml
漸變動畫:<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <alpha android:duration="1000" android:fromAlpha="0.0" android:interpolator="@android:anim/decelerate_interpolator" android:toAlpha="1.0" /> </set>
Animation in = AnimationUtils.loadAnimation(this, R.anim.base_fade_in);
in.setFillAfter(true);
mLTipsLayout.startAnimation(in);
隱藏:
mLTipsLayout.setVisibility(View.INVISIBLE);
程式碼很簡單,但實現效果就是隱藏不了,然後一句句註釋找原因,原來是這句出了問題:
in.setFillAfter(true);
這句的作用是:讓控制元件定格在動畫完成時的狀態不變。那麼用到上面就是,讓控制元件一直處於可見狀態不變。所以後面再操作隱藏就沒用了。
當註釋上面,OK~~