From android 4.4 , it supply one new animation with layout:transition

To help you animate a change between one view hierarchy and another, Android provides the transitions framework.
This framework applies one or more animations to all the views in the hierarchies as it changes between them.

The scene is the source for transition.

It is easily to transfer from one scene to another scene.

You just need to doing this as following.

1.add a new activty named TransitionActivity

define layout like this:scene_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="changed" /> <FrameLayout
android:id="@+id/scene_root"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<include layout="@layout/a_scene" />
</FrameLayout> </LinearLayout>

R.id.scene_root is the view we want to transiton.

So transition is not animation activity whole layout, you can just start with one layout:as below FrameLayout.

2.we need to define two scene view to show transtion:

a_scene.xml:

<?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" > <TextView
android:id="@+id/text_view1"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextLine1" /> <TextView
android:id="@+id/text_view2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="TextLine2" /> </RelativeLayout>

and another_scene.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <TextView
android:id="@+id/text_view2"
android:layout_alignParentTop="true"
android:paddingTop="100dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Text Line 3" /> <TextView
android:id="@+id/text_view1"
android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Text Line 4" /> </RelativeLayout>

You can find there children's id is same.

Yes, android transition framework need using view id to calculater transition animation .

3.define transition manager

Here we will define how one scene go to another scene.

transitions_mgr.xml

<transitionManager xmlns:android="http://schemas.android.com/apk/res/android">
<transition android:fromScene="@layout/a_scene"
android:toScene="@layout/another_scene"
android:transition="@transition/changebounds_fadein_together"/>
<transition android:fromScene="@layout/another_scene"
android:toScene="@layout/a_scene"
android:transition="@transition/changebounds_fadeout_sequential"/>
</transitionManager>

4. showing the TransitionActivity

        mAScene = Scene.getSceneForLayout(mSceneRoot, R.layout.a_scene, this);
mAnotherScene =
Scene.getSceneForLayout(mSceneRoot, R.layout.another_scene, this);
Scene android.transition.Scene.getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context)

as you see: mSceneRoot is the layout what your scene will showing. and R.layout.a_scene & R.layout.another_scene is the layout for scene.

mSceneRoot = (ViewGroup) findViewById(R.id.scene_root);
        TransitionInflater inflater = TransitionInflater.from(this);
mTransitionManager = inflater.inflateTransitionManager(R.transition.transitions_mgr,
mSceneRoot);

get an mTransitionManager  form R.transition.transitions_mgr . Thus you can define transiton animation detail from one scene to another one.

package com.joyfulmath.androidstudy.transition;

import com.joyfulmath.androidstudy.R;

import android.app.Activity;
import android.os.Bundle;
import android.transition.Scene;
import android.transition.TransitionInflater;
import android.transition.TransitionManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup; public class TransitionActivity extends Activity { Scene mAScene;
Scene mAnotherScene;
private ViewGroup mSceneRoot;
private TransitionManager mTransitionManager;
View mTitle = null;
int currentId = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.scene_layout);
mSceneRoot = (ViewGroup) findViewById(R.id.scene_root); mTitle = findViewById(R.id.title); mAScene = Scene.getSceneForLayout(mSceneRoot, R.layout.a_scene, this);
mAnotherScene =
Scene.getSceneForLayout(mSceneRoot, R.layout.another_scene, this);
TransitionInflater inflater = TransitionInflater.from(this);
mTransitionManager = inflater.inflateTransitionManager(R.transition.transitions_mgr,
mSceneRoot); mTitle.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
setScene(3-currentId);
}
});
} public void setScene(int id)
{
if(id == currentId)
{
return;
}
currentId = id;
switch (id) {
case 1:
mTransitionManager.transitionTo(mAScene);
break;
case 2:
mTransitionManager.transitionTo(mAnotherScene);
break;
}
}
}

5.define special transition animation:

Two way: fade & changeBounds

<changeBounds/> just defined Moves and resizes views.
<fade android:fadingMode="fade_out|fade_in|fade_in_out" >
</fade>

6.Custom Transition

package com.joyfulmath.androidstudy.transition;

