Android T窗口动画显示和退出流程(更新中)

news2024/11/27 12:52:02

如何创建一个窗口动画?我们通过先从APP创建一个窗口,以这个窗口的创建过程的窗口动画为例
请添加图片描述

这个demo就是点击BUTTON显示窗口,点击CLOSE WINDOW关闭窗口,下面简述关键代码

//定义WindowManager和LayoutParams
private WindowManager mWindowManager;
private WindowManager.LayoutParams mLayoutParams;

//取得系统窗体
mWindowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
//窗体的布局样式
mLayoutParams = new WindowManager.LayoutParams();
//窗口设置动画
mLayoutParams.windowAnimations = R.style.MyWindow;
//设置窗口名字
mLayoutParams.setTitle("test-window");

在res/values/styles.xml目录下添加styles

<style name="MyWindow">
    <item name="android:windowEnterAnimation">@anim/enter</item>
    <item name="android:windowExitAnimation">@anim/exit</item>
</style>

创建res/anim/enter.xml和res/anim/exit.xml

enter.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="0"
        android:toAlpha="1.0"
        android:duration="1000"/>
</set>

设置透明度从0到1
exit.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="1.0"
        android:toAlpha="0"
        android:duration="1000"/>
</set>

设置透明度从1到0
这两个xml都只是简单的做了一个透明度变化,实现了一个淡入淡出的效果

分析思路

我们如何知道上面的demo所涉及的动画在我们framework侧的哪个部分?

图层

根据上面的demo我们看看在图层上是怎么显示的
在这里插入图片描述
我们点击BUTTON后显示窗口,从图层中可以看到WindowToken和我们创建的窗口test-window中间添加了一个动画Surface(name=2257b8c test-window)/@0x825faea - animation-leash of window_animation#529。同时我们也能看到test-window的color : r:-1.000 g:-1.000 b:-1.000 a:0.193603515625,其中a:0.193603515625表示透明度,透明度从0逐渐到1就是从透明到显示的过程。
在这里插入图片描述
透明度为1时动画退出,窗口完全显示;窗口的移除流程同理,唯一不同的就是透明度从1到0,透明度为0时动画移除,窗口完全退出。
也就是说动画的显示过程就是为其显示的窗口和这个该窗口的父窗口之前添加一个层级用于显示动画;动画播放完成后,再移除这个层级。

代码

从上面的例子来看,不论是窗口显示还是隐藏,都会有类似于Surface(name=2257b8c test-window)/@0x825faea - animation-leash of window_animation#529的动画,那么我们就可以通过这点切入查找相应的代码,dump信息在代码中基本都有迹可循,搜索animation-leash
在这里插入图片描述
找到对应代码位置frameworks/base/services/core/java/com/android/server/wm/SurfaceAnimator.java在这里插入图片描述我们可以在createAnimationLeash方法中添加堆栈来查看其调用流程
android.util.Log.i("WindowManager:","createAnimationLeash type = "+animationTypeToString(type),new Exception());
也可以使用走读代码的方式追踪

堆栈

window动画显示

