Android: как видна часть вида с анимацией? - PullRequest
0 голосов
/ 16 октября 2018

У меня есть невидимое View позади другого View.Я хочу сделать этот вид видимым с помощью анимации перевода и показывать только часть правого вида сбоку.как это: sample animation

Я не хочу использовать 9 патч изображения и изменить его размер.эта анимация называется "заглянуть" "в MS-PowerPoint.

1 Ответ

0 голосов
/ 16 октября 2018

Вы можете попробовать что-то вроде этого

1) создать нарисованный ресурс 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) Создайте класс для обработки анимации развертывания / сворачивания следующим образом

        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);
}
...