Android 场景Scene的使用

news2024/9/25 23:20:45

Scene 翻译过来是场景,开发者提供起始布局和结束布局,就可以实现布局之间的过渡动画。

具体可参考 使用过渡为布局变化添加动画效果

大白话,在 Activity 的各个页面之间切换,会带有过渡动画。

打个比方,使用起来类似 Fragment ,单 Activity 多 Fragment 的情景下,为 Fragment 之间的切换添加过渡动画。

Scene 是布局之间的过渡动画,不是 Activity 之间的切换动画。

布局文件创建 Scene

主页面布局,FrameLayout 是 Scene 的父控件,以 include 的方式包含 scene1,也就是默认显示 scene1。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".scene.SceneActivity">

    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent">

        <Button
            android:id="@+id/button_scene1"
            android:text="scene 1"
            android:onClick="onSceneButtonClick"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"/>

        <Button
            android:id="@+id/button_scene2"
            android:text="scene 2"
            android:onClick="onSceneButtonClick"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"/>

        <Button
            android:id="@+id/button_scene3"
            android:text="scene 3"
            android:onClick="onSceneButtonClick"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"/>

        <Button
            android:id="@+id/button_scene4"
            android:text="scene 4"
            android:onClick="onSceneButtonClick"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"/>

        <Button
            android:id="@+id/button_scene5"
            android:text="scene 5"
            android:onClick="onSceneButtonClick"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"/>

    </LinearLayout>

    <FrameLayout
        android:id="@+id/scene_root"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/linearLayout"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <include layout="@layout/scene1" />
    </FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

scene1 的布局,很简单,设置颜色和 Button 。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scene_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/purple_200">

    <Button
        android:text="Scene1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        />

</RelativeLayout>

其他 Scene 也类似,其他 Scene 的根布局 id 也是 android:id=“@+id/scene_container” ,就颜色和文本不同, 就不贴代码了。

初始化 Scene

通过 findViewById 找到默认的 scene1 ,

其他 Scene 用 getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context) 方法创建,

public class SceneActivity extends AppCompatActivity {

    private Scene scene1, scene2 , scene3 , scene4 , scene5;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scene);
        Objects.requireNonNull(getSupportActionBar()).setTitle(SceneActivity.class.getSimpleName());

        ViewGroup mSceneRoot = (ViewGroup) findViewById(R.id.scene_root);
        scene1 = new Scene(mSceneRoot, (ViewGroup) mSceneRoot.findViewById(R.id.scene_container));

        scene2 = Scene.getSceneForLayout(mSceneRoot, R.layout.scene2, SceneActivity.this);
        scene3 = Scene.getSceneForLayout(mSceneRoot, R.layout.scene3, SceneActivity.this);
        scene4 = Scene.getSceneForLayout(mSceneRoot, R.layout.scene4, SceneActivity.this);
        scene5 = Scene.getSceneForLayout(mSceneRoot, R.layout.scene5, SceneActivity.this);

    }
}

在 Scene 之间切换

即切换不同的 Scene ,本例 5 个 button ,点击 buttonX 就切换到 SceneX 。

用默认过渡动画切换

切换用 androidx.transition.TransitionManager.go(Scene scene) 方法,切换到目标 Scene 。

这样,在 Scene 之间切换就会自带动画了,比 View.setVisibility(int visibility) 方式更丝滑、好看。

用自定义过渡动画切换

androidx.transition.TransitionManager.go(Scene scene, Transition transition) 方法,创建自定义 Transition 。

创建过渡动画 xml

创建 res/transition/ 目录,
在这里插入图片描述
选择 transition ,
在这里插入图片描述

不得不说 AS 是真的很 6 。

创建 res/transition/transition1.xml 、res/transition/transition2.xml 文件,

transition2.xml 内容

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
    android:transitionOrdering="sequential">
    <fade android:fadingMode="fade_out" />
    <changeBounds />
    <fade android:fadingMode="fade_in" />
</transitionSet>

transition1.xml 里的内容注释掉了,为了方便看有无过度动画的差别。

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <!--<changeBounds />-->
    <!--<fade android:fadingMode="fade_in_out"/>-->
</transitionSet>

初始化Transition

初始化 Transition ,

import androidx.transition.Transition;
import androidx.transition.TransitionInflater;

private Transition transition1 , transition2 ;

transition1 = TransitionInflater.from(this).inflateTransition(R.transition.transition1);
transition2 = TransitionInflater.from(this).inflateTransition(R.transition.transition2);

