您的位置:首页 > 移动开发 > Android开发

android动画之TransitionManager

2018-02-07 15:04 99 查看
TransitionManager用于Scene场景之间的过渡

Scene储存着一个根View下的各个View的属性,例如下图就是一个场景



场景过渡有两个触发方式 

go()beginDelayedTransition()

常见的过渡效果有

Fade Slide Explode ChangeBounds



go()

使用该方法是进行两个布局之间的切换,提前设置好两个布局,然后进行切换。

如下图是主视图,在Framelayout中插入要进行切换的布局

<LinearLayout 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="com.example.m.oftransitionmanager.MainActivity"
android:orientation="vertical">
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/root">
<include layout="@layout/demo1"/>
</FrameLayout>
</LinearLayout>


下面是两个切换的布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="300dp"
android:id="@+id/root">
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
</RelativeLayout>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="300dp"
android:id="@+id/root">

<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@mipmap/ic_launcher" />
</RelativeLayout>


然后就要写代码了

Scene scene1;
Scene scene2;
boolean demo1=true;
@TargetApi(Build.VERSION_CODES.KITKAT)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=findViewById(R.id.btn);
ViewGroup group=findViewById(R.id.root);
scene1=Scene.getSceneForLayout(group,R.layout.demo1,this);
scene2=Scene.getSceneForLayout(group,R.layout.demo2,this);
button.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onClick(View v) {
TransitionManager.go(demo1?scene2:scene1,new ChangeBounds());
demo1=!demo1;
}
});

}

首先需要通过
Scene.getSceneForLayout(group,R.layout.demo1,this);

获得场景,第一个参数ViewGroup是布局的根View

然后通过

TransitionManager.go();

进行场景切换

效果图:



该方法第一个参数是要跳转至的场景

第二个参数是切换效果,也可以通过xml文件进行设置

Transition set= TransitionInflater.from(v.getContext()).inflateTransition(R.transition.demo_transition);
TransitionManager.go(demo1?scene2:scene1,set);

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">

<slide
android:slideEdge="top"
android:duration="2000"
android:interpolator="@android:interpolator/fast_out_slow_in"
tools:targetApi="lollipop" />

</transitionSet>




 beginDelayedTransition()
通过go()切换场景需要创建布局,不免还是有些繁琐,所以还有一个更简单的方法beginDelayedTransition()

该方法可以在原布局不变的情况下,通过修改View的属性来进行场景过渡

public class DelayedActivity extends AppCompatActivity {
ImageView imageView;
boolean inite=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_delayed);
imageView=findViewById(R.id.delayed_img);
ViewGroup.LayoutParams params= imageView.getLayoutParams();
params.height=100;
params.width=100;
imageView.setLayoutParams(params);
imageView.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onClick(View v) {
ViewGroup viewGroup=(ViewGroup) findViewById(android.R.id.content);
TransitionManager.beginDelayedTransition(viewGroup,new ChangeBounds());
ViewGroup.LayoutParams params= imageView.getLayoutParams();
if (inite){
params.height=400;
params.width=400;
}else {
params.height=100;
params.width=100;
}
inite=!inite;
imageView.setLayoutParams(params);
}
});
}
}


值得注意的是,我们可以通过

findViewById(android.R.id.content)

获取一个activity的根View,具体参考
https://stackoverflow.com/questions/4486034/get-root-view-from-current-activity

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息