Android如何实现翻转动画效果(卡片翻转)

 更新时间:2021年08月11日 11:10:04   作者:计蒙不吃鱼  
卡片翻转这个效果大家应该都不陌生,这篇文章主要给大家介绍了关于Android如何实现翻转动画效果的相关资料,文中将实现的源代码以及过程中遇到的bug都介绍的非常详细,需要的朋友可以参考下

前言

最近好友问计蒙翻转动画,恰好在大二那年看Android Api Demo时记了笔记,由此写一篇文章。

需求

屏幕右滑事件触发卡片的翻转效果 ,为了方便,在例子中将右滑事件改成按钮点击事件

老规矩,最后有源码

一、先介绍三个插值器

  • LinearInterpolator()     其变化速率恒定
  • AccelerateInterpolator()    其变化开始速率较慢,后面加速
  • DecelerateInterpolator()   其变化开始速率较快,后面减速

二、实现步骤

1.效果图

2.布局

一个按钮,两个TextView(布局文件在源码部分)

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出现

发现实现后,第一次点击出现bug

6.bug解决

在找到控件后,默认设置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="点击翻转"/>
</RelativeLayout>

四、总结

最后将button的点击事件改成屏幕监听事件即可。

到此这篇关于Android如何实现翻转动画效果的文章就介绍到这了,更多相关Android实现翻转动画内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android判断软键盘的状态和隐藏软键盘的简单实例

    Android判断软键盘的状态和隐藏软键盘的简单实例

    下面小编就为大家带来一篇Android判断软键盘的状态和隐藏软键盘的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • Apache Cordova Android原理应用实例详解

    Apache Cordova Android原理应用实例详解

    这篇文章主要为大家介绍了Apache Cordova Android原理应用实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Android上传多张图片的实例代码(RxJava异步分发)

    Android上传多张图片的实例代码(RxJava异步分发)

    本篇文章主要介绍了Android上传多张图片的实例代码(RxJava异步分发),具有一定的参考价值,有兴趣的可以了解一下
    2017-08-08
  • android Palette调色板使用详解

    android Palette调色板使用详解

    本篇文章主要介绍了android Palette调色板使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Android Jetpack库剖析之Lifecycle组件篇

    Android Jetpack库剖析之Lifecycle组件篇

    本章也是带来了Jetpack中我认为最重要的架构组件Lifecycle的原理探索,至于为什么觉得它是最重要是因为像ViewModel,LiveData这些组件也依赖于Lifecycle来感知宿主的生命周期,那么本章我们带着几个问题来探索一下这个组件
    2022-07-07
  • Android应用开发中触摸屏手势识别的实现方法解析

    Android应用开发中触摸屏手势识别的实现方法解析

    这篇文章主要介绍了Android应用开发中触摸屏手势识别的实现方法解析,深入的部分则是对左右手势的识别给出了相关编写思路,需要的朋友可以参考下
    2016-02-02
  • 使用AccessibilityService实现微信自动切换账号功能

    使用AccessibilityService实现微信自动切换账号功能

    这篇文章主要为大家详细介绍了使用AccessibilityService实现微信自动切换账号功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Android控制闪光灯的方法(打开与关闭)

    Android控制闪光灯的方法(打开与关闭)

    这篇文章主要介绍了Android控制闪光灯的方法,可实现闪光灯打开与关闭的效果,涉及Android操作Camera拍照闪光灯的相关技巧,需要的朋友可以参考下
    2016-01-01
  • Android自定义分段式进度条

    Android自定义分段式进度条

    这篇文章主要为大家详细介绍了Android自定义分段式进度条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • 获取Android界面性能数据的快捷方法

    获取Android界面性能数据的快捷方法

    这篇文章主要介绍了获取Android界面性能数据的快捷方法,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下
    2021-04-04

最新评论