平稳地展开和收缩视图

时间:2014-07-03 11:05:52

标签: android user-interface android-5.0-lollipop material-design

在Material Design视频中,视图非常顺畅地展开和收缩。我试图在旧的Android API的日子里实现这一点,它真的很昂贵而且速度很慢。

Android-L中是否有新的API可以实现这些效果?

效果为http://www.youtube.com/watch?v=Q8TXgCzxEnw#t=26

的视频

1 个答案:

答案 0 :(得分:7)

您可以使用android-L中的新动画API轻松创建您在此视频中看到的大部分效果。

显示效果
您可以为剪切圆设置动画以显示或隐藏视图。 这是您在视频中单击“播放”按钮时看到的内容。该按钮可展开并显示媒体播放器。

显示隐藏视图的代码(source

// previously invisible view
View myView = findViewById(R.id.my_view);

// get the center for the clipping circle
int cx = (myView.getLeft() + myView.getRight()) / 2;
int cy = (myView.getTop() + myView.getBottom()) / 2;

// get the final radius for the clipping circle
int finalRadius = myView.getWidth();

// create and start the animator for this view
// (the start radius is zero)
ValueAnimator anim =
    ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius);
anim.start();

如果您按照上述链接,可以找到隐藏视图的代码。

活动进入和退出转场
您可以指定视图进入或退出场景的方式。

当前支持的转换是爆炸,滑动和淡入淡出。还支持任何扩展android.transition.Visibility的转换。

整个视频中都可以看到很多例子。

爆炸退出转换的代码(source

// inside your activity
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

// set an exit transition
getWindow().setExitTransition(new Explode());

活动共享元素转换
您可以指定两个活动之间共享的元素如何在它们之间转换。

支持的转换是:

  • changeBounds - 动画显示目标视图的布局边界的更改。
  • changeClipBounds - 动画目标视图剪辑边界的更改。
  • changeTransform - 动画目标视图的缩放和旋转变化。
  • changeImageTransform - 为图像视图设置动画大小和比例类型的更改。

要进行共享元素转换,您需要执行以下操作:(source

  • 以您的风格启用窗口内容转换。
  • 在您的样式中指定共享元素转换。
  • 将转换定义为XML资源。
  • 使用android:viewName属性为两个布局中的共享元素指定一个公用名。
  • 使用ActivityOptions.makeSceneTransitionAnimation方法。

    // get the element that receives the click event
    final View imgContainerView = findViewById(R.id.img_container);
    
    // get the common element for the transition in this activity
    final View androidRobotView = findViewById(R.id.image_small);
    
    // define a click listener
    imgContainerView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(this, Activity2.class);
            // create the transition animation - the images in the layouts
            // of both activities are defined with android:viewName="robot"
            ActivityOptions options = ActivityOptions
                .makeSceneTransitionAnimation(this, androidRobotView, "robot");
            // start the new activity
            startActivity(intent, options.toBundle());
        }
    });
    

我还没想到的一个动画是同一活动中的扩展/合约动画,可以在日历应用中看到。

我唯一可以说的是他们正在使用高程,因为我们可以看到阴影。我会尝试破解它,看看我是否可以重新创建它。