У меня есть линейная компоновка, которую я хочу переместить, когда появляется Snackbar.Как перемещать вид выше Закусочная, как FloatingButton
Я видел много примеров, как это сделать с помощью FloatingButton, но как насчет обычного вида?
У меня есть линейная компоновка, которую я хочу переместить, когда появляется Snackbar.Как перемещать вид выше Закусочная, как FloatingButton
Я видел много примеров, как это сделать с помощью FloatingButton, но как насчет обычного вида?
Вам необходимо добавить поведение к вашему LinearLayout и вставить его в CoordinatorLayout. Возможно, вы захотите прочитать следующее: http://alisonhuang-blog.logdown.com/posts/290009-design-support-library-coordinator-layout-and-behavior
НЕТ необходимости в координационном макете с использованием обычного вида выровняйте снэк-бар в нижней части окна и поместите на него кнопку, нажав кнопку любой вашей логики, покажите закусочную или линейную раскладка.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
/*snackbar code
<LinearLayout
android:id="@+id/linear_snack bar"
android:layout_width="match_parent"
android:layout_height="@dimen/margin_45"
android:layout_alignParentBottom="true"
android:layout_marginTop="@dimen/margin_0"
android:background="@color/dark_grey">
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@color/orange"
android:gravity="center"
android:textColor="@color/white"
android:textSize="@dimen/text_size_h7" />
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:textSize="@dimen/text_size_h7" />
</LinearLayout>
<View android:layout_above="@+id/linear_snack bar"
</RelativeLayout>
Я собираюсь рассказать об утверждённом ответе, потому что я думаю, что есть немного более простая реализация, чем в этой статье.
Я не смог найти встроенное поведение, которое обрабатывает общее перемещение взглядов, но это один хороший вариант общего назначения (от http://alisonhuang-blog.logdown.com/posts/290009-design-support-library-coordinator-layout-and-behavior связан в другом комментарии):
import android.content.Context;
import android.support.annotation.Keep;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.view.View;
@Keep
public class MoveUpwardBehavior extends CoordinatorLayout.Behavior<View> {
public MoveUpwardBehavior() {
super();
}
public MoveUpwardBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
return dependency instanceof Snackbar.SnackbarLayout;
}
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
float translationY = Math.min(0, ViewCompat.getTranslationY(dependency) - dependency.getHeight());
ViewCompat.setTranslationY(child, translationY);
return true;
}
//you need this when you swipe the snackbar(thanx to ubuntudroid's comment)
@Override
public void onDependentViewRemoved(CoordinatorLayout parent, View child, View dependency) {
ViewCompat.animate(child).translationY(0).start();
}
}
затем , в файле макета добавить layout_behavior, как показано ниже:
<LinearLayout
android:id="@+id/main_content"
android:orientation="vertical"
app:layout_behavior="com.example.MoveUpwardBehavior"/>
где layout_behavior полный путь к пользовательскому поведению. Нет необходимости подклассифицировать LinearLayout, если у вас нет конкретной необходимости иметь поведение по умолчанию, что кажется необычным.
Как это отличается от принятого решения? –
Это решение не требует подклассификации целевого представления, которое, по моему мнению, является чрезмерным. Также, как правило, лучше всего объяснять ответ inline, поскольку ссылки, как правило, уходят через некоторое время. –
Отличное решение. Чтобы поддержать салфетки для удаления закуски, добавьте следующий код: '@Override public void onDependentViewRemoved (координаторLayout parent, View child, View dependency) { super.onDependentViewRemoved (parent, child, dependency); child.setTranslationY (0); } ' – ubuntudroid
Я реализовал это и обнаружил, что когда закусочная исчезла, вид остался белым пространством в месте закусочных, по-видимому, это известно, если анимация отключена на устройстве.
Чтобы исправить это, я изменил метод onDependentViewChanged, чтобы сохранить начальную позицию Y вида, к которой привязано это поведение. Тогда при удалении закусочной сброса положение этой точки зрения к сохраненной позиции Y
private static float initialPositionY;
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
initialPositionY = child.getY();
float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
child.setTranslationY(translationY);
return true;
}
@Override
public void onDependentViewRemoved(CoordinatorLayout parent, View child, View dependency) {
super.onDependentViewRemoved(parent, child, dependency);
child.setTranslationY(initialPositionY);
}
В дополнение к ответу Travis Кастильо: Для того, чтобы разрешить запуск последовательных закусочные, в onDependentViewChanged()
, вы должны отменить любые возможности текущей анимации начала по onDependentViewRemoved()
:
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
float translationY = Math.min(0, ViewCompat.getTranslationY(dependency) - dependency.getHeight());
ViewCompat.animate(child).cancel(); //cancel potential animation started in onDependentViewRemoved()
ViewCompat.setTranslationY(child, translationY);
return true;
}
без отмены, то LinearLayout будет прыгать вниз ниже 2-го закусочной, когда закусочная заменяется другой закусочная.
На основании ответа @Travis Castillo. Исправлены проблемы, такие как:
Moving entire layout up and cause the objects on top of view disappear.
Doesnt push the layout up when showing SnackBars immediately after eachother.
Так вот фиксировано код MoveUpwardBehavior Класс:
import android.content.Context;
import android.support.annotation.Keep;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.view.View;
@Keep
public class MoveUpwardBehavior extends CoordinatorLayout.Behavior<View> {
public MoveUpwardBehavior() {
super();
}
public MoveUpwardBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
return dependency instanceof Snackbar.SnackbarLayout;
}
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
float translationY = Math.min(0, ViewCompat.getTranslationY(dependency) - dependency.getHeight());
//Dismiss last SnackBar immediately to prevent from conflict when showing SnackBars immediately after eachother
ViewCompat.animate(child).cancel();
//Move entire child layout up that causes objects on top disappear
ViewCompat.setTranslationY(child, translationY);
//Set top padding to child layout to reappear missing objects
//If you had set padding to child in xml, then you have to set them here by <child.getPaddingLeft(), ...>
child.setPadding(0, -Math.round(translationY), 0, 0);
return true;
}
@Override
public void onDependentViewRemoved(CoordinatorLayout parent, View child, View dependency) {
//Reset paddings and translationY to its default
child.setPadding(0, 0, 0, 0);
ViewCompat.animate(child).translationY(0).start();
}
}
Это кода толкает вверх то, что пользователь видит на экране и, кроме того пользователь имеет доступ ко всем объектам в макете в то время как закусочная показывает.
Если вы хотите закусочной покрыть объекты, а не толкаясь и, кроме пользователя, имеют доступ ко всем объектам, то вам необходимо изменить метод onDependentViewChanged:
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
float translationY = Math.min(0, ViewCompat.getTranslationY(dependency) - dependency.getHeight());
//Dismiss last SnackBar immediately to prevent from conflict when showing SnackBars immediately after eachother
ViewCompat.animate(child).cancel();
//Padding from bottom instead pushing top and padding from top.
//If you had set padding to child in xml, then you have to set them here by <child.getPaddingLeft(), ...>
child.setPadding(0, 0, 0, -Math.round(translationY));
return true;
}
и метод onDependentViewRemoved:
@Override
public void onDependentViewRemoved(CoordinatorLayout parent, View child, View dependency) {
//Reset paddings and translationY to its default
child.setPadding(0, 0, 0, 0);
}
К сожалению, вы потеряете анимацию при удалении пользователя, чтобы удалить SnackBar. И вы должны использовать класс ValueAnimator, чтобы сделать анимацию для изменений дополнений, что делает некоторые конфликты здесь, и вы должны их отлаживать.
https://developer.android.com/reference/android/animation/ValueAnimator.html
Любой комментарий о анимации для салфетки, чтобы удалить закусочной оценили.
Если вы можете пропустить эту анимацию, вы можете ее использовать.
Во всяком случае, я рекомендую первый тип.
Я написал библиотеку, в которую можно добавить дополнительные виды для анимации с помощью SnackProgressBar. Он также включает progressBar и другие вещи. Попробуйте https://github.com/tingyik90/snackprogressbar
Предположим, у вас есть следующие виды для анимации.
View[] views = {view1, view2, view3};
Создайте экземпляр SnackProgressBarManager в своей деятельности и включите представление для анимации.
SnackProgressBarManager snackProgressBarManager = new SnackProgressBarManager(rootView)
.setViewsToMove(views)
Когда SnackProgressBar отображается или отклоняется, эти представления будут соответственно анимированы.
Я не могу сказать, использовали ли вы переднюю закусочную, но это не обычная реализация. Обычно это динамическое предупреждение, которое добавляется во время выполнения. Если это метод, который сработал для вас, попробуйте быть более конкретным, а не комментируя «код закуски», который, возможно, является одной из наиболее важных частей макета. –