У меня есть FrameLayout, который я хочу, чтобы он находился за пределами окна устройств внизу, чтобы пользователь не видел его. Когда пользователь что-то нажимает, весь фрагмент, частью которого является этот FrameLayout, будет перемещаться вверх, и это должно открыть доступ к FrameLayout, поскольку он теперь находится в поле зрения. Для этого я устанавливаю отрицательный запас на FrameLayout и устанавливаю для клипДети и clipToPadding значение false на всех его родительских элементах. Однако, похоже, это не работает.
Я попытался добавить атрибуты вручную
android:clipChildren = "false"
android:clipToPadding = "false"
для всех возможных родительских представлений, без всякого везения. Конечно, я даже использовал этот метод, чтобы перебрать родителей и программно установить эти атрибуты:
public void disableClipOnParents(View v) {
if (v.getParent() == null) {
return;
}
if (v instanceof ViewGroup) {
((ViewGroup) v).setClipChildren(false);
}
if (v.getParent() instanceof View) {
disableClipOnParents((View) v.getParent());
}
}
В чем может быть причина того, что это представление обрезается, когда я перемещаю удерживающий фрагмент вверх? Это XML макета фрагмента:
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:background = "@color/colorPrimary"
android:orientation = "vertical"
android:clipChildren = "false"
android:clipToPadding = "false">
<android.support.constraint.ConstraintLayout
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:background = "@color/colorPrimary">
<FrameLayout
android:layout_width = "match_parent"
android:layout_height = "0dp"
android:layout_marginTop = "40dp"
app:layout_constraintBottom_toTopOf = "parent"
app:layout_constraintDimensionRatio = "H, 1:1"
app:layout_constraintLeft_toLeftOf = "parent"
app:layout_constraintRight_toRightOf = "parent"
app:layout_constraintTop_toTopOf = "parent" />
</android.support.constraint.ConstraintLayout>
<RelativeLayout
android:adjustViewBounds = "true"
android:id = "@+id/rlPlaceholder"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:background = "@color/colorPrimary"
android:clipChildren = "false"
android:clipToPadding = "false">
<ImageView
android:id = "@+id/ivCaptureImage"
android:layout_width = "75dp"
android:layout_height = "75dp"
android:layout_centerInParent = "true"
android:src = "@drawable/camera_shutter_selector" />
<FrameLayout
android:id = "@+id/flStart"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:background = "@color/colorPrimaryLight"
android:layout_alignParentBottom = "true"
android:layout_marginBottom = "-40dp">
<TextView
android:layout_width = "wrap_content"
android:layout_height = "60dp"
android:gravity = "center_vertical"
android:layout_gravity = "center_horizontal"
android:textSize = "18dp"
android:fontFamily = "sans-serif"
android:textColor = "@color/white"
android:text = "START"/>
</FrameLayout>
</RelativeLayout>
</LinearLayout>
FrameLayout внизу с идентификатором flStart - это представление, которое должно находиться за пределами экрана, а затем скользить по событию щелчка (с выдвижением верхней части фрагмента).
Высоко ценю любую помощь
Я делал такие вещи, когда контейнер верхнего уровня - это ConstraintLayout (вместо LinearLayout, который у вас есть сейчас). В этом случае вы можете установить для скрытого FrameLayout ограничение top_ToBottomOf = "parent", которое расположит его за пределами экрана внизу, а затем оживит его вверх, чтобы отобразить, примерно так:
myFrameLayout.animate().translationY(-myFrameLayout.getHeight()).setInterpolator(
new DecelerateInterpolator()).setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
// do anything you need to do once the animation is done
}
}).setDuration(1000);
Официально Android не поддерживает отрицательные поля. Они никогда не должны были работать, но из-за ошибки в некоторых макетах они работали. Google решил, что это было достаточно полезно, они никогда не исправляли ошибку, но также заявляют, что это не обязательно то, что они всегда поддерживают.
Правильный способ сделать эту работу - установить высоту этого представления на 0, а затем, когда вы хотите, чтобы оно отображалось в виде анимации, увеличивая его высоту, пока оно не достигнет необходимого полного размера.