Android布局動畫之a(chǎn)nimateLayoutChanges與LayoutTransition

關(guān)于布局動畫是針對ViewGroup而言的猫胁,意指ViewGroup在增加子View或者刪除子View時其子View的過渡動畫名眉,在Android官網(wǎng)有這么一個簡單的例子萍歉,其效果如下撩轰,接下來我們就通過這個例子來入門


最簡單的布局動畫實現(xiàn)

事實上,實現(xiàn)上面ViewGroup的布局動畫非常簡單啃沪,我們只要給子View所在的ViewGroup的xml中添加下面的屬性即可:
android:animateLayoutChanges="true"
1

1

通過設(shè)置以上代碼粘拾,當(dāng)ViewGroup在添加View時,子View會呈現(xiàn)出過渡的動畫效果谅阿,這個動畫效果是android默認的顯示效果半哟,而且無法使用自定義的動畫來替換這個效果酬滤,不過還是有其他方式可以實現(xiàn)自定義的過渡動畫滴,這個我們后面會分析寓涨,下面看看android官方給的demo的代碼實現(xiàn): activity_layout_changes.xml布局文件
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:showDividers="middle" android:divider="?android:dividerHorizontal" android:animateLayoutChanges="true" android:paddingLeft="16dp" android:paddingRight="16dp" /> </ScrollView> <TextView android:id="@android:id/empty" style="?android:textAppearanceSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:padding="32dp" android:text="@string/message_empty_layout_changes" android:textColor="?android:textColorSecondary" /></FrameLayout>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

布局代碼比較簡單盯串,使用了一個ScrollView包裹了LinearLayout布局并在LinearLayout中添加了屬性android:animateLayoutChanges="true"
,啟動了android自帶的布局動畫戒良,之所以使用ScrollView体捏,是為了在添加子View多時可以進行滑動,而TextView只不過在沒有子view時一個提示語糯崎。接著看看子View的布局文件list_item_example.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="?android:listPreferredItemHeightSmall" android:orientation="horizontal" android:showDividers="middle" android:divider="?android:dividerVertical" android:dividerPadding="8dp" android:gravity="center"> <TextView android:id="@android:id/text1" style="?android:textAppearanceMedium" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:paddingLeft="?android:listPreferredItemPaddingLeft" /> <ImageButton android:id="@+id/delete_button" android:layout_width="48dp" android:layout_height="match_parent" android:src="@drawable/ic_list_remove" android:background="?android:selectableItemBackground" android:contentDescription="@string/action_remove_item" /></LinearLayout>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

主要控件有用于顯示每個子View內(nèi)容的TextView和用于響應(yīng)刪除子View事件的ImageButton几缭,最后就是Activity的實現(xiàn): LayoutChangesActivity.Java
package com.example.android.animationsdemo;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.support.v4.app.NavUtils;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;/** * This sample demonstrates how to use system-provided, automatic layout transitions. Layout * transitions are animations that occur when views are added to, removed from, or changed within * a {@link ViewGroup}. * * <p>In this sample, the user can add rows to and remove rows from a vertical * {@link android.widget.LinearLayout}.</p> /public class LayoutChangesActivity extends Activity { private ViewGroup mContainerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_layout_changes); mContainerView = (ViewGroup) findViewById(R.id.container); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); //響應(yīng)添加事件的menu getMenuInflater().inflate(R.menu.activity_layout_changes, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpTo(this, new Intent(this, MainActivity.class)); return true; case R.id.action_add_item: //添加子View findViewById(android.R.id.empty).setVisibility(View.GONE); addItem(); return true; } return super.onOptionsItemSelected(item); } private void addItem() { //實例化一個子View final ViewGroup newView = (ViewGroup) LayoutInflater.from(this).inflate( R.layout.list_item_example, mContainerView, false); // 隨機設(shè)置子View的內(nèi)容 ((TextView) newView.findViewById(android.R.id.text1)).setText( COUNTRIES[(int) (Math.random() * COUNTRIES.length)]); //設(shè)置刪除按鈕的監(jiān)聽 newView.findViewById(R.id.delete_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mContainerView.removeView(newView); // If there are no rows remaining, show the empty view. if (mContainerView.getChildCount() == 0) { findViewById(android.R.id.empty).setVisibility(View.VISIBLE); } } }); //添加子View mContainerView.addView(newView, 0); } /* * A static list of country names. */ private static final String[] COUNTRIES = new String[]{ "Belgium", "France", "Italy", "Germany", "Spain", "Austria", "Russia", "Poland", "Croatia", "Greece", "Ukraine", };}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92

