Android 场景Scene的使用

这篇具有很好参考价值的文章主要介绍了Android 场景Scene的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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/ 目录,
Android 场景Scene的使用,Android,android,Scene
选择 transition ,
Android 场景Scene的使用,Android,android,Scene

不得不说 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)
Android 场景Scene的使用,Android,android,Scene

加过渡动画 TransitionManager.go(sceneX)

Android 场景Scene的使用,Android,android,Scene文章来源地址https://www.toymoban.com/news/detail-660128.html

到了这里,关于Android 场景Scene的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity脚本之场景(Scene)跳转/转换

    Unity的场景跳转需要用到其自带的场景管理类SceneManage。 想要实现场景跳转首先需要在File--Build Settings里将你需要用到的场景添加进去。 打开Build Settings 1.当前已添加的场景与其序号,左边是场景名,右边是序号。打勾即为会使用该场景。 2.将当前正在打开的场景(Scene)加入到

    2024年04月13日
    浏览(38)
  • 计算机视觉:场景识别(Scene Recognition)

    完整程序请移步至此链接下载 在这个项目中,我将对15个场景数据库(Bedroom、Coast、Forest、Highway、Industrial、InsideCity、Kitchen、LivingRoom、Mountain、Office、OpenCountry、Store、Street、Suburb、TallBuilding)进行训练和测试,借助HOG特征提取构建词袋模型,并利用集成学习分类器将场景分

    2024年02月07日
    浏览(36)
  • Android的应用场景

    ### Android的应用场景 Android是一款开放源代码的移动操作系统,广泛应用于各种不同领域的移动设备和应用程序。以下是Android的一些主要应用场景: 1. **智能手机和平板电脑**:Android是智能手机和平板电脑最主要的操作系统之一。它为用户提供了丰富的应用程序和功能,包括

    2024年02月05日
    浏览(34)
  • 【Unity3D】使用 FBX 格式的外部模型 ( 向 Unity 中添加 FBX 模型 | 向 Scene 场景中添加 FBX 模型 | 3D 物体渲染 | 3D 物体材质设置 )

    Unity 中使用的 3D 模型格式为 FBX , 使用如下建模软件 可制作该类型模型 : 3Dmax Maya ZBrush Cinema4D Blender 建模完成后 , 将 3D 模型导出为 FBX ( .fbx ) 格式 即可在 Unity 中使用 ; 在 Project 文件窗口 中的 Asstes 目录 下 , 创建一个模型目录 Models , 将 模型文件直接从文件系统中拖到该目录中

    2023年04月15日
    浏览(82)
  • 51 -25 Scene as Occupancy,场景作为占用 论文精读

    本文阅读的文章是Scene as Occupancy,介绍了一种将物体表示为3D occupancy的新方法,以描述三维场景,并用于检测、分割和规划。 文章提出了OccNet和OpenOcc两个核心概念。 OccNet 3D占用网络是一种以多视图视觉为中心的方法,通过层级化的体素解码器,可以重建3D感知模型和3D占用,

    2024年02月22日
    浏览(49)
  • 51 -25 Scene as Occupancy 场景即占用 论文精读

    本文阅读的文章是Scene as Occupancy,介绍了一种将物体表示为3D occupancy的新方法,以描述三维场景,并用于检测、分割和规划。 文章提出了OccNet和OpenOcc两个核心概念。 OccNet 3D占用网络是一种以多视图视觉为中心的方法,通过层级化的体素解码器,可以重建3D感知模型和3D占用,

    2024年02月21日
    浏览(40)
  • 金字塔场景解析网络(Pyramid Scene Parsing Network )

    基于语义分割的 场景解析 是计算机视觉中的基本主题。 目标是为图像中的每个像素分配一个类别标签 。场景解析提供了对场景的完整理解。它预测每个元素的标签、位置和形状。 场景解析的难度与场景和标签的多样性密切相关 。 最先进的场景解析框架主要基于全卷积网络

    2024年02月08日
    浏览(42)
  • unity 模型在scene场景中看不到,在game视图可见

    这个问题出现的原因是:在编辑器中进行了如下设置:  上图左侧的眼睛图标的作用就是显示或隐藏物体。 另一种情况: 这是对层级的显示或隐藏。  

    2024年02月09日
    浏览(37)
  • Android事件分发-基础原理和场景分析

    作者:京东零售 郭旭锋 和其他平台类似,Android 中 View 的布局是一个树形结构,各个 ViewGroup 和 View 是按树形结构嵌套布局的,从而会出现用户触摸的位置坐标可能会落在多个 View 的范围内,这样就不知道哪个 View 来响应这个事件,为了解决这一问题,就出现了事件分发机制

    2023年04月21日
    浏览(42)
  • 在不启动Unity引擎的情况下修改默认打开的场景Scene

    当上次关闭Unity前打开了一个不经常用的但是又比较大的Scene,重新打开Unity时会重新加载这个默认场景,可能会比较耗时,如果开发者想要快速打开项目并且不想打开这个Scene,这个时候我们可以通过修改配置文件来达到修改Unity默认打开的场景: 在项目工程路径下找到 Lib

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包