文档章节

Android 4.4 Transition Framework ,更加动态的更新xml,和动画

青鸾之旅
 青鸾之旅
发布于 2014/02/05 02:49
字数 1259
阅读 2369
收藏 6

英文原版地址,点这里


第一种使用方式。。可能习惯原来ViewGroup的 比较熟悉点。。这样其实也不容易出错。。。

RelativeLayout sceneBase = (RelativeLayout)findViewById(R.id.scene_base);
 
        //Create a new layout for the second scene
        ViewGroup scene2Group = (ViewGroup)getLayoutInflater().inflate(R.layout.scene_2, sceneBase, false);
        //Create a scene using the root element from the initial scene
        //plus the new group we just created
        final Scene scene2 = new Scene(sceneBase, scene2Group);
 
        //When the user clicks the button transition from scene1 to scene2
        Button button = (Button)sceneBase.findViewById(R.id.press_me);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TransitionManager.go(scene2);
            }
        });

android 4.4 提供了一个新的,更简便地向ViewGroup塞东西的方式

 container = (ViewGroup)findViewById(R.id.scene_base);
        current = Scene.getSceneForLayout(container, R.layout.scene1, this);
        another = Scene.getSceneForLayout(container, R.layout.scene2, this);
        
        current.enter();
        bt2 =(Button)findViewById(R.id.press_me);
        bt2.setOnClickListener(new OnClickListener(){
        	public void onClick(View view){
        		Scene tem = current;
        		current = another;
        		another = tem;
        		TransitionManager.go(current);
        	}
        });

注意这个过程是不可逆的!!!!,除非你把改变他们的触发方式写到外面,也就是说这里的Button按钮也会改变的话,就无法再变回来了。。。因为它用的是 inflater 里面的用新的xml文件替换掉原来的父布局李敏啊的组件。。。。


下面是完整的代码

首先创建一个 名为scene1.xml的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/scene_base"
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
 
    <TextView
        android:id="@+id/welcome_text"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="This is the first scene!"
        android:layout_centerHorizontal="true"/>
 
    <Button
        android:id="@+id/press_me"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_below="@id/welcome_text"
        android:text="Press me!"
        android:gravity="center_horizontal"
        android:layout_centerHorizontal="true"/>
 
</RelativeLayout>

再创建一个名为 scene2.xml的文件,没错这个就是替换后的布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scene_base"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <TextView
        android:id="@+id/welcome_text"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="This is the second scene"
        android:layout_centerHorizontal="true" />
 
    <TextView
        android:id="@+id/second_line"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="It contains 2 views with the same IDs as scene_1"
        android:layout_below="@id/welcome_text"
        android:layout_centerHorizontal="true" />
 
    <TextView
        android:id="@+id/third_line"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="But it also contains two new lines of text"
        android:layout_below="@id/second_line"
        android:layout_centerHorizontal="true" />
 
    <Button
        android:id="@+id/press_me"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="I'm done"
        android:gravity="center_horizontal"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" />
 
</RelativeLayout>


最后是逻辑的部分。有两个版本。。我都附上

版本一,也是新的SDK中推荐的。。。但我个人觉得这样虽然简单了。。。但细节上不可控

package com.qingluan.testsome;

import android.os.Build;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.transition.Scene;
import android.transition.Transition;
import android.transition.TransitionInflater;
import android.transition.TransitionManager;


public class MainActivity extends Activity {
	private ViewGroup container;
	private TextView thisis;
	private Button bt2;
	private Scene current;
	private Scene another;
	private Transition mytransition;
	private Integer count;
    @SuppressLint("NewApi") @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.scene1); // 注意这里不是用的默认布局文件而是我们写的第一个文件
        count = 0;
        Kitkat();
        bt2 =(Button)findViewById(R.id.press_me);
        bt2.setOnClickListener(new OnClickListener(){
        	public void onClick(View view){
        		Scene tem = current;
        		current = another;
        		another = tem;
        		TransitionManager.go(current);
        	}
        });
    }

    
    @TargetApi(19) 
    public void Kitkat (){
    	
        container = (ViewGroup)findViewById(R.id.scene_base);
        current = Scene.getSceneForLayout(container, R.layout.scene1, this);
        another = Scene.getSceneForLayout(container, R.layout.scene2, this);
        
        current.enter();
       
        
    }
  
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}

第二个版本 ,用的是我们熟悉的 Inflater.inflate(int,root ,boolean) 工厂模式模式  

package com.qingluan.testsome;