代碼比較簡單,mContainerView作為子View的承載容器沃呢,我們可以不斷添加子View年栓,也可以移除子View,由于我們在布局文件中啟動了android自帶的布局動畫薄霜,所以在添加子View或移除子View都會有過度動畫某抓,現(xiàn)在運行程序,效果如下:

這就是android中最簡單的布局動畫
布局動畫實之layoutAnimation

除了上面的布局動畫外惰瓜,有時我們可能需要第一次加載ListView或者GridView的時候能有個動畫的過度效果否副,以便達到更好的體驗,如下ListView加載子View的效果:

??事實上實現(xiàn)這種效果也比較簡單崎坊,我們只需要在ListView的布局文件中添加android:layoutAnimation=”@anim/layout”屬性即可备禀。接下來給出實現(xiàn)步驟: 實現(xiàn)動畫效果 left_into.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="500" android:fromXDelta="100%" android:fromYDelta="0" android:toXDelta="0" android:toYDelta="0" /> <alpha android:duration="500" android:fromAlpha="0" android:toAlpha="1" /></set>
1
2
3
4
5
6
7
8
9
10
11
12
13

1
2
3
4
5
6
7
8
9
10
11
12
13

這個比較簡單,就一個平移和透明度的效果奈揍,接著創(chuàng)建layout_animation.xml
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android" android:animation="@anim/left_into" android:animationOrder="normal" android:delay="0.5" />
1
2
3
4
5

1
2
3
4
5

這里簡單介紹一下layoutAnimation標(biāo)簽屬性:
屬性名
含義

android:delay
delay的單位為秒曲尸,表示子View進入的延長時間

android:animationOrder
子類的進入方式 ,其取值有男翰,normal 0 默認 队腐,reverse 1 倒序 ,random 2 隨機

android:animation
子view要執(zhí)行的具體動畫的文件奏篙,自定義即可

然后設(shè)置給listView控件即可,activity_listview.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" android:layoutAnimation="@anim/layout_animation" > </ListView></LinearLayout>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

1
2
3
4
5
6
7
8
9
10
11
12
13
14

ListViewActivity.java代碼如下:
package com.example.android.animationsdemo;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import java.util.ArrayList;import java.util.List;/** * Created by zejian * Time 16/9/17. * Description: */public class ListViewActivity extends Activity { private ListView listView; private List<String> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_listview); listView= (ListView) findViewById(R.id.listView); initData(); listView.setAdapter(new Myadpter()); } public void initData(){ list = new ArrayList<>(); for(int i=1;i<30;i++){ list.add("布局動畫listView測試_"+i); } } private class Myadpter extends BaseAdapter{ @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView tv= new TextView(ListViewActivity.this); tv.setTextSize(20); tv.setHeight(100); tv.setText(list.get(position)); return tv; } }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

執(zhí)行以上代碼迫淹,效果就是前面我們給出listView進入的動態(tài)效果秘通,這里特別注意的是,動畫只在listView子View第一次進入時有效敛熬,如果后面動態(tài)給listView添加子View時肺稀,此動畫效果無效,當(dāng)然除了通過xml設(shè)置外应民,我們還可以通過代碼動態(tài)設(shè)置话原,代碼范例如下夕吻,這里就不演示了。
//通過加載XML動畫設(shè)置文件來創(chuàng)建一個Animation對象,子View進入的動畫Animation animation=AnimationUtils.loadAnimation(this, R.anim.left_into);//得到一個LayoutAnimationController對象繁仁;LayoutAnimationController lac=new LayoutAnimationController(animation);//設(shè)置控件顯示的順序涉馅;lac.setOrder(LayoutAnimationController.ORDER_REVERSE);//設(shè)置控件顯示間隔時間;lac.setDelay(0.5f);//為ListView設(shè)置LayoutAnimationController屬性黄虱;listView.setLayoutAnimation(lac);
1
2
3
4
5
6
7
8
9
10

1
2
3
4
5
6
7
8
9
10

通過AnimationUtils.loadAnimation加載子View的動畫來并返回一個Animation對象稚矿,然后將Animation對象設(shè)置到LayoutAnimationController中并返回LayoutAnimationController對象,配置LayoutAnimationController對象的一些屬性捻浦,最后設(shè)置到ListView中晤揣,其中LayoutAnimationController對應(yīng)layoutAnimation標(biāo)簽,這里需要注意的是layoutAnimation動畫不僅僅限于ListView朱灿,GridView中昧识,也可用于一切ViewGroup中。
布局動畫實之LayoutTransition