切换

	public void onSceneButtonClick(View view){
        switch (view.getId()){
            case R.id.button_scene1:
                TransitionManager.go(scene1);  // 切换到 scene1
                break;
            case R.id.button_scene2: 
                TransitionManager.go(scene2); // 切换到 scene2
                break;
            case R.id.button_scene3:
                //TransitionManager.go(scene3);
                TransitionManager.go(scene3 , transition1); // 切换到 scene3 ,过渡动画用 transition1 ,transition1 为空,实际上无过渡动画
                break;
            case R.id.button_scene4:
                //TransitionManager.go(scene4);
                TransitionManager.go(scene4 , transition2); // 切换到 scene4 ,过渡动画用 transition2
                break;
            case R.id.button_scene5:
                //TransitionManager.go(scene5);
                //TransitionManager.go(scene5 , null); // 切换到 scene5 , 无过渡动画
                break;
            default:break;
        }

    }

监听场景变化

需要在 进入、退出 Scene 时做某些操作,就这样,

scene2.setEnterAction(new Runnable() {
    @Override
    public void run() {
               
    }
});

scene2.setExitAction(new Runnable() {
    @Override
    public void run() {
            
    }
});

gif对比

不加过渡动画 TransitionManager.go(sceneX , null)
在这里插入图片描述

加过渡动画 TransitionManager.go(sceneX)

在这里插入图片描述

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

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

相关文章

回归预测 | MATLAB实现FA-SVM萤火虫算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现FA-SVM萤火虫算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现FA-SVM萤火虫算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍…

《Zookeeper》源码分析(十五)之 选举算法

FastLeaderElection FastLeaderElection实现了接口Election&#xff0c;选举方法为lookForLeader()&#xff0c;选举算法的核心逻辑也在该方法中。 数据结构 构造函数 start() 启动选举通信网络 lookForLeader() 选举核心算法 FastLeaderElection.logicalclock属性用于标…

2023最新红盟云卡个人自动发卡系统源码 全开源

​ 简介&#xff1a; 2023最新红盟云卡个人自动发卡系统源码 全开源 该系统完全开源且无任何加密&#xff0c;可商业使用&#xff0c;并支持个人免签多个接口。 ​ 图片&#xff1a;

2021年03月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;找和为K的两个元素 在一个长度为n(n < 1000)的整数序列中&#xff0c;判断是否存在某两个元素之和为k。 时间限制&#xff1a;1000 内存限制&#xff1a;65536 输入 第一行输入序列的长度n和k&#xff0c;用空格分开。 第二行输入序列中的n个整数&#xff…

Redis 扩展资料

Redis 扩展资料 1.缓存简介2.缓存分类3.常⻅缓存使⽤4.Redis 数据类型和使⽤5.持久化6.常⻅⾯试题7.Redis 集群&#xff08;选学&#xff09; 1.缓存简介 2.缓存分类 3.常⻅缓存使⽤ 4.Redis 数据类型和使⽤ 5.持久化 Redis 和 Memcached 有什么区别&#xff1f; 6.常⻅⾯试…

独立站SEO是什么意思?自主网站SEO的含义?

什么是独立站SEO优化&#xff1f;自建站搜索引擎优化是指什么&#xff1f; 独立站SEO&#xff0c;作为网络营销的重要一环&#xff0c;正在逐渐引起人们的关注。在当今数字化时代&#xff0c;独立站已经成为许多企业、个人宣传推广的首选平台之一。那么&#xff0c;究竟什么是…

【计算机视觉|生成对抗】StackGAN:使用堆叠生成对抗网络进行文本到照片逼真图像合成

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks 链接&#xff1a;[1612.03242] StackGAN: Text to Photo-realistic Image Synthesis…

article-六轴机械臂(带抓手)运动学分析+轨迹规划

1正运动学分析 采用标准的D-h法进行机械腿模型分析&#xff1a; D-h表如下 &#xff08;2&#xff09;通过&#xff08;1&#xff09;求解出机器人各位姿变换矩阵后&#xff0c;求解机器人手臂变换矩阵 ** ** 。通过matlab 计算&#xff0c;写出机器人末端位置。 正运动学分…

爬虫框架- feapder + 爬虫管理系统 - feaplat 的学习简记

文章目录 feapder 的使用feaplat 爬虫管理系统部署 feapder 的使用 feapder是一款上手简单&#xff0c;功能强大的Python爬虫框架 feapder 官方文档 文档写的很详细&#xff0c;可以直接上手。 基本命令&#xff1a; 创建爬虫项目 feapder create -p first-project创建爬虫 …

