android基礎--列表資料View重新整理動畫
該效果類似於iPhone中View的切換動畫效果
效果一:
效果二:
效果三:
效果四:
效果五(迴旋效果一):
效果六(迴旋效果二):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@+id/firstPage" android:layout_width="fill_parent" android:layout_weight="1.0" android:layout_height="0dip"/> <ListView android:id="@+id/secondPage" android:layout_width="fill_parent" android:layout_weight="1.0" android:layout_height="0dip" android:visibility="gone"/> <Button android:id="@+id/startNext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/next" />
</LinearLayout> |
1 |
<strong> 下面再來看下實現以上效果的具體程式碼,程式碼中所標的順序與上面顯示的效果圖一致:</strong> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
package com.xiaoma.www;
import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.AccelerateInterpolator; import android.view.animation.CycleInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import android.view.animation.OvershootInterpolator; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView;
/** * @Title: BetweenAnimationActivity.java * @Package com.xiaoma.www * @Description: 小馬學習模仿iPhone列表分頁旋轉重新整理 * @author XiaoMa */
public class BetweenAnimationActivity extends Activity implements OnClickListener {
/**資源宣告*/ private Button startNext = null ; private ListView firstPage = null ; private ListView secondPage = null ;
/**列表項宣告*/ private static final String firstItem[] ={"海闊人生","光輝歲月","無盡空虛","真的愛你","歲月無聲","灰色軌跡","再見理想"};
private static final String secondItem[] ={"洗唰唰","愛啦啦","喜歡你","娃哈哈","小馬果","大壞蛋","冷雨夜"};
/**列表頁面切換動畫插值器宣告一*/ private Interpolator accelerator = new AccelerateInterpolator(); private Interpolator decelerator = new DecelerateInterpolator();
/**動畫插值器二:效果五與效果六都為以下插值器*/ private Interpolator accelerator1= new CycleInterpolator(45f); private Interpolator decelerator1= new OvershootInterpolator();
/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
/** * 這個地方寫下,大家儘量不要在onCreate方法中寫太多的操作, * 如果涉及到很多配置問題時有些屬性設定必須在onCreate()方法中 * 寫,比如:全屏、橫豎屏必須在setContentView()前面寫, * 如果在onCreate()方法中寫太多東西的,一句話:太亂!! * */
init(); }
/** * 初始化實現 */ private void init() { /**資源定位,新增監聽*/ startNext = (Button)findViewById(R.id.startNext); startNext.setOnClickListener(this);
firstPage = (ListView)findViewById(R.id.firstPage); secondPage = (ListView)findViewById(R.id.secondPage);
ArrayAdapter<String> firstAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,firstItem); ArrayAdapter<String> secondAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, secondItem);
firstPage.setAdapter(firstAdapter); secondPage.setAdapter(secondAdapter); }
@Override public void onClick(View v) { changePage(); }
//實現列表頁面切換 private void changePage() { final ListView visiable ; final ListView invisiable ;
if(firstPage.getVisibility() == View.GONE) { visiable = secondPage ; invisiable = firstPage ; }else{ visiable = firstPage ; invisiable = secondPage ; }
//這個地方大家可能看到了ObjectAnimator這個類,一開始我也不知道是什麼東西,很簡單,查官方文件,官方文件中的解釋一堆英文,我//一直說的,我英文爛的要死,但不怕,只要你想,就肯定可以查出來的,大家 只看一句:該類是 ValueAnimator的子類,可以根據給定//的屬性名稱給目標物件設定動畫引數
//效果一(此處效果順序與效果圖一一對應) //final ObjectAnimator invisToVis = ObjectAnimator.ofFloat(invisiable, "rotationX",-90f, 0f); ObjectAnimator visToInvis = ObjectAnimator.ofFloat(visiable, "rotationX", 0f, 90f);
//效果二 final ObjectAnimator invisToVis = ObjectAnimator.ofFloat(invisiable, "rotationY",-90f, 0f); ObjectAnimator visToInvis = ObjectAnimator.ofFloat(visiable, "rotationY", 0f, 90f);
//效果三(這個地方的alpha屬性值大家只記一點:值越大越不透明就可以了!!!) //final ObjectAnimator invisToVis = ObjectAnimator.ofFloat(invisiable, "alpha", 0.0f, 1.0f ); //ObjectAnimator visToInvis = ObjectAnimator.ofFloat(visiable, "alpha", 1.0f, 0.0f );
//效果四(此於是我犯的一個錯誤,很天真的以為應該也有rotationZ屬性名稱,其實是錯的,在ofFloat引數中並無此屬性名稱,但大家還//是可以看到列表正常,其實顯示 效果很不正常了因為後臺已經報錯,但應用仍然不會停止 ,照常執行,但效果僅僅是兩個ListView直接//替換,並無任何動畫新增到其中,這個地方大家注意下): ObjectAnimator.ofFloat(invisiable, "rotationZ",-90f, 0f);
visToInvis.setDuration(500); visToInvis.setInterpolator(accelerator); invisToVis.setDuration(500); invisToVis.setInterpolator(decelerator);
//這個地方記錄下,下面這個監聽器小馬第一次見到,查閱官方文件解釋如下:此監聽來監聽動畫的生命週期如:開始、結束、正在播放、循//環播放等 ,此處切記: Animation是不可以監聽動畫的,它只負責動畫的 visToInvis.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator anim) { /* * 列舉幾個動畫的監聽: * 一:anim.isRunning(){//TODO} * 二:anim.isStarted(){//TODO} * 三:anim.end(){//TODO} */
visiable.setVisibility(View.GONE); invisToVis.start(); invisiable.setVisibility(View.VISIBLE); } }); visToInvis.start(); } } |