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

如何创建一个窗口动画?我们通过先从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可见附件,或者APP窗口透明渐变动画demo

分析思路

我们如何知道上面的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.mfbz.cn/a/130000.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

redis数据倾斜如何解决

Redis数据倾斜主要是由于数据访问热点导致的&#xff0c;通常在执行事务操作或范围查询时发生。这会导致大量数据集中在某个实例上&#xff0c;使得集群负载不均衡。以下是一些解决Redis数据倾斜的方法&#xff1a; 避免在同一个键值对上保存过多的数据。可以将大的键值对拆分…

Java 算法篇-深入理解递归(递归实现:青蛙爬楼梯)

&#x1f525;博客主页&#xff1a; 小扳_-CSDN博客 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 递归的说明 2.0 用递归来实现相关问题 2.1 递归 - 阶乘 2.2 递归 - 反向打印字符串 2.3 递归 - 二分查找 2.4 递归 - 冒泡排序 2.5 递归 - 冒泡排序2.0 2.6 递归 - 插…

启动Docker服务后显示Docker Engine stopped

1、重新启动Docker服务&#xff1a;打开Windows服务管理器&#xff08;可以在开始菜单中搜索&#xff09;&#xff0c;找到"Docker Desktop Service"或类似命名的服务&#xff0c;右键单击并选择"重启"。稍等片刻&#xff0c;看看是否重新启动成功 2、尝试…

如何快速落地LLM应用?通过Langchain接入千帆SDK

百度智能云千帆大模型平台再次史诗级升级&#xff01;在原有API基础上&#xff0c;百度智能云正式上线Python SDK&#xff08;下文均简称千帆 SDK&#xff09;版本并全面开源&#xff0c;企业和开发者可免费下载使用&#xff01;千帆SDK全面覆盖从数据集管理&#xff0c;模型训…

如何利用软文推广提升消费者“购买力”?

企业软文推广的目的大部分是为了将自己的产品卖出去&#xff0c;想要成功卖出去还得将重心放在消费者身上&#xff0c;今天媒介盒子就来分享&#xff0c;如何利用软文推广提升消费者的“购买力”。 一、 研究产品属性 产品是连接企业和消费者的桥梁&#xff0c;要想将产品卖出…

黄执中老师人际说服课思考总结(个人笔记整理 ②)

前言&#xff1a; 沟通和说服的区别&#xff1a;为什么沟通不能解决问题&#xff0c;处于劣势的一方&#xff08;承受问题的那方&#xff09;才想去沟通&#xff08;对方没有沟通动力&#xff09;。说服是温柔而有力的学科 - 劣势一方的武器。 说服是一门影响人的学问&#xff…

SQL Server 2022 安装步骤——SQL Server设置身份验证教程

目录 前言: 安装详细步骤: 第一步: 第二步: 第三步: 第四步: SQL Server 连接的方式: Window验证: SQL Server验证: 两者之间区别: 总结: SQL Server身份验证登录配置教程:​ 第一步: 第二步: 第三步: 番外篇: 前言: 本文讲解&#xff0c;如何安装SQL Server安…

自媒体项目详述

总体框架 本项目主要着手于获取最新最热新闻资讯&#xff0c;以微服务构架为技术基础搭建校内仅供学生教师使用的校园新媒体app。以文章为主线的核心业务主要分为如下子模块。自媒体模块实现用户创建功能、文章发布功能、素材管理功能。app端用户模块实现文章搜索、文章点赞、…

一分钟秒懂人工智能对齐 ( 文末送书 )

人工智能对齐 什么是人工智能对齐为什么要研究人工智能对齐人工智能对齐的常见方法延伸阅读写在末尾&#xff1a; 主页传送门&#xff1a;&#x1f4c0; 传送 什么是人工智能对齐 人工智能对齐&#xff08;AI Alignment&#xff09;指让人工智能的行为符合人的意图和价值观。 …

三季度净利润高达28.1亿元,2023的理想“高开高走”?

最近&#xff0c;理想汽车的好消息接二连三&#xff0c;先是月交付量突破四万辆大关。紧接着11月9日发布的2023年第三季度财报显示&#xff0c;理想汽车实现第三季度营收346.8亿人民币&#xff0c;同比增长271.2%。 今年以来&#xff0c;理想汽车的整体走势可谓“高开高走”。…

【JAVA学习笔记】65 - 文件类,IO流--节点流、处理流、对象流、转换流、打印流

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter19/src/com/yinhai 文件 一、文件&#xff0c;流 文件,对我们并不陌生&#xff0c;文件是保存数据的地方,比如大家经常使用的word文档,txt文件,excel文件..都是文件。它既可以保存一张图片…

归并排序 图解 递归 + 非递归 + 笔记

前置知识&#xff1a;讲解019-算法笔试中处理输入和输出&#xff0c;讲解020-递归和master公式 (1)左部分排好序&#xff0c;右部分排好序&#xff0c;利用merge过程让左右整体有序(2)merge过程:谁小拷贝谁&#xff0c;直到左右两部分所有的数字耗尽(3)递归实现和非递归实现(4…

NFT合约部署

部署合约&#xff1a; 1.web3 NFT合约部署工具 https://remix.ethereum.org/ 2.tron NFT合约部署工具 https://www.tronide.io/ 3.部署 web3 ERC721代码&#xff1a; // SPDX-License-Identifier: MIT pragma solidity ^0.8.2;import "openzeppelin/contracts/token/ERC7…

【java:牛客每日三十题总结-4】

java:牛客每日三十题总结 总结如下 总结如下 集合相关知识点 元素是否排序和插入顺序无关&#xff0c;取决与集合实现是否考虑了传入对象的java.lang.Comparable接口抽象类和接口相关知识 只能说越来越抽象了 java线程通信的方式 在Java中&#xff0c;常用的线程通信方式有两…

Leetcode_3:Pow(x,n)

题目描述&#xff1a; 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000示例 2&#xff1a; 输入&#xff1a;x 2.10000, n 3 输出&#xff1a;9.26100示例 3&#xff1a; 输入&…

Android 多点触控

三种类型 :接力型 /配合型 /单独型 单点触控 package com.example.myapplication.viewimport android.content.Context import android.graphics.Canvas import android.graphics.Paint import android.util.AttributeSet import android.view.MotionEvent import android.vi…

剑指offer(C++)-JZ21:调整数组顺序使奇数位于偶数前面(一)(算法-其他)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 题目描述&#xff1a; 输入一个长度为 n 整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有的奇数…

d3.js

D3&#xff1a;Data-Driven Documents • 通过D3提供的接口来基于数据操控文档的各个图元。 标题对于D3(本讲解)最为重要的标签&#xff0c;主要操作的对象(画布) HTML - 导入D3.js D3.js作为JavaScript的外库&#xff0c;必须先将其导入&#xff0c;如&#xff1a; Python的…

Android 图层列表 、 LayerDrawable 、 layer-list \ 改变 seekbar thumb 滑块 的颜色

android 官网 &#xff1a; 图层列表 LayerDrawable / layer-list LayerDrawable 是管理其他可绘制对象数组的可绘制对象。列表中的每个可绘制对象均按照列表顺序绘制。列表中的最后一个可绘制对象绘于顶部。 每个可绘制对象均由单个 <layer-list> 元素内的 <item>…