3-16 22:32:26.512   563   584 I WindowManager: createAnimationLeash type = window_animation
03-16 22:32:26.512   563   584 I WindowManager: java.lang.Exception
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.SurfaceAnimator.createAnimationLeash(SurfaceAnimator.java:458)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.SurfaceAnimator.startAnimation(SurfaceAnimator.java:184)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowContainer.startAnimation(WindowContainer.java:2757)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowContainer.startAnimation(WindowContainer.java:2764)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowContainer.startAnimation(WindowContainer.java:2770)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowState.startAnimation(WindowState.java:5305)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowState.startAnimation(WindowState.java:5281)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowStateAnimator.applyAnimationLocked(WindowStateAnimator.java:655)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowStateAnimator.applyEnterAnimationLocked(WindowStateAnimator.java:583)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowState.performShowLocked(WindowState.java:4648)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowStateAnimator.commitFinishDrawingLocked(WindowStateAnimator.java:276)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.DisplayContent.lambda$new$8$com-android-server-wm-DisplayContent(DisplayContent.java:987)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.DisplayContent$$ExternalSyntheticLambda14.accept(Unknown Source:4)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowContainer$ForAllWindowsConsumerWrapper.apply(WindowContainer.java:2629)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowContainer$ForAllWindowsConsumerWrapper.apply(WindowContainer.java:2619)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowState.applyInOrderWithImeWindows(WindowState.java:4904)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowState.forAllWindows(WindowState.java:4748)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1616)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1616)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1616)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1616)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1616)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1616)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1616)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1633)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.DisplayContent.applySurfaceChangesTransaction(DisplayContent.java:4666)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.RootWindowContainer.applySurfaceChangesTransaction(RootWindowContainer.java:1021)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:824)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:784)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:177)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:126)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:115)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:57)
03-16 22:32:26.512   563   584 I WindowManager: 	at android.os.Handler.handleCallback(Handler.java:942)
03-16 22:32:26.512   563   584 I WindowManager: 	at android.os.Handler.dispatchMessage(Handler.java:99)
03-16 22:32:26.512   563   584 I WindowManager: 	at android.os.Looper.loopOnce(Looper.java:201)
03-16 22:32:26.512   563   584 I WindowManager: 	at android.os.Looper.loop(Looper.java:288)
03-16 22:32:26.512   563   584 I WindowManager: 	at android.os.HandlerThread.run(HandlerThread.java:67)
03-16 22:32:26.512   563   584 I WindowManager: 	at com.android.server.ServiceThread.run(ServiceThread.java:44)

window动画退出

03-16 22:32:30.315   563   919 I WindowManager: createAnimationLeash type = window_animation
03-16 22:32:30.315   563   919 I WindowManager: java.lang.Exception
03-16 22:32:30.315   563   919 I WindowManager: 	at com.android.server.wm.SurfaceAnimator.createAnimationLeash(SurfaceAnimator.java:458)
03-16 22:32:30.315   563   919 I WindowManager: 	at com.android.server.wm.SurfaceAnimator.startAnimation(SurfaceAnimator.java:184)
03-16 22:32:30.315   563   919 I WindowManager: 	at com.android.server.wm.WindowContainer.startAnimation(WindowContainer.java:2757)
03-16 22:32:30.315   563   919 I WindowManager: 	at com.android.server.wm.WindowContainer.startAnimation(WindowContainer.java:2764)
03-16 22:32:30.315   563   919 I WindowManager: 	at com.android.server.wm.WindowContainer.startAnimation(WindowContainer.java:2770)
03-16 22:32:30.315   563   919 I WindowManager: 	at com.android.server.wm.WindowState.startAnimation(WindowState.java:5305)
03-16 22:32:30.315   563   919 I WindowManager: 	at com.android.server.wm.WindowState.startAnimation(WindowState.java:5281)
03-16 22:32:30.315   563   919 I WindowManager: 	at com.android.server.wm.WindowStateAnimator.applyAnimationLocked(WindowStateAnimator.java:655)
03-16 22:32:30.315   563   919 I WindowManager: 	at com.android.server.wm.WindowState.removeIfPossible(WindowState.java:2600)
03-16 22:32:30.315   563   919 I WindowManager: 	at com.android.server.wm.WindowState.removeIfPossible(WindowState.java:2498)
03-16 22:32:30.315   563   919 I WindowManager: 	at com.android.server.wm.WindowManagerService.removeWindow(WindowManagerService.java:2033)
03-16 22:32:30.315   563   919 I WindowManager: 	at com.android.server.wm.Session.remove(Session.java:223)
03-16 22:32:30.315   563   919 I WindowManager: 	at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:684)
03-16 22:32:30.315   563   919 I WindowManager: 	at com.android.server.wm.Session.onTransact(Session.java:175)
03-16 22:32:30.315   563   919 I WindowManager: 	at android.os.Binder.execTransactInternal(Binder.java:1285)
03-16 22:32:30.315   563   919 I WindowManager: 	at android.os.Binder.execTransact(Binder.java:1244)

动画添加流程

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

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

