android - 平滑地扩展和收缩 View

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

在 Material Design 视频中, View 的扩展和收缩非常流畅。在过去,我曾尝试使用旧的 Android API 来实现这一目标,但它确实成本高昂且速度缓慢。

Android-L 中是否有任何新的 API 来实现这些效果?

带有效果的视频http://www.youtube.com/watch?v=Q8TXgCzxEnw#t=26

最佳答案

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

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

显示隐藏 View 的代码 ( 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();

如果您点击上面的链接,您可以找到隐藏 View 的代码。

Activity 进入和退出过渡
您可以指定 View 如何进入或退出场景。

目前支持的过渡有爆炸、滑动和淡入淡出。还支持任何扩展 android.transition.Visibility 的转换。

在整个视频中可以看到许多示例。

爆炸退出转换的代码 ( source )

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

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

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

支持的转换是:

  • changeBounds - 动画化目标 View 布局边界的变化。
  • changeClipBounds - 动画化目标 View 剪辑边界的变化。
  • changeTransform - 动画化目标 View 的缩放和旋转变化。
  • changeImageTransform - 动画显示 ImageView 的大小和缩放类型的变化。

要进行共享元素转换,您需要执行以下操作:( 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());
        }
    });
    

我还没有弄清楚的一个动画是同一 Activity 中的展开/收缩动画,可以在日历应用程序中看到。

我唯一能说的是他们使用了高程,因为我们可以看到阴影。我会试着修改一下,看看是否可以重新创建它。

关于android - 平滑地扩展和收缩 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24552049/

相关文章:

java - 使用 SharedPreferences 覆盖后退按钮以保存数据

java - 在 CardLayout 中设置面板布局

android - Saripaar 的@ConfirmPassword 不工作

android - 蓝牙 GATT onConnectionState Change 不适用于 Lollipop

android - 确定 Android 设备的摄像头高度和宽度

android - 是否可以从广播接收器启动 Intent ?

android - 登录界面与 Firebase 奇怪的行为

c - 用于拖放到特定区域的库

Android 5(HTC) EACCES(权限被拒绝)

android - 本地化在 Lollipop 中不起作用