【ES5和ES6】数组遍历的各种方法集合

一、ES5的方法 1.for循环 let arr [1, 2, 3] for (let i 0; i < arr.length; i) {console.log(arr[i]) } // 1 // 2 // 32.forEach() 特点&#xff1a; 没有返回值&#xff0c;只是针对每个元素调用func三个参数&#xff1a;item, index, arr &#xff1b;当前项&#…

D2: 基于go实现的一个DSL 绘图工具 高手效率神器

在b站看视频的时候, gin框架作作者appleboy 一直在推荐一个绘图工具 大佬认证 肯定有其过人之处 我去各网站收集(chao)了一些关于D2的东西 D2 是一种声明式流程图的领域特定语言 (DSL)&#xff0c;声明式只需要描述你想要的流程图即可&#xff0c;它就会自动生成对应的图像。…

Mac OS下应用Python+Selenium实现web自动化测试

在Mac环境下应用PythonSelenium实现web自动化测试 在这个过程中要注意两点&#xff1a; 1.在终端联网执行命令“sudo pip install –U selenium”如果失败了的话&#xff0c;可以尝试用命令“sudo easy_install selenium”来安装selenium; 2.安装好PyCharm后新建project&…

初体验深信服的云桌面

昨天上午深信服的工程师到这边来安装服务器&#xff0c;本想看一下具体的安装&#xff0c;但是上午有其他事情&#xff0c;没有看成&#xff0c;下午他给我讲了一下具体的使用&#xff0c;我体验了一下深信服的云桌面。 总体感觉管理员的维护和客户的使用都比较方便。 但是可能…

听GPT 讲Prometheus源代码--util

Prometheus的util目录包含了一些通用的工具模块,主要包含以下文件: buckets.go 这个文件定义了一些常用的指标采样值范围(Quantile buckets),如:0.001,0.01,0.05,0.5,0.9,0.95,0.99,0.999等。这些buckets常用于计算指标的分位数线。 regex.go 这个文件定义了一些正则表达式匹配…

Vue 2 访问元素和组件

通过Vue 2 组件基础一文的学习&#xff0c;我们知道组件之间可以通过传递props或事件来进行通信。 但在一些情况下&#xff0c;我们使用下面的方法将更有用。 1.访问根实例 根实例可通过this.$root获取。 我们在所有子组件中都可以像上面那样访问根实例&#xff0c;它就像一…

利用Jackson封装常用的JsonUtil工具类

在实际开发中&#xff0c;我们对于 JSON 数据的处理&#xff0c;通常有这么几个第三方工具包可以使用&#xff1a; gson&#xff1a;谷歌的fastjson&#xff1a;阿里巴巴的jackson&#xff1a;美国FasterXML公司的&#xff0c;Spring框架默认用的 由于以前一直用习惯了阿里的…

OpenLayers实战,OpenLayers判断点位是否与多边形有交集,判断车辆是否在电子围栏内

专栏目录: OpenLayers实战进阶专栏目录 前言 OpenLayers实战,OpenLayers判断点位是否与多边形有交集,可以用于判断车辆是否在电子围栏内,船舶是否在锚泊位中等常用案例。 在实际GIS地图业务开发中,一般是不会在前端实现是否在电子围栏这种计算的。 如果有人让你在前端实…

为什么TCP连接使用使用三次握手规则而不是两次?

TCP使用的是三报文握手来建立连接 当使用两报文握手建立连接时会发生什么样的情况呢&#xff1f; 如上图所示 假设一个TCP连接请求在网络中拥堵了&#xff0c;在规定的时间内未能到达TCP服务器&#xff0c;因此客户端重传该TCP连接请求 在双方建立连接并传输数据后&#xff0c…

基于CentOS7.9安装部署docker(简洁版)

安装部署 1基于官方脚本安装&#xff08;不推荐 不能自行选择版本&#xff09; 官方文档&#xff1a;https://docs.docker.com/engine/install/centos/ 2 使用yum安装 阿里云文档&#xff1a;docker-ce镜像_docker-ce下载地址_docker-ce安装教程-阿里巴巴开源镜像站 # ste…

git拉取远程代码到本地

目录 一、介绍 二、拉取代码到idea操作步骤 三、打通前后端连接的项目例子&#xff08;额外篇&#xff09; 一、介绍 本文是介绍如何从国内码云&#xff08;Gitee&#xff09;或者国外GitHub上面拉起代码项目&#xff08;若依&#xff09;到本地的&#xff0c;是通过idea202…