iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android中转场动画的实现与兼容性处理
  • 156
分享到

Android中转场动画的实现与兼容性处理

兼容兼容性动画Android 2022-06-06 07:06:17 156人浏览 薄情痞子
摘要

前言 在 Android 5.0 之前,我们已经有了 overridePendingTransition() 方法来实现一些转场效果。然而,在 Android 5.0 以后,转

前言

Android 5.0 之前,我们已经有了

overridePendingTransition() 
方法来实现一些转场效果。然而,在 Android 5.0 以后,转场效果更加炫酷。

比如下面的动画:

一、Android L 中的转场动画

实现转场动画只需三步:

       在 res/ 目录下创建 transition 文件夹,在该文件夹下定义界面转场动画和共享元素的动画。

       在 res/value/style 文件中为每个 Activity 指定转场动画的 style ,并在 AndroidManifest.xml 文件中为每个 Activity 设置对应的 android:theme。

       在 Activity 调用

startActivity()
切换动画前,使用 ActivityOptionsCompat 来创建转场动画时的共享对象。
下面就来对这三步进行详细讲解。

二、定义转场动画

在 res/ 目录下创建了 transition 资源文件夹后,就可以在该文件夹下对每一种动画进行定义。

一般来说,对 Activity 定义一个过渡动画可以写成下面的形式:


<explode xmlns:android="Http://schemas.android.com/apk/res/android">
 <targets>
  <target android:excludeId="@android:id/statusBarBackground"/>
  <target android:excludeId="@android:id/navigationBarBackground"/>
 </targets>
</explode>

其中, 是动画效果的名称,Android 5.0(api 级别 21)支持这些进入与退出转换:

       1、分解(explode):从场景中心移入或移出视图。

       2、滑动(slide):从场景边缘移入或移出视图。

       3、淡入淡出(fade):通过调整透明度在场景中增添或移除视图。

而每一种动画效果,都有额外的属性。比如滑动 slide,可以使用

android:slideEdge="top" 
设置滑动的方向;淡入淡出(fade)可以使用
android:fadingMode="fade_in" 
设置具体是淡入(fade_in)还是淡出(fade_out)等。

标签里面定义需要转场(或者不需要转场)的目标 id ,这个 id 可以使系统自带的,也可以是我们自己视图中的 view 的 id,每一个 id 需要单独在 标签中定义,

android:targetId 
表示目标ID需要进行过渡转换的 view,而
 android:excludeId 
表示我们不需要该 ID 的 view 进行过渡转场。上面的那段代码的意思是说,除了状态栏和导航栏以外所有的 view,都执行 explode 动画。

如果我们想要在同一个过渡状态中实现两种或多种动画效果怎么办?也简单,将根标签替换为 ,然后定义每一种动画效果,最后记得在根标签中使用

android:transitionOrdering 
注明这几种动画的演示顺序,sequential 表示顺序执行,而 together 表示同时执行。

比如像下面的代码:


<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
 <slide android:slideEdge="bottom">
  <targets>
   <target android:targetId="@id/cardview"/>
  </targets>
 </slide>
 <fade>
  <targets>
   <target android:excludeId="@android:id/statusBarBackground"/>
   <target android:excludeId="@android:id/navigationBarBackground"/>
   <target android:excludeId="@id/cardview"/>
  </targets>
 </fade>
</transitionSet>

这段代码的意思就很简单了,该 xml 定义了两个过渡动画,并且同时执行。第一个动画是针对 id 为 cardView 的 view 进行滑动,第二个动画将除了状态栏、导航栏和 cardview 以外的 view,进行淡入淡出。

三、为每个 Activity 定义转场样式

这里的每一种动画,指的是在进行界面跳转过渡时,两个界面的状态。比如对于 Activity A 和 Activity B 这两个界面,可能的状态如下:

       1、界面 A 跳转至界面 B :这时界面 A 是退出(exit )过渡状态,而对应的界面B是进入(enter)过渡状态。

       2、界面 B 返回到界面 A :这时界面 A 是重新进入(reenter)过渡,而对应的界面B则是返回(return)过渡。

一般来说,所有的 Activity 过渡动画都可以定义成如下的形式:


<style name="BaseAppTheme" parent="android:Theme.Material">
 <!-- 开启过渡效果 -->
 <item name="android:windowContentTransitions">true</item>
 <!-- 指定界面进入/退出动画效果 -->
 <item name="android:windowEnterTransition">@transition/explode</item>
 <item name="android:windowExitTransition">@transition/explode</item>
 <!-- 指定共享元素进入/退出的动画效果 -->
 <item name="android:windowsharedElementEnterTransition">
 @transition/change_image_transfORM</item>
 <item name="android:windowSharedElementExitTransition">
 @transition/change_image_transform</item>
