Android-анимация запускается только после прокрутки родительского представления - PullRequest
2 голосов
/ 12 апреля 2011

Я пытаюсь создать расширяемый пункт меню в Android, который будет выглядеть как кнопка, и при нажатии кнопки кнопка развернется вниз с анимацией. Я установил анимацию раскрытия для макета, которую я хочу развернуть, когда щелкнул по моему представлению, и у меня возникли проблемы с анимацией. Он не запускается сразу, когда я щелкаю представление, и запускается, когда я прокручиваю или прокручиваю контейнер представления. И если контейнер не прокручивается, моя анимация никогда не запускается. Что я делаю не так?

Вот мой метод расширения, метод onClick и XML-файл макета для моего пользовательского представления, которое будет выполнять следующие действия:

вставит:

public void expand(final View v) {

        try {
            Method m = v.getClass().getDeclaredMethod("onMeasure", int.class, int.class);
            m.setAccessible(true);
            m.invoke(v,
                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                    MeasureSpec.makeMeasureSpec(((View)v.getParent()).getMeasuredWidth(), MeasureSpec.AT_MOST)
            );
        } catch (Exception e) {
            Log.e(TAG , "Caught an exception!", e);
        }
        final int initialHeight = v.getMeasuredHeight();
        Log.d("test", "initialHeight="+initialHeight);

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


        Animation a = new Animation() {

            @Override
            protected void applyTransformation(float interpolatedTime,
                    Transformation t) {
                final int newHeight = (int) (initialHeight * interpolatedTime);
                v.getLayoutParams().height = newHeight;
                v.requestLayout();
            }

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

        };

        a.setDuration(1000);
        a.setInterpolator(AnimationUtils.loadInterpolator(context,
                android.R.anim.accelerate_decelerate_interpolator));
        v.startAnimation(a);

        isExpanded = !isExpanded;

    }

OnClick:

public void onClick(View v) {
    if (!isExpanded) {
        expand(subButtonsLayout);
    } else {
        collapse(subButtonsLayout);
    }
}

Макет xml для представления пользовательского пункта меню:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:mtx="http://schemas.android.com/apk/res/com.matriksdata.trademaster"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal">
    <LinearLayout
        android:id="@+id/xExpandableMenuButtonTop"
        android:background="@drawable/opened_menu_bg_top"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </LinearLayout>
    <LinearLayout
        android:background="@drawable/opened_menu_bg_center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center_vertical">
        <LinearLayout
            android:id="@+id/xExpandableMenuButtonTitle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical">
            <TextView
                android:id="@+id/xExpandableMenuButtonText"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:layout_marginLeft="10dip"
                android:layout_marginRight="10dip"
                        android:textAppearance="@style/expandable_menu_button_textstyle"
                android:text="Button Text">
            </TextView>
            <ImageView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="6"
                android:src="@drawable/menu_button_down_arrow">
            </ImageView>
        </LinearLayout>
    </LinearLayout>
    <LinearLayout
        android:id="@+id/xExpandableMenuButtonSubButtonsLayout"
        android:background="@drawable/opened_menu_bg_center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center_vertical"
        android:visibility="gone">
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="vertical">

            <com.myproject.control.XSubMenuButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                mtx:XSubMenuButtonText="SubMenu1">
            </ccom.myproject.control.XSubMenuButton>
            <com.myproject.control.XSubMenuButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                mtx:XSubMenuButtonText="SubMenu2">
            </com.myproject.control.XSubMenuButton>
            <com.myproject.control.XSubMenuButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                mtx:XSubMenuButtonText="SubMenu3">
            </com.myproject.control.XSubMenuButton>

        </LinearLayout>
    </LinearLayout>
    <LinearLayout
        android:id="@+id/xExpandableMenuButtonBottom"
        android:background="@drawable/opened_menu_bg_bottom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </LinearLayout>
</LinearLayout>

Ответы [ 5 ]

2 голосов
/ 30 марта 2014

Всем, кто может столкнуться с этим снова.

Если ваш вид, который вы анимируете, находится в ушедшем состоянии, то в этом случае перед запуском анимации установите Visiblity на невидимое. И это сработает с первого раза.

Источник от здесь .

2 голосов
/ 09 июня 2011

Если вы не решили свою проблему или кто-то еще сталкивался с этой проблемой, вот быстрое решение.При каждом клике аннулируйте родительский вид (в методе onClick).Это должно работать независимо от того, прокручивается родитель или нет.

То есть ваш код будет выглядеть примерно так:


public void onClick(View v) {
    if (!isExpanded) {
        expand(subButtonsLayout);
    } else {
        collapse(subButtonsLayout);
    }
    rootView.invalidate();
}
1 голос
/ 19 сентября 2014

Ну, я исправил проблему, используя только 2 строки.

scroll.setFocusableInTouchMode(true); 
scroll.requestFocus();
animation.Start();//Start anim

Удачи

1 голос
/ 29 января 2014

У меня было представление, которое я объявил в конце моего макета, чтобы его индекс Z был выше его братьев и сестер. Мне пришлось потрогать страницу, чтобы анимация заработала.

Итак, я снова установил Z-индекс через Java, и он заработал.

view.bringToFront();
0 голосов
/ 03 августа 2011

«Если контейнер не прокручивается, анимация никогда не запускается» -> Посмотрите на мою похожую проблему, Scrollview не смахивает, когда она слишком короткая для прокрутки . Я понял, что в моем случае это сенсорная ошибка в Android 2.1 и ниже.

...