文章目錄
前言
最近好友問計蒙翻轉動畫,剛好在大二那年看Android Api Demo時記了筆記,由此寫一篇文章。java
需求
屏幕右滑事件觸發卡片的翻轉效果 ,爲了方便,在例子中將右滑事件改爲按鈕點擊事件android
老規矩,最後有源碼web
1、先介紹三個插值器
LinearInterpolator() 其變化速率恆定
AccelerateInterpolator() 其變化開始速率較慢,後面加速
DecelerateInterpolator() 其變化開始速率較快,後面減速app
2、實現步驟
1.效果圖
2.佈局
一個按鈕,兩個TextView(佈局文件在源碼部分)ide
3.邏輯判斷(是否隱藏)
final TextView visibletext; final TextView invisibletext; //邏輯判斷 if (textview1.getVisibility() == View.GONE) { visibletext = textview2; invisibletext = textview1; } else { invisibletext = textview2; visibletext = textview1; }
4.翻轉動畫
//LinearInterpolator() 其變化速率恆定 ObjectAnimator visToInvis = ObjectAnimator.ofFloat(visibletext, "rotationY", 0f, 90f); visToInvis.setDuration(500); //AccelerateInterpolator() 其變化開始速率較慢,後面加速 visToInvis.setInterpolator(new AccelerateInterpolator()); final ObjectAnimator invisToVis = ObjectAnimator.ofFloat(invisibletext, "rotationY", -90f, 0f); invisToVis.setDuration(500); //DecelerateInterpolator() 其變化開始速率較快,後面減速 invisToVis.setInterpolator(new DecelerateInterpolator()); visToInvis.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator anim) { visibletext.setVisibility(View.GONE); invisToVis.start(); invisibletext.setVisibility(View.VISIBLE); } }); visToInvis.start();
5.bug出現
發現實現後,第一次點擊出現bugsvg
6.bug解決
在找到控件後,默認設置y方向角度佈局
textview2.setRotationY(-90f);
3、源碼
MainActivity.java
public class MainActivity extends Activity { private TextView textview1; private TextView textview2; private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); //bug解決 textview2.setRotationY(-90f); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { flipAnimation(); } }); } private void initView() { textview1 = (TextView) findViewById(R.id.textview1); textview2 = (TextView) findViewById(R.id.textview2); button = (Button) findViewById(R.id.button); } private void flipAnimation() { final TextView visibletext; final TextView invisibletext; //邏輯判斷 if (textview1.getVisibility() == View.GONE) { visibletext = textview2; invisibletext = textview1; } else { invisibletext = textview2; visibletext = textview1; } //LinearInterpolator() 其變化速率恆定 ObjectAnimator visToInvis = ObjectAnimator.ofFloat(visibletext, "rotationY", 0f, 90f); visToInvis.setDuration(500); //AccelerateInterpolator() 其變化開始速率較慢,後面加速 visToInvis.setInterpolator(new AccelerateInterpolator()); final ObjectAnimator invisToVis = ObjectAnimator.ofFloat(invisibletext, "rotationY", -90f, 0f); invisToVis.setDuration(500); //DecelerateInterpolator() 其變化開始速率較快,後面減速 invisToVis.setInterpolator(new DecelerateInterpolator()); visToInvis.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator anim) { visibletext.setVisibility(View.GONE); invisToVis.start(); invisibletext.setVisibility(View.VISIBLE); } }); visToInvis.start(); } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_width="200dp" android:layout_height="200dp" android:background="#35B9F4" android:id="@+id/textview1" android:layout_centerInParent="true" /> <TextView android:layout_width="200dp" android:layout_height="200dp" android:background="#03DAC5" android:layout_centerInParent="true" android:id="@+id/textview2"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:id="@+id/button" android:text="點擊翻轉"/> </RelativeLayout>
4、總結
最後將button的點擊事件改爲屏幕監聽事件便可。
但願對您有所幫助,歡迎留言。若有問題可聯繫計蒙。動畫
本文同步分享在 博客「計蒙不吃魚」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。spa