</style>

当然,你可以不用写全,比如在我的 Demo 中一个界面的转场动画文件如下:


<style name="AppTheme.Detail">
 <item name="windowActionBar">false</item>
 <item name="android:windowNoTitle">true</item>
 <item name="android:windowTranslucentStatus">true</item>
 <item name="android:windowAllowEnterTransitionOverlap">false</item>
 <item name="android:windowEnterTransition">@transition/detail_enter</item>
</style>

四、调用 ActivityOptionsCompat

转场动画是在两个界面的跳转返回时发生的,所以,当使用 intent 跳转界面时,需要调用 ActivityOptionsCompat来指定动画的运行。

一般来说,调用 ActivityOptionsCompat 的模板代码如下:


// 创建一个包含过渡动画信息的 ActivityOptions 对象
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, view, getString(R.string.image_transition_name));
// 使用 Intent 跳转界面,并传递共享对象信息
Intent intent = new Intent(this, DetailActivity.class);
startActivity(intent, optionsCompat.toBundle());

ActivityOptionsCompat 是在support v4 包里面的,其实它是 ActivityOptions 的一个兼容(ActivityOptions是API 16引入的)。

然后,我们需要在第二个 Activity 中,将转场的图片获取并显示到界面中。

多个共享元素的过渡实现

有时候我们需要让多个元素产生动画效果,可以使用 Pair<> 来实现:


ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, Pair.create(view1, "agreedName1"), Pair.create(view2, "agreedName2"));

五、手动实现一个转场动画

现在市面上,Android 5.0 以下的手机系统还有一定的市场份额,所以为了照顾这些用户,我们只能手动实现一下共享元素的转场动画效果。

实现的思路也比较简单,大概的步骤如下:

        1、确定第一个界面的共享元素,将其信息传递个第二个界面

        2、第二个界面接收信息,开始的时候将界面设置为透明,并只显示共享元素。

        3、将第二个界面的共享元素进行动画处理。

那么我们开始一步步实现上面的步骤。

获取共享元素位置信息

在第一个界面中,我们需要获取到共享元素的位置信息,并将其传递给下一个界面。于是乎,我们可以在第一个界面元素点击事件中,这么写:


public void imageClick(View view) {
 Intent intent = new Intent(AnimeActivity.this, AnimeDetailActivity.class);
 // 创建一个 rect 对象来存储共享元素位置信息
 Rect rect = new Rect();
 // 获取元素位置信息
 view.getGlobalVisibleRect(rect);
 // 将位置信息附加到 intent 上
 intent.setSourceBounds(rect);
 CustomImage customImage = (CustomImage) view;
 intent.putExtra(AnimeDetailActivity.EXTRA_IMAGE, customImage.getImageId());
 startActivity(intent);
 // 屏蔽 Activity 默认转场效果
 overridePendingTransition(0, 0);
}

其中,

getGlobalVisibleRect() 
方法的含义是,获取 可见的状态栏高度+可见的标题栏高度+Rect左上角到标题栏底部的距离,如果标题栏被隐藏了,那么可见标题栏高度为0。

接下来,就在在第二个界面接收位置信息并将该图片展示出来了。

模拟转场动画

在第二个界面中,我们需要做如下的操作:

       1、获取上共享元素信息。

       2、计算共享元素缩放比例和位移距离。

       3、调用动画,完成模拟转场效果。

我将上面三个步骤的代码如下。


private void initial() {
 // 获取上一个界面传入的信息
 mRect = getIntent().getSourceBounds();
 mRescourceId = getIntent().getExtras().getInt(EXTRA_IMAGE);
 // 获取上一个界面中,图片的宽度和高度
 mOriginWidth = mRect.right - mRect.left;
 mOriginHeight = mRect.bottom - mRect.top;
 // 设置 ImageView 的位置,使其和上一个界面中图片的位置重合
 FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(mOriginWidth, mOriginHeight);
 params.setMargins(mRect.left, mRect.top - getStatusBarHeight(), mRect.right, mRect.bottom);
 mImageView.setLayoutParams(params);
 // 设置 ImageView 的图片和缩放类型
 mImageView.setImageResource(mRescourceId);
 mImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
 // 根据上一个界面传入的图片资源 ID,获取图片的 Bitmap 对象。
 BitmapDrawable bitmapDrawable = (BitmapDrawable) getResources().getDrawable(mRescourceId);
 Bitmap bitmap = bitmapDrawable.getBitmap();
 // 计算图片缩放比例和位移距离
 getBundleInfo(bitmap);
 // 创建一个 Pallette 对象
 mImagePalette = Palette.from(bitmap).generate();
 // 使用 Palette 设置背景颜色
 mContainer.setBackgroundColor(
   mImagePalette.getVibrantColor(ContextCompat.getColor(this, android.R.color.black)));
}