相关文章

小米智能电视投屏方法

小米智能电视也提供了投屏功能。 使用遥控器&#xff0c;在应用中找到它&#xff0c;点击进入。 小米电视支持windows笔记本&#xff0c;macbook笔记本&#xff0c;iphone手机&#xff0c;安卓手机投屏。 windows笔记本投屏 在投屏应用中找到windows投屏&#xff0c;选中开…

统信UOS_麒麟KYLINOS创建网页桌面快捷方式

原文链接&#xff1a;统信UOS/麒麟KYLINOS创建网页桌面快捷方式 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇使用命令行在统信UOS/麒麟KYLINOS创建网页桌面快捷方式的文章&#xff0c;主要用于构建云桌面模板及镜像模板的时候使用&#xff0c;欢迎大家浏览分享转…

2023最新版JavaSE教程——第4天:流程控制语句之循环语句

目录 一、循环语句二、for循环2.1 基本语法2.2 应用举例2.3 练习 三、while循环3.1 基本语法3.2 应用举例3.3 练习 四、do-while循环4.1 基本语法4.2 应用举例4.3 练习4.4 对比三种循环结构4.5 "无限"循环4.5.1 基本语法4.5.2 应用举例 4.6 嵌套循环(或多重循环)4.6.…

农产品展示预约小程序的内容是什么

农产品可以分为多个类目&#xff0c;对农场、农产品经销商家来说&#xff0c;除了线下开店外&#xff0c;线上也同样不能放松经营&#xff0c;面对线下多种困境&#xff0c;运用线上发展可以节约人力物力成本&#xff0c;提升整体经营效率。 1、品牌传播展示难 农产品种类较多…

Halcon如何对数组进行去重的操作?

例如一个数组里面&#xff0c;有1,1,2,2,3,4,5,6的值&#xff0c;但是现在不需要重复的值&#xff0c;只需要1,2,3,4,5,6。 可以做如下操作&#xff1a; A:[1,1,2,2,3,4,5,6] B : uniq(sort(A)) 运行结果&#xff1a; 数组B里面就没有重复的值了。

mysql之子表查询、视图、连接查询

1、子查询返回的结果只能是某列&#xff0c;不能是多列。where条件in什么&#xff0c;子查询的列就是什么 &#xff08;1&#xff09;多表联查&#xff08;不要超过3张表&#xff09;重点 ①in包含 ②not in取反&#xff08;加上where条件过滤&#xff0c;否则没意义&#xff…

CRM和小企业CRM,有什么区别?

在CRM领域我们有两条产品线&#xff0c;一个是CRM&#xff0c;另一个是小企业CRM&#xff08;Bigin&#xff09;。您可以把Bigin看成Zoho CRM系统的副线&#xff0c;用来满足更小规模和初级发展阶段的企业&#xff0c;以更加全面的产品和解决方案服务市场。那么CRM和小企业CRM该…

Java-Swing程序设计

文章目录 Swing概述Swing常用窗体1、JFrame窗体2、JDialog对话框3、JOptionPane小型对话框 常用布局管理器1、null绝对布局2、FlowLayout流 布局管理器3、BorderLayout 边界 布局管理器4、GridLayout 网格布局管理器 常用面板JScrollPane滚动面板 文字标签组件与图标1、JLabrl标…

外贸SEO是什么?海洋建站SEO优化最新指南?

外贸SEO主要做什么工作&#xff1f;如何做好外贸SEO优化推广&#xff1f; 为了在激烈的国际竞争中脱颖而出&#xff0c;外贸SEO已经成为一个至关重要的策略。海洋建站将深入探讨外贸SEO是什么以及外贸网站SEO优化的最新指南&#xff0c;以帮助您更好地理解并实施这一关键战略。…

gpt网站资源分享

gpt网站 gpt网站 下面是一个扫码跳转的图片&#xff1a; 里面有3.5和4模型&#xff0c;目前有免费体验&#xff0c;大家可以试试

功率放大器模块工作原理介绍

