Android动画——使用动画启动Activity

news2024/12/22 19:55:56

1、使用动画启动Activity概述

    我们在Android开发应用时,会遇到一个页面跳转到另一个页面的情况,这时候我们如果使用动画过渡会使得页面更加的流畅。在这里插入图片描述

这是一个滑动式的进入和退出的动画

    可以看到Android的过渡动画可以在不同状态之间建立视觉联系。您可以为进入退出过渡,以及 Activity 之间共享元素的过渡指定自定义动画。
在这里插入图片描述

2、进入和退出的过渡动画

    在Android的官方文档中,我们可以看到在Android 5.0(API)中进入和退出过渡有三种。

1、分解(explode) - 将视图移入场景中心或从中移出。
2、滑动式(slide) -将视图从场景的其中一个边缘移入或移出。
3、淡入淡出式(fade) - 通过更改视图的不透明度,在场景中添加视图或从中移除视图。

    以上三种是Android已经定义好的Visibility的子类,我们也可以自定义Visibility的子类来实现过渡,那么我们这里通过以下几个步骤来实现已经定义好三种过渡:

1、在style里将是否使用activity过渡的标志位设为true,或者使用相应处理代码

<style name="BaseAppTheme" parent="Theme.AppCompat.Light">
  <item name="android:windowContentTransitions">true</item>
</style>
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState)
    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS)
}

2、设置进入activity和退出activity的过渡方式
(1)在style里设置

<style name="BaseAppTheme" parent="Theme.AppCompat.Light">
  <!-- specify enter and exit transitions -->
  <item name="android:windowEnterTransition">@transition/activity_explode</item>
  <item name="android:windowExitTransition">@transition/activity_fade</item>
</style>

同时在相应的资源文件里应当有相应的transition文件夹
(2)在代码里设置,在MainActivity.java

private void setupWindowAnimations() {
       	Explode explode = (explode) TransitionInflater.from(this).inflateTransition(R.transition.activity_explode);
       	Fade fade = (fade) TransitionInflater.from(this).inflateTransition(R.transition.activity_fade);
        getWindow().setEnterTransition(explode);
        getWindow().setExitTransition(fade);
    }

3、使用finishAfterTransition()函数可以在退出Activity时也有过渡动画

TryTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finishAfterTransition();
                finish();
            }
        });

4、最后启动使用过渡的Activity

    startActivity(intent,
                  ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

3、使用共享元素过渡动画

    我们先来看一下一个共享元素过渡动画的实例:
在这里插入图片描述
    可以看到这个蓝色的图以及它的标题就是两个Activity之间的共享元素,同样Android为共享元素之间的过渡准备了四个类:

1、changeBounds - 为目标视图布局边界的变化添加动画效果。
2、changeClipBounds - 为目标视图裁剪边界的变化添加动画效果。
3、changeTransform - 为目标视图缩放和旋转方面的变化添加动画效果。
4、changeImageTransform - 为目标图片尺寸和缩放方面的变化添加动画效果。

那么我们要实现这两个共享元素之间的过渡可以按照以下步骤:

1、在style里将是否使用activity过渡的标志位设为true,或者使用相应处理代码

<style name="BaseAppTheme" parent="Theme.AppCompat.Light">
  <item name="android:windowContentTransitions">true</item>
</style>
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState)
    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS)
}

2、在样式中指定共享元素过渡

<style name="AppTheme" parent="Theme.AppCompat.Light">
        <!-- Set the transitions which are used for the entrance and exit of shared elements -->
        <item name="android:windowSharedElementEnterTransition" tools:ignore="NewApi">
            @transition/grid_detail_transition
        </item>
        <item name="android:windowSharedElementExitTransition" tools:ignore="NewApi">
            @transition/grid_detail_transition
        </item>
    </style>

3、将过渡定义成xml资源
在transition文件夹里的grid_detail_transition.xml文件里

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- changeBounds is used for the TextViews which are shared -->
    <changeBounds />

    <!-- changeImageTransform is used for the ImageViews which are shared -->
    <changeImageTransform />

</transitionSet>

4、将共享元素设置统一的TransitionName

如果只有一个共享元素,设置统一的TransitionName就可以了,由于这里在启动Activity时有多个共享元素,所以这里定义两个布局中的共享元素,并创建一个 ActivityOptions 对象

DetailActivity.java里定义TransitionName

 ViewCompat.setTransitionName(mHeaderImageView, VIEW_NAME_HEADER_IMAGE);
 ViewCompat.setTransitionName(mHeaderTitle, VIEW_NAME_HEADER_TITLE);

其中

    public static final String VIEW_NAME_HEADER_IMAGE = "detail:header:image";
    public static final String VIEW_NAME_HEADER_TITLE = "detail:header:title";