在12行,通过设置 Margin 的形式来确定图片的位置,需要注意的是,由于状态栏是在父控件 FramLayout 之外的,因此我们要将 Rect.top 的值减去状态栏的高度,这样才是相对于屏幕的绝对位置。然后,

getBundleInfo() 
方法的代码如下:


private void getBundleInfo(Bitmap bitmap) {
 // 计算图片缩放比例,并存储在 bundle 中
 if (bitmap.getWidth() >= bitmap.getHeight()) {
  mScaleBundle.putFloat(SCALE_WIDTH, (float) mScreenWidth / mOriginWidth);
  mScaleBundle.putFloat(SCALE_HEIGHT, (float) bitmap.getHeight() / mOriginHeight);
 } else {
  mScaleBundle.putFloat(SCALE_WIDTH, (float) bitmap.getWidth() / mOriginWidth);
  mScaleBundle.putFloat(SCALE_HEIGHT, (float) mScreenHeight / mOriginHeight);
 }
 // 计算位移距离,并将数据存储到 bundle 中
 mTransitionBundle.putFloat(TRANSITION_X, mScreenWidth / 2 - (mRect.left + (mRect.right - mRect.left) / 2));
 mTransitionBundle.putFloat(TRANSITION_Y, mScreenHeight / 2 - (mRect.top + (mRect.bottom - mRect.top) / 2));
}

动画处理

最后我们需要使用动画来模拟转场效果,代码如下:


private void runEnterAnim() {
 mImageView.animate()
    .setInterpolator(DEFAULT_INTERPOLATOR)
    .setDuration(DURATION)
    .scaleX(mScaleBundle.getFloat(SCALE_WIDTH))
    .scaleY(mScaleBundle.getFloat(SCALE_HEIGHT))
    .translationX(mTransitionBundle.getFloat(TRANSITION_X))
    .translationY(mTransitionBundle.getFloat(TRANSITION_Y))
    .start();
}

很简单,自此,入场动画效果基本模拟完毕。

而退场动画就更简单了,直接上代码:


private void runExitAnim() {
 mImageView.animate()
    .setInterpolator(DEFAULT_INTERPOLATOR)
    .setDuration(DURATION)
    .scaleX(1)
    .scaleY(1)
    .translationX(0)
    .translationY(0)
    .withEndAction(new Runnable() {
     @Override
     public void run() {
      finish();
      overridePendingTransition(0, 0);
     }
    })
    .start();
}

总结

以上就是Android中实现转场动画的全部内容,所以,是不是很简单?希望这篇文章的内容对各位Android开发者们能有所帮助,如果有疑问大家可以留言交流。

您可能感兴趣的文章:Android使用Circular Reveal动画让页面跳转更炫酷Android实现移动小球和CircularReveal页面切换动画实例代码Android5.0之Activity的转场动画的示例详解Android(共享元素)转场动画开发实践Android工具栏顶出转场动画的实现方法实例android获取当前运行Activity名字的方法Android Activity切换(跳转)时出现黑屏的解决方法 分享Android实现Activity界面切换添加动画特效的方法android Activity相对布局的使用方法Android实现Reveal圆形Activity转场动画的完整步骤


--结束END--

本文标题: Android中转场动画的实现与兼容性处理

