TransitionManager用于Scene场景之间的过渡
Scene储存着一个根View下的各个View的属性,例如下图就是一个场景
场景过渡有两个触发方式
go() 和 beginDelayedTransition()
常见的过渡效果有
Fade Slide Explode ChangeBounds
go()
使用该方法是进行两个布局之间的切换,提前设置好两个布局,然后进行切换。
如下图是主视图,在Framelayout中插入要进行切换的布局
然后就要写代码了
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);
通过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