Android如何實(shí)現(xiàn)翻轉(zhuǎn)動(dòng)畫效果(卡片翻轉(zhuǎn))
前言
最近好友問計(jì)蒙翻轉(zhuǎn)動(dòng)畫,恰好在大二那年看Android Api Demo時(shí)記了筆記,由此寫一篇文章。
需求
屏幕右滑事件觸發(fā)卡片的翻轉(zhuǎn)效果 ,為了方便,在例子中將右滑事件改成按鈕點(diǎn)擊事件
老規(guī)矩,最后有源碼
一、先介紹三個(gè)插值器
- LinearInterpolator() 其變化速率恒定
- AccelerateInterpolator() 其變化開始速率較慢,后面加速
- DecelerateInterpolator() 其變化開始速率較快,后面減速
二、實(shí)現(xiàn)步驟
1.效果圖

2.布局
一個(gè)按鈕,兩個(gè)TextView(布局文件在源碼部分)
3.邏輯判斷(是否隱藏)
final TextView visibletext;
final TextView invisibletext;
//邏輯判斷
if (textview1.getVisibility() == View.GONE) {
visibletext = textview2;
invisibletext = textview1;
} else {
invisibletext = textview2;
visibletext = textview1;
}
4.翻轉(zhuǎn)動(dòng)畫
//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出現(xiàn)
發(fā)現(xiàn)實(shí)現(xiàn)后,第一次點(diǎn)擊出現(xiàn)bug

6.bug解決
在找到控件后,默認(rèn)設(shè)置y方向角度
textview2.setRotationY(-90f);
三、源碼
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="點(diǎn)擊翻轉(zhuǎn)"/>
</RelativeLayout>
四、總結(jié)
最后將button的點(diǎn)擊事件改成屏幕監(jiān)聽事件即可。
到此這篇關(guān)于Android如何實(shí)現(xiàn)翻轉(zhuǎn)動(dòng)畫效果的文章就介紹到這了,更多相關(guān)Android實(shí)現(xiàn)翻轉(zhuǎn)動(dòng)畫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android 矢量室內(nèi)地圖開發(fā)實(shí)例
- Android中Activity過渡動(dòng)畫的實(shí)例講解
- Android activity動(dòng)畫不生效原因及解決方案總結(jié)
- Android 幀動(dòng)畫使用詳情
- Android動(dòng)畫之TranslateAnimation用法案例詳解
- Android實(shí)現(xiàn)簡(jiǎn)單點(diǎn)贊動(dòng)畫
- Android實(shí)現(xiàn)雅虎新聞?wù)虞d視差動(dòng)畫效果
- Android實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫的兩種方式案例詳解
- Android高級(jí)動(dòng)畫篇之SVG矢量動(dòng)畫范例
相關(guān)文章
Android判斷軟鍵盤的狀態(tài)和隱藏軟鍵盤的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)硪黄狝ndroid判斷軟鍵盤的狀態(tài)和隱藏軟鍵盤的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10
Apache?Cordova?Android原理應(yīng)用實(shí)例詳解
這篇文章主要為大家介紹了Apache?Cordova?Android原理應(yīng)用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Android上傳多張圖片的實(shí)例代碼(RxJava異步分發(fā))
本篇文章主要介紹了Android上傳多張圖片的實(shí)例代碼(RxJava異步分發(fā)),具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08
Android Jetpack庫(kù)剖析之Lifecycle組件篇
本章也是帶來了Jetpack中我認(rèn)為最重要的架構(gòu)組件Lifecycle的原理探索,至于為什么覺得它是最重要是因?yàn)橄馰iewModel,LiveData這些組件也依賴于Lifecycle來感知宿主的生命周期,那么本章我們帶著幾個(gè)問題來探索一下這個(gè)組件2022-07-07
Android應(yīng)用開發(fā)中觸摸屏手勢(shì)識(shí)別的實(shí)現(xiàn)方法解析
這篇文章主要介紹了Android應(yīng)用開發(fā)中觸摸屏手勢(shì)識(shí)別的實(shí)現(xiàn)方法解析,深入的部分則是對(duì)左右手勢(shì)的識(shí)別給出了相關(guān)編寫思路,需要的朋友可以參考下2016-02-02
使用AccessibilityService實(shí)現(xiàn)微信自動(dòng)切換賬號(hào)功能
這篇文章主要為大家詳細(xì)介紹了使用AccessibilityService實(shí)現(xiàn)微信自動(dòng)切換賬號(hào)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12

