Android翻轉動畫(卡片翻轉效果)


前言

最近好友問計蒙翻轉動畫,剛好在大二那年看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

相關文章
相關標籤/搜索