1. 程式人生 > >android 檢視動畫遇到的坑

android 檢視動畫遇到的坑

        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~~