功率放大器模块是一种用于增强信号功率的电子设备&#xff0c;通常应用于无线通信、雷达和医疗设备等领域。它的主要作用是将输入信号放大到足够的水平&#xff0c;以便实现更高的输出功率。在本文中&#xff0c;我们将介绍功率放大器模块的工作原理。 图&#xff1a;ATA-M210高…

如何批量下载iconfont图标库

如何批量下载iconfont中svg图 原文链接&#xff1a; https://gitee.com/veigarchen/iconfont-download 1、下载插件到本地 2、将解压的文件添加到浏览器扩展中 3、按需下载自己的图标

第三章:人工智能深度学习教程-基础神经网络(第三节-Tensorflow 中的多层感知器学习)

在本文中&#xff0c;我们将了解多层感知器的概念及其使用 TensorFlow 库在 Python 中的实现。 多层感知器 多层感知也称为MLP。它是完全连接的密集层&#xff0c;可将任何输入维度转换为所需的维度。多层感知是具有多个层的神经网络。为了创建神经网络&#xff0c;我们将神…

11.9树的表示方法(孩子,父亲,孩子兄弟),树、森林的遍历,一些操作,决策树,前缀树

父亲表示法 优缺点&#xff1a;利用了树中除根结点外每个结点都有唯一的父节点这个性质&#xff0c;很容易找到树根&#xff0c;但是找孩子需要遍历整个线性表。 最近公共祖先 第一种方法&#xff0c;找路径然后比较 如果是搜索树&#xff0c;可以二分查找 不是&#xff0c;…

5年测试经验之谈:2年功能测试、3年自动化测试,从入门到25k...

毕业3年了&#xff0c;学的是环境工程专业&#xff0c;毕业后零基础转行做软件测试。 已近从事测试行业8年了&#xff0c;自己也从事过2年的手工测试&#xff0c;从事期间越来越觉得如果一直在手工测试的道路上前进&#xff0c;并不会有很大的发展&#xff0c;所以通过自己的努…

WordPress Modown 6.2付费下载资源/付费查看内容 wp主题模板+erphpdown11.7

模板简介&#xff1a; 自适应响应式设计&#xff0c;兼容主流浏览器 网格样式与瀑布流样式任意切换 内置SEO优化 自带与主题UI完美兼容搭配的erphpdown前端用户中心页面&#xff08;此功能若单独找我们定制也需要几百&#xff09; 收费付费下载资源、付费查看内容、付费观看…

FRC-EP系列--你的汽车数据一站式管家

FRC-EP系列产品主要面向汽车动力总成测试的客户&#xff0c;主要应用方向为残余总线仿真及网关。本文将详细介绍FRC-EP的产品特性和应用场景。 应用场景&#xff1a; 汽车电子生成研发过程中&#xff0c;需要对汽车各个控制器进行仿真测试&#xff0c;典型的测试对象有&#…

通达OA V12 引入thinkphp5.1框架,读取OA的.ini文件

通达OA V12 引入thinkphp5.1框架&#xff0c;读取OA的.ini文件 内容绝对原创&#xff0c;希望对您有帮助。您的打赏&#xff0c;是让我持续更新的牛奶和面包 找到ini文件的绝对路径。$path“”;使用parse_ini_file($path,true,INI_SCANNER_RAW)&#xff0c;读取ini文件。 代码如…

Leetcode543. 二叉树的直径

Every day a Leetcode 题目来源&#xff1a;543. 二叉树的直径 解法1&#xff1a;深度优先搜索 首先我们知道一条路径的长度为该路径经过的节点数减 1&#xff0c;所以求直径&#xff08;即求路径长度的最大值&#xff09;等效于求路径经过节点数的最大值减 1。 而任意一条…

Python堆栈详细介绍

概要 虽然一些数据结构是通用的并且可以在广泛的应用中使用&#xff0c;但其他数据结构是专门化的并且被设计用于处理特定问题。堆栈就是这样一种专门的结构&#xff0c;以其简单性和非凡的实用性而闻名。 那么&#xff0c;什么是栈呢&#xff1f;从本质上讲&#xff0c;堆栈…