前面我們說過ViewGroup在設(shè)置android:animateLayoutChanges="true"
后在添加或者刪除子view時可以啟用系統(tǒng)帶著的動畫效果盗扒,但這種效果無法通過自定義動畫去替換跪楞。不過還好android官方為我們提供了LayoutTransition類,通過LayoutTransition就可以很容易為ViewGroup在添加或者刪除子view設(shè)置自定義動畫的過渡效果了环疼。 ??LayoutTransition類用于當(dāng)前布局容器中需要View添加习霹,刪除,隱藏炫隶,顯示時設(shè)置布局容器子View的過渡動畫淋叶。也就是說利用LayoutTransition,可以分別為需添加或刪除的View對象在移動到新的位置的過程添加過渡的動畫效果伪阶。我們可以通過setLayoutTransition()方法為布局容器ViewGroup設(shè)置LayoutTransition對象煞檩,代碼如下:
//初始化容器動畫LayoutTransition mTransitioner = new LayoutTransition();container.setLayoutTransition(mTransitioner);
1
2
3

1
2
3

一般地,Layout中的子View對象有四種動畫變化的形式栅贴,如下:
屬性值
含義

LayoutTransition.APPEARING
子View添加到容器中時的過渡動畫效果斟湃。

LayoutTransition.CHANGE_APPEARING
子View添加到容器中時,其他子View位置改變的過渡動畫

LayoutTransition.DISAPPEARING
子View從容器中移除時的過渡動畫效果檐薯。

LayoutTransition.CHANGE_DISAPPEARING
子View從容器中移除時凝赛,其它子view位置改變的過渡動畫

LayoutTransition.CHANGING
子View在容器中位置改變時的過渡動畫,不涉及刪除或者添加操作

下面給出一個例子坛缕,先看布局文件activity_layout_animation.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="addView" android:text="添加控件" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="removeView" android:text="移除控件" /> </LinearLayout> <LinearLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" /></LinearLayout>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

比較簡單不啰嗦墓猎,接著看看LayoutAnimationActivity.java
package com.example.android.animationsdemo;import android.animation.LayoutTransition;import android.animation.ObjectAnimator;import android.animation.PropertyValuesHolder;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.LinearLayout;/** * Created by zejian * Time 16/9/17. * Description: /public class LayoutAnimationActivity extends Activity { private int i = 0; private LinearLayout container; private LayoutTransition mTransitioner; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_layout_animation); container = (LinearLayout) findViewById(R.id.container); //構(gòu)建LayoutTransition mTransitioner = new LayoutTransition(); //設(shè)置給ViewGroup容器 container.setLayoutTransition(mTransitioner); setTransition(); } private void setTransition() { /* * 添加View時過渡動畫效果 / ObjectAnimator addAnimator = ObjectAnimator.ofFloat(null, "rotationY", 0, 90,0). setDuration(mTransitioner.getDuration(LayoutTransition.APPEARING)); mTransitioner.setAnimator(LayoutTransition.APPEARING, addAnimator); /* * 移除View時過渡動畫效果 / ObjectAnimator removeAnimator = ObjectAnimator.ofFloat(null, "rotationX", 0, -90, 0). setDuration(mTransitioner.getDuration(LayoutTransition.DISAPPEARING)); mTransitioner.setAnimator(LayoutTransition.DISAPPEARING, removeAnimator); /* * view 動畫改變時,布局中的每個子view動畫的時間間隔 / mTransitioner.setStagger(LayoutTransition.CHANGE_APPEARING, 30); mTransitioner.setStagger(LayoutTransition.CHANGE_DISAPPEARING, 30); /* LayoutTransition.CHANGE_APPEARING和LayoutTransition.CHANGE_DISAPPEARING的過渡動畫效果 * 必須使用PropertyValuesHolder所構(gòu)造的動畫才會有效果赚楚,不然無效毙沾!使用ObjectAnimator是行不通的, * 發(fā)現(xiàn)這點時真特么惡心,但沒想到更惡心的在后面,在測試效果時發(fā)現(xiàn)在構(gòu)造動畫時,”left”宠页、”top”左胞、”bottom”寇仓、”right”屬性的 * 變動是必須設(shè)置的,至少設(shè)置兩個,不然動畫無效,問題是我們即使這些屬性不想變動!!!也得設(shè)置!!! * 我就問您惡不惡心!,因為這里不想變動,所以設(shè)置為(0,0) * / PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left", 0, 0); PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top", 0, 0); PropertyValuesHolder pvhRight = PropertyValuesHolder.ofInt("right", 0, 0); PropertyValuesHolder pvhBottom = PropertyValuesHolder.ofInt("bottom", 0, 0); / * view被添加時,其他子View的過渡動畫效果 / PropertyValuesHolder animator = PropertyValuesHolder.ofFloat("scaleX", 1, 1.5f, 1); final ObjectAnimator changeIn = ObjectAnimator.ofPropertyValuesHolder( this, pvhLeft, pvhBottom, animator). setDuration(mTransitioner.getDuration(LayoutTransition.CHANGE_APPEARING)); //設(shè)置過渡動畫 mTransitioner.setAnimator(LayoutTransition.CHANGE_APPEARING, changeIn); /* * view移除時,其他子View的過渡動畫 */ PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofFloat("scaleX", 1, 1.5f, 1); final ObjectAnimator changeOut = ObjectAnimator.ofPropertyValuesHolder( this, pvhLeft, pvhBottom, pvhRotation). setDuration(mTransitioner.getDuration(LayoutTransition.CHANGE_DISAPPEARING)); mTransitioner.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeOut); } public void addView(View view) { i++; Button button = new Button(this); button.setText("布局動畫_" + i); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); container.addView(button, Math.min(1, container.getChildCount()), params); } public void removeView(View view) { if (i > 0) container.removeViewAt(0); }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118