import android.animation.Animator;
import android.animation.ArgbEvaluator;
import android.animation.ValueAnimator;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.transition.Transition;
import android.transition.TransitionValues;
import android.view.View;
import android.view.ViewGroup; public class CustomTransition extends Transition { // Define a key for storing a property value in
// TransitionValues.values with the syntax
// package_name:transition_class:property_name to avoid collisions
private static final String PROPNAME_BACKGROUND =
"com.joyfulmath.androidstudy.transition:CustomTransition:background"; @Override
public void captureEndValues(TransitionValues transitionValues) {
captureValues(transitionValues);
} @Override
public void captureStartValues(TransitionValues transitionValues) {
// Call the convenience method captureValues
captureValues(transitionValues); } @Override
public Animator createAnimator(ViewGroup sceneRoot,
TransitionValues startValues, TransitionValues endValues) {
// This transition can only be applied to views that are on both starting and ending scenes.
if (null == startValues || null == endValues) {
return null;
}
// Store a convenient reference to the target. Both the starting and ending layout have the
// same target.
final View view = endValues.view;
// Store the object containing the background property for both the starting and ending
// layouts.
Drawable startBackground = (Drawable) startValues.values.get(PROPNAME_BACKGROUND);
Drawable endBackground = (Drawable) endValues.values.get(PROPNAME_BACKGROUND);
// This transition changes background colors for a target. It doesn't animate any other
// background changes. If the property isn't a ColorDrawable, ignore the target.
if (startBackground instanceof ColorDrawable && endBackground instanceof ColorDrawable) {
ColorDrawable startColor = (ColorDrawable) startBackground;
ColorDrawable endColor = (ColorDrawable) endBackground;
// If the background color for the target in the starting and ending layouts is
// different, create an animation.
if (startColor.getColor() != endColor.getColor()) {
// Create a new Animator object to apply to the targets as the transitions framework
// changes from the starting to the ending layout. Use the class ValueAnimator,
// which provides a timing pulse to change property values provided to it. The
// animation runs on the UI thread. The Evaluator controls what type of
// interpolation is done. In this case, an ArgbEvaluator interpolates between two
// #argb values, which are specified as the 2nd and 3rd input arguments.
ValueAnimator animator = ValueAnimator.ofObject(new ArgbEvaluator(),
startColor.getColor(), endColor.getColor());
// Add an update listener to the Animator object.
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Object value = animation.getAnimatedValue();
// Each time the ValueAnimator produces a new frame in the animation, change
// the background color of the target. Ensure that the value isn't null.
if (null != value) {
view.setBackgroundColor((Integer) value);
}
}
});
// Return the Animator object to the transitions framework. As the framework changes
// between the starting and ending layouts, it applies the animation you've created.
return animator;
}
}
// For non-ColorDrawable backgrounds, we just return null, and no animation will take place.
return null;
}
// END_INCLUDE (create_animator) // For the view in transitionValues.view, get the values you
// want and put them in transitionValues.values
private void captureValues(TransitionValues transitionValues) {
// Get a reference to the view
View view = transitionValues.view;
// Store its background property in the values map
transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground());
}
}
    public void setScene(int id)
{
if(id == currentId)
{
return;
}
currentId = id;
switch (id) {
case 1:
// mTransitionManager.transitionTo(mAScene);
TransitionManager.go(mAScene, mTransition);
break;
case 2:
// mTransitionManager.transitionTo(mAnotherScene);
TransitionManager.go(mAnotherScene, mTransition);
break;
}
}

Animating Views Using Scenes and Transitions的更多相关文章

  1. 【IOS笔记】Views

    Views Because view objects are the main way your application interacts with the user, they have many ...

  2. View Programming Guide for iOS ---- iOS 视图编程指南(四)---Views

    Views Because view objects are the main way your application interacts with the user, they have many ...

  3. (8/18)重学Standford_iOS7开发_协议、block、动画_课程笔记

    第八课: 1.协议 另一种安全处理id类型的方式如:id <MyProtocol> obj a.声明 //协议一般放于.h文件中或者在类的.h文件中 @protocol Foo <X ...

  4. google 论文

    从google历年所有论文的汇总来看,TOP5的分别是人工智能和机器学习.算法理论.人机交互与视觉.自然语言处理.机器感知,大家从一个侧面看出goolge research的重点了吧. Google所 ...

  5. 【转】Google的2012论文

    转自:http://www.sigvc.org/bbs/thread-1152-1-1.html Google的论文一直是业界的风向标,尤其在机器学习.分布式系统.网络等方面很多创新性的成果都是由他们 ...

  6. View Programming Guide for iOS ---- iOS 视图编程指南(五)---Animations

      Animations Animations provide fluid visual transitions between different states of your user inter ...

  7. SwiftUI学习(二)

    教程 2 - Building Lists and Navigation Section 4 - Step 2: 静态 List var body: some View { List { Landma ...

  8. Android之动画的学习(转载)

    Android动画学习笔记-Android Animation   3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...

  9. Android Property Animation动画

    3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这三 ...

随机推荐

  1. 编辑器之神VIM 总结(一) 基础部分

     版本号 说明 作者 日期  1.0  vim基础知识 Sky Wang 2013/06/19       概要 vim和emacs,一个是编辑器之神,一个是神一样的编辑器.他们被称是UNIX系统下的 ...

  2. Android 学习笔记之AndBase框架学习(一) 实现多功能标题栏

    PS:Volley框架终于通过看源码的方式完成了所有的学习..开始学习AndBase...AndBase的源码实在是多的离谱...因此就不对所有的源码进行分析了... 学习内容: 1.使用AndBas ...

  3. [Bootstrap]7天深入Bootstrap(2)整体架构

    大多数Bootstrap的使用者都认为Bootstrap只提供了CSS组件 和JavaScript插件,其实CSS组件和JavaScript插件只是Bootstrap框架的表现形式而已,它们都是构建在 ...

  4. "数学口袋精灵"bug(团队)

    团队名:MY-HR 成员: 学号 博客园 团队贡献分 丘惠敏(组长) 201406114203 http://www.cnblogs.com/qiuhuimin/ 5 郭明茵 201406114204 ...

  5. Linq之select子句

    在Linq中select子句用来指定查询结果的类型和表现形式.Linq查询要么以select子句结尾,要么以group子句结尾. List<UserBaseInfo> users = ne ...

  6. margin的使用方法与技巧

    1.margin还可以用来做平移,作用类似translate哈哈.将元素设成absolute后就可以用margin随便平移他了,既不像relative那样要霸占空间,又不用为父元素设置relative ...

  7. 不可或缺 Windows Native (2) - C 语言: 常量,变量,基本数据类型

    [源码下载] 不可或缺 Windows Native (2) - C 语言: 常量,变量,基本数据类型 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 常量 变量 基本 ...

  8. Oracle 查询并删除重复记录的SQL语句

    查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select  ...

  9. Android:TextView 自动滚动(跑马灯) (转)

    Android:TextView 自动滚动(跑马灯)       TextView实现文字滚动需要以下几个要点: 1.文字长度长于可显示范围:android:singleLine="true ...

  10. winform(ListView及数据库连接)

    一.ListView:列表展示数据1.视图 - 在其右上方小箭头点击将视图改为Largelcon:或右键属性在外观View将其改为Details2.设置列头 - 在其右上方小箭头点击选择编辑列,然后添 ...