Слева направо анимированная скользящая панель? - PullRequest
0 голосов
/ 10 июля 2011

Я пытаюсь добавить раздвижную панель к своему макету, которая похожа на выдвижной ящик, за исключением того, что она будет размещена слева от моего основного макета и не наложена на нее. В левом верхнем углу моего макета есть маленькая кнопка, которая расширяет / сворачивает панель, когда я нажимаю на нее. Когда он разворачивается / разворачивается, я хочу, чтобы анимация была плавной, чтобы смежный с ней вид также двигался. Вот код, который я пробовал. Панель перестает работать после первого разворачивания / свертывания:

public Animation expandHiddenPanel(final View v, final boolean expand) {
    panelExpanded = expand;
    v.measure(MeasureSpec.makeMeasureSpec(200, MeasureSpec.AT_MOST), 
              MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

    final int initialWidth = v.getMeasuredWidth();
    Log.i("test", "initialWidth = " + initialWidth);

    v.getLayoutParams().width = 0;
    v.setVisibility(View.VISIBLE);

    Animation a = new Animation() {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            int newWidth;

            if (expand) {
                newWidth = (int)(initialWidth * interpolatedTime);
                Log.i("test", "new Width = " + newWidth);
            }
            else {
                newWidth = (int)(initialWidth * (1 - interpolatedTime));
                Log.i("test", "new Width = " + newWidth);
            }

            v.getLayoutParams().width = newWidth;
            v.requestLayout();              
        }

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

    a.setInterpolator(new AccelerateInterpolator());
    a.setDuration(2500);
    v.startAnimation(a);

    return a;
}

1 Ответ

0 голосов
/ 04 августа 2014

Убедитесь, что если вы хотите отображать анимацию с растущей шириной, укажите ширину, характерную для макета, в XML-файле и используйте приведенный ниже код для развертывания и свертывания анимации с точки зрения ширины.

//expand animation      
public static void expand(final View v) {
        v.measure(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
        final int targtetWidth = v.getMeasuredWidth();
        Log.v("view width", "view expand width==>"+targtetWidth);
        v.getLayoutParams().width = 0;
        v.setVisibility(View.VISIBLE);

        Animation a = new Animation() {
            @Override
            protected void applyTransformation(float interpolatedTime,Transformation t) {
                v.getLayoutParams().width = interpolatedTime == 1 ? LayoutParams.WRAP_CONTENT: (int)(targtetWidth * interpolatedTime);
                v.requestLayout();
            }

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

        a.setDuration(100);
        v.startAnimation(a);
    }

//collapse animation
    public static void collapse(final View v) {
        final int initialWidth = v.getMeasuredWidth();
        Log.v("initial width", "initial width==>"+initialWidth); 
        Animation a = new Animation() {
            @Override
            protected void applyTransformation(float interpolatedTime,
                    Transformation t) {
                if (interpolatedTime == 1) {
                    Log.v("interpolated", "interpolated time is 1");
                    v.setVisibility(View.GONE);
                } else {

                    v.getLayoutParams().width = initialWidth - (int) (initialWidth * interpolatedTime);
                    Log.v("interpolated", "interpolated time is===>"+v.getLayoutParams().width);
                    v.requestLayout();
                }
            }

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

        // 1dp/ms
        Log.v("duration", "duration for collapse==>"+((int)(initialWidth /v.getContext().getResources().getDisplayMetrics().density)));
        a.setDuration((int) (initialWidth / v.getContext().getResources().getDisplayMetrics().density));
        v.startAnimation(a);
    }
...