簡單分析一下烤宙,LayoutTransition.APPEARING和LayoutTransition.DISAPPEARING的情況下直接使用屬性動畫來設(shè)置過渡動畫效果即可遍烦,而對于LayoutTransition.CHANGE_APPEARING和LayoutTransition.CHANGE_DISAPPEARING必須使用PropertyValuesHolder所構(gòu)造的動畫才會有效果,不然無效门烂,真特么惡心乳愉, ,但沒想到更惡心的在后面,在測試效果時發(fā)現(xiàn)在構(gòu)造動畫時,”left”屯远、”top”蔓姚、”bottom”、”right”屬性的變動是必須設(shè)置的,至少設(shè)置兩個,不然動畫無效,最坑爹的是我們即使這些屬性不想變動!!!也得設(shè)置!!!我就問您惡不惡心!,那么我們不想改變這四個屬性時該如何設(shè)置呢慨丐?這時只要傳遞的可變參數(shù)都一樣就行如下面的(0,0)也可以是(100,100)即可(坑爹捌缕辍!測試半天才發(fā)現(xiàn)房揭,一直在考慮代碼有沒有問題备闲,最后發(fā)現(xiàn)時特么的也是醉了…….):
PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top",0,0); PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("left",100,100); PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("bottom",0,0); PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("right",0,0);
1
2
3
4

1
2
3
4

還有點需要注意的是在使用的ofInt,ofFloat中的可變參數(shù)值時,第一個值和最后一個值必須相同捅暴,不然此屬性將不會有動畫效果恬砂,比如下面首位相同是有效的
PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top",100,0,100);PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top",0,100,0);
1
2

1
2

但是如果是下面的設(shè)置就是無效的:
PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("left",0,100);
1

1

關(guān)于PropertyValuesHolder,后面我會分開單獨一篇來分析蓬痒,這里我們只需知道PropertyValuesHolder構(gòu)造的動畫可以設(shè)置給ObjectAnimator.ofPropertyValuesHolder()便可以產(chǎn)生響應(yīng)的動畫效果即可泻骤,該方法原型如下:
public static ObjectAnimator ofPropertyValuesHolder(Object target, PropertyValuesHolder... values)
1

1

最后我們通過setAniamtor的方法設(shè)置LayoutTransition的5種狀態(tài)下的過渡動畫,最后運行一下程序梧奢,效果如下:

最后這里小結(jié)一下LayoutTransition的一些常用函數(shù):
函數(shù)名稱
說明

setAnimator(int transitionType, Animator animator)
設(shè)置不同狀態(tài)下的動畫過渡,transitionType取值為狱掂, APPEARING、DISAPPEARING亲轨、CHANGE_APPEARING趋惨、CHANGE_DISAPPEARING 、CHANGING

setDuration(long duration)
設(shè)置所有動畫完成所需要的時長

setDuration(int transitionType, long duration)
設(shè)置特定type類型動畫時長惦蚊,transitionType取值為器虾, APPEARING、DISAPPEARING蹦锋、CHANGE_APPEARING曾撤、CHANGE_DISAPPEARING 、CHANGING

setStagger(int transitionType, long duration)
設(shè)置特定type類型動畫的每個子item動畫的時間間隔 ,transitionType取值為: APPEARING晕粪、DISAPPEARING、CHANGE_APPEARING渐裸、CHANGE_DISAPPEARING巫湘、CHANGING