5、启动过渡的Activity

(1) 使用makeSceneTransitionAnimation()函数,第一个参数是origin view,第二个参数是设置的TransitionName
MainActivity.java里创建一个 ActivityOptions 对象

ActivityOptionsCompat activityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation(
                    MainActivity.this,
                    // Now we provide a list of Pair items which contain the view we can transitioning
                    // from, and the name of the view it is transitioning to, in the launched activity
                    new Pair<>(view.findViewById(R.id.imageview_item),
                            DetailActivity.VIEW_NAME_HEADER_IMAGE),
                    new Pair<>(view.findViewById(R.id.textview_name),
                            DetailActivity.VIEW_NAME_HEADER_TITLE));

(2)在DetailActivity.java中使用一个loadItem()函数用来展示图片的放大缩小

private void loadItem() {
        mHeaderTitle.setText(getString(R.string.image_header, mItem.getName(), mItem.getAuthor()));
        
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && addTransitionListener()) {
            loadThumbnail();//小图片
        } else {
            loadFullSizeImage();//大图片
        }
    }

Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP这个判断是用来检查系统的版本的,其中还使用了一个监听函数addTransitionListener()

private boolean addTransitionListener() {
        final Transition transition = getWindow().getSharedElementEnterTransition();

        if (transition != null) {
            // There is an entering shared element transition so add a listener to it
            transition.addListener(new Transition.TransitionListener() {
                @Override
                public void onTransitionEnd(Transition transition) {
                    // As the transition has ended, we can now load the full-size image
                    loadFullSizeImage();

                    // Make sure we remove ourselves as a listener
                    transition.removeListener(this);
                }
	...
	}

(3)最后启动过渡

 ActivityCompat.startActivity(MainActivity.this, intent, activityOptions.toBundle());

注意!如需在完成第二个 Activity 时反转场景过渡动画,要调用 Activity.finishAfterTransition() 函数,而不是 Activity.finish()函数

至此就能实现开头那样的共享元素过渡了!
如需要源码下载可参考Android官方链接共享元素过渡动画

作者:刘俊豪

原文链接:点击这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/59542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

find 命令这 7 种高级用法

可以很肯定地说&#xff0c;find 命令是 Linux 后台开发人员必须熟知的操作之一&#xff0c;除非您使用的是 Windows Server。 对于技术面试&#xff0c;它也是一个热门话题。让我们看一道真题&#xff1a; 如果你的 Linux 服务器上有一个名为 logs 的目录&#xff0c;如何删…

MySQL性能调优——索引篇

MySQL为什么会选错索引 使用explain命令可以查看查询语句使用了具体使用了哪个索引&#xff0c;比如 explain select * from t where a between 10000 and 20000;查询结果如图所示。 选择索引是优化器的工作 优化器选择索引的目的是想找到一个最优的执行方案&#xff0c;并…

08_线程池

08_线程池前言Callable接口ThreadPoolExecutor**为什么用线程池****线程池的好处**架构说明创建线程池底层实现线程池的重要参数拒绝策略线程池底层工作原理问题二: 线程池使用过吗?谈谈在生产上如何设置的参数?线程池的拒绝策略你谈谈?工作中单一的/固定数的/可变数的三种创…

设计模式 之 行为型模式

设计模式 之 行为型模式 模式 & 描述包括行为型模式 这些设计模式特别关注对象之间的通信。责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 命令模式&#xff08;Command Pattern&#xff09;解释器模式&#xff08;Interpreter Pattern&#xff09;…

Web 性能指标

Web 性能指标 对于 Web 开发人员来说&#xff0c;如何衡量一个 Web 页面的性能一直是一个难题。 最初&#xff0c;我们使用 Time to First Byte、DomContentLoaded 和 Load 这些衡量文档加载进度的指标&#xff0c;但它们不能直接反应用户视觉体验。 为了能衡量用户视觉体验…

[附源码]计算机毕业设计springboot志愿者服务平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[数据结构]八大排序算法总结

作者&#xff1a; 华丞臧专栏&#xff1a;【数据结构】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。推荐一款刷题网站 &#x1f449; LeetCode刷题网站 目录 一、排序的概念及其运用 1.1排…

【目的:windows下VS2017/2022配置使用opengl - 初探-创建一个空窗口】

目的&#xff1a;windows下VS2017/2022配置使用opengl - 初探-创建一个空窗口 环境&#xff1a; 系统&#xff1a;Win10 环境&#xff1a;VS2017 64bit步骤&#xff1a; windows下visualstudio下使用opengl&#xff0c;搭建配置环境并测试窗口 1、opengl库&#xff0c;vs下自…

Crack:Open Inventor 10.12.1 Fixed Bugs List 10.12

10.12.0 - 10.12.1 Open Inventor 10.12.1 Core #OIV-4245 Shapes not rendered with MultipleInstancing  #OIV-4258 Transparency issue with SoPackedColor – CAS-41256-F0S4 OivSuite.Java #OIV-4273 Memory leak with RemoteViz Java and JVM VolumeViz #OI…

CMake中add_library的使用

CMake中的add_library命令用于使用指定的源文件向项目(project)中添加库&#xff0c;其格式如下&#xff1a; add_library(<name> [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL][<source>...]) # Normal Libraries add_library(<name> OBJECT [<source&…

【Java 快速复习】垃圾回收算法 垃圾回收器

快速理解 Java 垃圾回收算法 & 垃圾回收器 先说个关系概念&#xff0c;垃圾回收的算法是逻辑概念的定义&#xff0c;用于规范垃圾回收器实现方的一些行为&#xff0c;而垃圾回收器就是实现这些算法的工具&#xff0c;这些工具大概是一系列的 C 的类以及其实现的一些对应回…

Linux服务器上跑深度学习实验

原文地址&#xff1a;Linux上跑深度学习实验 目录远程连接环境搭建与服务器断开连接后代码停止之前一直使用Google Colab跑实验&#xff0c;因为实验的规模不大&#xff0c;配合Google Drive用起来就很舒服&#xff0c;但是最近要系统地进行实验&#xff0c;规模一下子上来了&a…

【Spring】一文带你搞懂Spring容器配置

前言 本文为大家介绍的是Spring容器配置相关知识&#xff0c;包含Bean和Configuration的使用&#xff0c;使用 AnnotationConfigApplicationContext实例化Spring容器&#xff0c;Bean注解的使用&#xff0c;Configuration的使用&#xff0c;Import 注解的使用&#xff0c;结合J…

C++中STL-set详解

目录 set/ multiset容器 1. set基本概念 2.set构造和赋值 3.set大小和交换 4.set插入和删除 5.set容器-查找和统计 6.set和multiset的区别 7.pair对组创建 8.set容器排序 9.set存放自定义数据类型 set/ multiset容器 1. set基本概念 简介: 所有元素都会在插入时自动…

使用Apisix打造家庭NAS网关,免公网IP访问

使用Apisix打造家庭NAS网关 本文使用apisix打造家庭NAS网关&#xff0c;并通过cloudflare进行穿透&#xff0c;可免公网IP访问。首先你的NAS支持Docker&#xff0c;没有NAS也没有关系&#xff0c;只要你的电脑支持Docker同样可以参照该教程。 1 依赖资源准备 准备域名: 免费…

HTML+CSS+JS做一个好看的个人网页—web网页设计作业

个人网页设计个人网页&#xff08;htmlcssjs&#xff09;——网页设计作业带背景音乐&#xff08;The way I still Love you&#xff09;、樱花飘落效果、粒子飘落效果页面美观&#xff0c;样式精美涉及&#xff08;htmlcssjs&#xff09;&#xff0c;下载后可以根据自己需求进…

8086,8088CPU管脚,奇偶地址体, 时钟信号发生器8284 ,ready信号,reset复位信号。规则字和非规则字

8086/8088均为40条引线&#xff0c;双列直插式封装&#xff0c;某些引线有多重功能&#xff0c;其功能转换有两种情况&#xff1a;一种是分时复用&#xff0c;一种是按组态定义。 用8088微处理器构成系统时&#xff0c;有两种不同的组态&#xff1a; 最小组态&#xff1a;808…

模型效果不好?推荐你8种机器学习调参技巧

大家好&#xff0c;今天给大家一篇关于机器学习调参技巧的文章 超参数调优是机器学习例程中的基本步骤之一。该方法也称为超参数优化&#xff0c;需要搜索超参数的最佳配置以实现最佳性能。 机器学习算法需要用户定义的输入来实现准确性和通用性之间的平衡。这个过程称为超参…

嵌入式开发学习之--RCC(上)

提示&#xff1a;本篇主要介绍一下不同时钟的特性和作用&#xff0c;了解为主。 文章目录前言一、RCC简介二、系统时钟简介2.1HSE 高速外部时钟信号2.2锁相环 PLL2.3系统时钟 SYSCLK2.4AHB 总线时钟 HCLK2.5 APB2 总线时钟 HCLK22.6 APB1 总线时钟 HCLK1三、其他时钟3.1RTC 时钟…

HTTP 请求是什么?

文章目录HTTP请求一&#xff0c;请求行二&#xff0c;请求头三&#xff0c;空行四&#xff0c;请求体五&#xff0c;HTTP请求示例HTTP请求 请求是由客户端向服务器发送的&#xff0c;一般可以分为请求行、请求头、空行和请求体四个部分&#xff0c;如下图所示&#xff1a; 一…