android: 如何用动画显示视图的可见部分?

android: how to visible portion of a view with animation?

我有一个看不见的 View 在另一个 View 后面。我想用翻译动画使这个视图可见,并只显示右侧视图的一部分。 像这样:

我不想使用 9 补丁图像并调整其大小。 此动画在 MS-PowerPoint 中名为 "peek in""。

你可以试试这样的

1) 创建一个drawable资源rectangle_curved.xml如下图

       <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle" android:padding="10dp">
        <solid android:color="#FFFFFF"/>
        <corners
            android:bottomRightRadius="350dp"
            android:bottomLeftRadius="0dp"
            android:topLeftRadius="0dp"
            android:topRightRadius="350dp"/>
        <stroke android:color="#50000000" android:width="2dp"/>
    </shape>

2) 将其设置为正在展开和折叠的view 的背景。这里我使用了一个Framelayout,它正在展开和折叠

     <FrameLayout
        android:id="@+id/shape"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:background="@drawable/rectangle_curved"/>

3) 创建一个class来处理expand/collapse动画如下

        public class ResizeAnimation extends Animation {
            private int mWidth;
            private int mInitialWidth;
            private View mView;

            public ResizeAnimation(View view, int width) {
                mView = view;
                mWidth = width;
                mInitialWidth = view.getWidth();
            }

            @Override
            protected void applyTransformation(float interpolatedTime, Transformation t) {
                int newWidth = mInitialWidth + (int) ((mWidth - mInitialWidth) * interpolatedTime);
                mView.getLayoutParams().width = newWidth;
                mView.requestLayout();
            }

            @Override
            public void initialize(int width, int height, int parentWidth, int parentHeight) {
                super.initialize(width, height, parentWidth, parentHeight);
            }

            @Override
            public boolean willChangeBounds() {
                return true;
            }
       }            

4) 最后就是这样使用了。创建一个函数来处理动画如下

     private void animate(View shapeView, boolean isExpand) {  
        int width = isExpand ? 500 : 0; // 500 is the max width in pixels , you ca change it
        ResizeAnimation anim = new ResizeAnimation(shapeView, width);
        anim.setDuration(500);
        shape.startAnimation(anim);
     }

并按如下方式调用此函数

用于展开动画:animate(myBackgroundView, true)

折叠动画:animate(myBackgroundView, false)

编辑: 在第 4 步的这一行中:int width = isExpand ? 500 : 0; 使用 1 而不是 0。 0 无法正常工作。不知道为什么。

private void animate(View view, boolean isExpand) {
    int width = isExpand ? 200 : 1; // 200 is the max width in pixels.
    //use a factor for same width on all screen size.
    DisplayMetrics metrics = getResources().getDisplayMetrics();
    int factor =(int)  metrics.density;
    ResizeAnimation anim = new ResizeAnimation(view, width * factor);
    anim.setDuration(500);
    view.startAnimation(anim);
}