setInterpolator(int transitionType, TimeInterpolator interpolator)
設(shè)置特定type類型動畫的插值器, transitionType取值為: APPEARING装悲、DISAPPEARING、CHANGE_APPEARING尚氛、CHANGE_DISAPPEARING诀诊、CHANGING

setStartDelay(int transitionType, long delay)
設(shè)置特定type類型動畫的動畫延時 transitionType取值為, APPEARING、DISAPPEARING阅嘶、CHANGE_APPEARING属瓣、CHANGE_DISAPPEARING 、CHANGING

addTransitionListener(TransitionListener listener)
設(shè)置監(jiān)聽器TransitionListener

關(guān)于監(jiān)聽器接口TransitionListener原型如下:
/** * This interface is used for listening to starting and ending events for transitions. /public interface TransitionListener { /* * 監(jiān)聽LayoutTransition當(dāng)前對應(yīng)的transitionType類型動畫開始 * @param transition LayoutTransition對象實例 * @param container LayoutTransition綁定的容器-container * @param view 當(dāng)前在做動畫的View對象 * @param transitionType LayoutTransition類型讯柔,取值有:APPEARING抡蛙、DISAPPEARING、 * CHANGE_APPEARING魂迄、CHANGE_DISAPPEARING粗截、CHANGING / public void startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType); /* * 監(jiān)聽LayoutTransition當(dāng)前對應(yīng)的transitionType類型動畫結(jié)束 * @param transition LayoutTransition對象實例 * @param container LayoutTransition綁定的容器-container * @param view 當(dāng)前在做動畫的View對象 * @param transitionType LayoutTransition類型,取值有:APPEARING捣炬、DISAPPEARING熊昌、 * CHANGE_APPEARING、CHANGE_DISAPPEARING湿酸、CHANGING */ public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType);}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

注釋比較清晰婿屹,就不過多說明,我們?nèi)绻朐谀撤NtransitionType類型動畫開或者結(jié)束時設(shè)置某些操作推溃,便可實現(xiàn)該接口昂利,測試效果也比較簡單,這里就不舉例了美莫。ok~页眯,關(guān)于布局動畫就先了解這么多吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厢呵,一起剝皮案震驚了整個濱河市窝撵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌襟铭,老刑警劉巖碌奉,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寒砖,居然都是意外死亡赐劣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門哩都,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魁兼,“玉大人,你說我怎么就攤上這事漠嵌「拦” “怎么了盖呼?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長化撕。 經(jīng)常有香客問我几晤,道長,這世上最難降的妖魔是什么植阴? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任蟹瘾,我火速辦了婚禮,結(jié)果婚禮上掠手,老公的妹妹穿的比我還像新娘憾朴。我一直安慰自己,他們只是感情好惨撇,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布伊脓。 她就那樣靜靜地躺著,像睡著了一般魁衙。 火紅的嫁衣襯著肌膚如雪报腔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天剖淀,我揣著相機與錄音纯蛾,去河邊找鬼。 笑死纵隔,一個胖子當(dāng)著我的面吹牛翻诉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捌刮,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼碰煌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绅作?” 一聲冷哼從身側(cè)響起芦圾,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俄认,沒想到半個月后个少,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡眯杏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年夜焦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岂贩。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡茫经,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情科平,我是刑警寧澤褥紫,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站瞪慧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏部念。R本人自食惡果不足惜弃酌,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望儡炼。 院中可真熱鬧妓湘,春花似錦、人聲如沸乌询。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妹田。三九已至唬党,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鬼佣,已是汗流浹背驶拱。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晶衷,地道東北人蓝纲。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像晌纫,于是被迫代替她去往敵國和親税迷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,515評論 25 707
  • 之前一篇文章總結(jié)了View動畫、屬性動畫凌蔬、幀動畫露懒,這篇文章繼續(xù)總結(jié)布局動畫、轉(zhuǎn)場動畫砂心。 一懈词、布局動畫 布局動畫的作...
    xiaoyanger閱讀 8,148評論 7 48
  • 1 背景 不能只分析源碼呀,分析的同時也要整理歸納基礎(chǔ)知識辩诞,剛好有人微博私信讓全面說說Android的動畫坎弯,所以今...
    未聞椛洺閱讀 2,693評論 0 10
  • Animation Animation類是所有動畫(scale、alpha、translate抠忘、rotate)的基...
    四月一號閱讀 1,900評論 0 10
  • 請告訴我你說話有點委屈感是怎么回事呢撩炊? 答,有點不自信崎脉,來源思想拧咳。 你知道根源嗎? 答,知道,我要如何做到對自己的...
    影子陪伴靈魂閱讀 274評論 0 0