android动画之TransitionManager

TransitionManager用于Scene场景之间的过渡

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

android动画之TransitionManager_第1张图片

场景过渡有两个触发方式 

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();

进行场景切换

效果图:

android动画之TransitionManager_第2张图片

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

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

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





android动画之TransitionManager_第3张图片

  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


android动画之TransitionManager_第4张图片

你可能感兴趣的:(优达学习之旅)