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);
, Когда это не называется, кажется, что оно не замирает. Даже если бы я не хотел оборачивать селекторное колесо.