本文链接: https://www.lsjlt.com/news/23646.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • android转场动画怎么实现
    要实现Android转场动画,可以使用Android提供的转场动画框架或自定义转场动画。1. 使用Android转场动画框架:- 在...
    99+
    2023-08-17
    android
  • PHP Session 跨域与浏览器兼容性的兼容处理
    随着互联网的发展,跨域访问已经成为一个常见的需求。然而,由于浏览器的同源策略限制,导致在跨域访问时出现了一些问题。其中,与浏览器的兼容性和 PHP Session 的跨域问题是开发中常遇到的难题。本文将介绍如何处理这些问题,并提供具体的代码...
    99+
    2023-10-21
    PHP 跨域 兼容处理
  • Android应用中实现属性动画的原理是什么
    今天就跟大家聊聊有关Android应用中实现属性动画的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android动画概述:Android 的动画可以分为三种:View 动...
    99+
    2023-05-31
    android 画的 roi
  • 如何利用CSS实现超酷炫的转场动画
    本篇内容主要讲解“如何利用CSS实现超酷炫的转场动画”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何利用CSS实现超酷炫的转场动画”吧!转场动画一首先,我们来...
    99+
    2024-04-02
  • Android实现旋转动画的方式代码分享
    这篇文章主要介绍“Android实现旋转动画的方式代码分享”,在日常操作中,相信很多人在Android实现旋转动画的方式代码分享问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android实现旋转动画的方式代...
    99+
    2023-06-20
  • Android中实现ProgressBar菊花旋转进度条的动画效果
    在一些常见到的加载中需要显示一个加载动画,如旋转的菊花,旋转的圈圈等等动画…,然后我们现在就来说下怎么去试下它吧 一.菊花的旋转动画 1.新建一个drawable文件 在res/d...
    99+
    2024-04-02
  • Android中分析Jetpack Compose动画内部的实现原理
    目录前言正文总结前言 Compose的动画Api用起来很简单,效果看起来很神奇,那么它内部到底是如何运转的呢 使用动画的代码示例: var isOffset by remember ...
    99+
    2024-04-02
  • JS实现动画中的布局转换
    在用JS编写动画的时候,经常用会到布局转换,即在运动前将相对定位转为绝对定位,然后执行动画函数。下面给大家分享一个运用原生JS实现的布局转换的Demo,效果如下: 以下是代码实现,...
    99+
    2024-04-02
  • Android实现旋转动画的两种方式案例详解
    目录练习案例效果展示前期准备自定义 View java代码编写方法一方法二易错点总结:练习案例 视差动画 - 雅虎新闻摘要加载 效果展示 前期准备 第一步:准备好颜色数组 res ...
    99+
    2024-04-02
  • css3实现动画效果且兼容多浏览器的简单导航条
    本篇内容主要讲解“css3实现动画效果且兼容多浏览器的简单导航条”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css3实现动画效果且兼容多浏览器的简单导航条”吧...
    99+
    2024-04-02
  • 自定义golang函数实现与第三方库的兼容性
    答案: 自定义 go 函数可以实现与第三方库的兼容性,通过定义接口、实现接口和使用适配器模式。定义明确的接口,描述自定义函数的功能。实现自定义函数,遵循定义的接口。使用适配器模式将自定义...
    99+
    2024-04-27
    编程 java php golang
  • C#开发中如何处理跨平台的兼容性问题
    C#开发中如何处理跨平台的兼容性问题,需要具体代码示例随着移动设备和云计算的快速发展,软件开发越来越多地需要考虑跨平台的兼容性问题。C#作为一种常用的编程语言,也需要面对这个挑战。在本文中,我们将讨论一些常见的跨平台兼容性问题,并提供一些处...
    99+
    2023-10-22
    兼容性处理 跨平台适配 C#开发跨平台
  • Android应用中实现动画的方式有哪些
    今天就跟大家聊聊有关Android应用中实现动画的方式有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android 动画实现几种方案一、逐帧动画(Frame Animation...
    99+
    2023-05-31
    android 画的 roi
  • HTML5中进度条progress元素及兼容性处理的示例分析
    HTML5中进度条progress元素及兼容性处理的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、progress元素基本了解1....
    99+
    2024-04-02
  • Java打包中如何处理Apache和Laravel的版本兼容性问题?
    随着技术的不断发展,Java和Laravel这两个开发工具的使用越来越广泛,但是在实际应用中,我们经常会遇到版本兼容性的问题。尤其是在打包过程中,如何保证Apache和Laravel的版本兼容性就成为了一个需要解决的难题。本文将为大家介绍...
    99+
    2023-10-15
    打包 apache laravel
  • css3中实现动画效果的属性是哪个
    小编给大家分享一下css3中实现动画效果的属性是哪个,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • vue中引入mousewheel事件及兼容性处理方式的示例分析
    小编给大家分享一下vue中引入mousewheel事件及兼容性处理方式的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!引入mousewheel事件及兼容性处理项目实现过程中需要对一个已经有纵向滚动条的table表格...
    99+
    2023-06-29
  • 如何在Java中使用HTTP并发处理,同时保证JavaScript的兼容性?
    随着互联网的快速发展,以及Web应用程序的广泛使用,HTTP并发处理成为了开发人员必须掌握的技能之一。在Java中,我们可以使用多种方法来实现HTTP并发处理,但是同时还要保证JavaScript的兼容性,这就需要我们在编写代码的过程中注意...
    99+
    2023-09-06
    http 并发 javascript
  • ios开发中如何实现模态跳转的动画设置
    这篇文章主要介绍ios开发中如何实现模态跳转的动画设置,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!模态跳转的动画设置设置模态跳转的动画,系统提供了四种可供选择DetailViewC...
    99+
    2024-04-02
  • Golang与FFmpeg: 实现实时视频流转发与处理的技术
    Golang与FFmpeg可以一起使用来实现实时视频流转发和处理的技术。Golang是一种高效的编程语言,而FFmpeg是一个强大的...
    99+
    2023-10-08
    Golang
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作