import android.os.Build;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.transition.Scene;
import android.transition.Transition;
import android.transition.TransitionInflater;
import android.transition.TransitionManager;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //Set the layout to the initial scene
        setContentView(R.layout.scene1);//这里不是默认xml
 
        //这里将需要更改的父布局的框架先声明出来,等会需要改变现在的这个布局里面的东西
        RelativeLayout sceneBase = (RelativeLayout)findViewById(R.id.scene_base);
 
        //然后在这里把改变后的布局文件塞入我们的工厂中,特别注意的是‘inflate’ 的第三个变量必须是false,否则会立刻把里面的东西立刻塞入布局中,最后的结果是,还没等我们选择转换,就已经转换了,而这里的第一个参数就是改变后的布局,它会呗组装进入第二参数里面。。
        ViewGroup scene2Group = (ViewGroup)getLayoutInflater().inflate(R.layout.scene2, sceneBase, false);
        
        创建要转换的第二个屏幕(暂时这样翻译)其中第一个参数将变为第二个参数的父布局。
        final Scene scene2 = new Scene(sceneBase, scene2Group);
 
        //When the user clicks the button transition from scene1 to scene2
        Button button = (Button)sceneBase.findViewById(R.id.press_me);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TransitionManager.go(scene2); //这个就是最重要的转换函数。。。而第二个参数是隐藏的,那个参数是为了自己定制自己的转换特效而设置的,这里就暂时不叙述了
            }
        });
    }

 


有不对的地方希望指出。。。最后要小心。。这样转换有一个不方便的地方,就是,如果你使用了原来诸如 TextView.setText()之类的函数的话,只要转换就会初始化为XML文件中的内容。。,甚至你的setText直接失效,至于解决办法目前我还没测试出来,有会的朋友希望尽快联系我  最后  谢!

                                                                ———— by 青鸾之旅

本文转载自:http://www.doubleencore.com/2013/11/new-transitions-framework/

共有 人打赏支持
青鸾之旅
粉丝 0
博文 5
码字总数 1701
作品 0
丰台
程序员
私信 提问
Android Transition Animation 过渡动画解析

本文主要译自 lgvalle 的 Material-Animations 的 README.MD,文中的源码见 Material-Animations。 Android 4.4.2 中引入了 Transition 过渡动画,不过那时的 API 的功能比较简单,只能对整个...

JohnnyShieh
2018/04/09
0
0
你所不知道的Activity转场动画——ActivityOptions

版权声明:本文来自Loader's Blog,未经博主允许不得转载。 https://blog.csdn.net/qibin0506/article/details/48129139 相信大家对于Activity的过度动画都很熟悉了,一般情况下我们直接使用...

亓斌
2015/08/31
0
0
Android Launcher开发之动态壁纸(LiveWallPaper)气泡流动效果

最近在研究Laucher应用,今天写了一下四组件中的壁纸(WallPaper),关于静态壁纸的实现,比较简单,在此就不再描述. 参考了系统源代码之后,我自己做了一个简单的动态壁纸:气泡流动效果. 图案...

长平狐
2012/09/03
960
1
【Animations】使用动画开始Activity(12)

原 概要 材料设计应用程序中的活动转换通过公共元素之间的运动和转换提供不同状态之间的视觉连接。您可以为进入和退出转换以及活动之间共享元素的转换指定自定义动画。 一进入过渡确定意见的...

lichong951
2018/05/28
0
0
项目需求讨论 — 用Transition做一个漂亮的登录界面

前言 一次在逛Github的时候,看到一个漂亮的登录界面,用的是Transition做的。我就直接贴上地址: MaterialLogin 当然,如果单纯的直接拿过来用,没有任何意义。主要还是来看具体如何实现的。...

青蛙要fly
2018/01/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

day11

architect刘源源
21分钟前
2
0
论学好Linux系统的超级重要性

不知道各位在日常的工作生活中有没有接触过“rm -rf /*”这个命令,因为这个命令搞出来的事情可还不少呢!前段时间就在一个群里看到了有个小伙子,老板让他去维护一下服务器,这小伙也不太懂...

Linux就该这么学
昨天
1
0
git 使用

1,首先在github配置好信息和仓库,然后在本地进行操作 git init git config user.name 'zhangwuer' git config user.email '56789053@qq.com' 2,与远程分支建立连接 git checkout -b test......

天王盖地虎626
昨天
3
0
git checkout 命令详解

在日常的git操作中,git checkout——检出,是我们的常用命令。最为常用的两种情形是创建分支和切换分支。 在下面的命令中,使用了一些简写,在这里说明一下: git st # git statusgit ci ...

shzwork
昨天
8
0
【Nginx】Nginx多级代理,获取客户端真实请求IP以及每级代理IP

Nginx多级代理,获取客户端真实请求IP以及每级代理IP 如图所示,每一级nginx里的location配置里需要加上对应的配置,最后一级nginx是直接到应用,测试时为了方便,直接用echo模块去测试,打印...

薛定谔的旺
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部