NumberPicker зависает при анимации при прокрутке

У меня есть NumberPicker, завернутый в RelativeLayout, например, с несколькими кнопками внизу:

    <!-- Start/End Picker-->
    <LinearLayout
        android:id="@+id/ll_date_pickers"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:gravity="center_horizontal"
        android:orientation="horizontal">

        <NumberPicker
            android:id="@+id/picker"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:layout_marginStart="8dp"
            android:background="@android:color/white"
            android:descendantFocusability="blocksDescendants"/>

        <NumberPicker
            android:id="@+id/hour_picker"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/white"
            android:descendantFocusability="blocksDescendants"/>

        <NumberPicker
            android:id="@+id/minute_picker"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="8dp"
            android:layout_marginRight="8dp"
            android:background="@android:color/white"
            android:descendantFocusability="blocksDescendants"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/ll_date_pickers"
        android:background="@color/colorPrimary"
        android:gravity="end"
        android:padding="8dp">

        <TextView
            android:id="@+id/btn_cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="8dp"
            android:text="@android:string/cancel"
            android:textAllCaps="true"
            android:textColor="@color/white"/>

        <TextView
            android:id="@+id/btn_ok"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:minWidth="48dp"
            android:padding="8dp"
            android:text="@android:string/ok"
            android:textAlignment="center"
            android:textAllCaps="true"
            android:textColor="@color/white"/>

    </LinearLayout>
</RelativeLayout>

Обтекание имеет значение false, например:

mDatePicker.setWrapSelectorWheel(false);

Этот RelativeLayout скользит по анимации:

//View that triggers the animation
mBtnStartDate.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        if (mRlPicker.getVisibility() == View.GONE) {
            BasicAnimations.expand(mRlPicker, mPickerHeight, 200);
        }
        setDatePicker();
    }
});

// Actual animation
public static void expand(final View v, final int targetHeight, int duration) {
    v.getLayoutParams().height = 1;
    v.requestLayout();
    v.setVisibility(View.VISIBLE);

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

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

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

После того, как вы закончите со средствами выбора, пользователь нажимает кнопку, которая должна свернуть RelativeLayout:

mBtnOk.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        BasicAnimations.collapse(mRlPicker, 200);
    }
});

public static void collapse(final View v, int duration) {
    final int initialHeight = v.getMeasuredHeight();

    Animation a = new Animation() {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            if (interpolatedTime == 1) {
                v.setVisibility(View.GONE);
            } else {
                v.getLayoutParams().height = initialHeight - (int) (initialHeight * interpolatedTime);
                v.requestLayout();
            }
        }

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

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

Затем, когда вы нажимаете кнопку ОК, я хочу сдвинуть вверх сборщики. Но выполнение малейшей прокрутки приведет к ANR. Я понятия не имею, почему это происходит. Я даже пытался принудительно остановить бросок и настроить скроллеры с помощью отражения. Это, казалось, немного помогло, но было все еще возможно заморозить приложение. Также проверка того, было ли состояние прокрутки бездействующей, и не сворачивание представления до тех пор, пока оно не стало бездействующим, по-прежнему вызывало случаи зависания приложения.

РЕДАКТИРОВАТЬ:

Что-то, что я только что узнал, это то, что когда вы оживляете высоту, очевидно, влияет на текущее значение. Это может быть причиной бесконечного цикла. Я думаю, я должен был также отметить, что я позвонил mDatePicker.setWrapSelectorWheel(false);, Когда это не называется, кажется, что оно не замирает. Даже если бы я не хотел оборачивать селекторное колесо.

0 ответов

Другие вопросы по тегам