Оживлять Флоатинг Актион Button (slide up, down) в зависимости от Scroll

В этой ссылке есть решение для глазного и показывать fab button FloatingActionButton в зависимости от scroll

Но он мне понравился бы что, когда он скроется, и показывал fab button это делал с оживлением slide Наверху и Внизу:

introducir la descripción de la imagen aquí

1
задан 13.04.2017, 16:00
3 ответа

Ты можешь делать это двумя формами, используя класс, который он увеличивал бы FloatingActionButton.Behavior и соединяя это с view Floating Action Button в XML или программируя это прямо в RecyclerView.

Я буду показывать тебе две формы и ты выбираешь ту, которая больше тебе нравится.

ПЕРВЫЙ МЕТОД

Когда я искал, как делание точно того, что ты спрашиваешь, все то, что появлялось, они использовали тот же метод. Они создавали новый класс java и увеличивали FloatingActionButton.Behavior чтобы обнаруживать движение ListView или RecyclerView (то, что ты используешь) и потом они соединяют этот же самый класс с view Floating Action Button (FAB) следующей формы:

Класс FABMove.java:

public class FABMove extends FloatingActionButton.Behavior {

    public FABMove(Context context, AttributeSet attrs) {
        super();
    }

    @Override
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);

        if (dyConsumed > 0) {
            CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) child.getLayoutParams();
            int margin = layoutParams.bottomMargin;
            child.animate().translationY(child.getHeight() + margin).setInterpolator(new LinearInterpolator()).setDuration(1000).start();
        } else if (dyConsumed < 0) {
            child.animate().translationY(0).setInterpolator(new LinearInterpolator()).setDuration(1000).start();
        }
    }

    @Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) {
        return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL;
    }
}

И сейчас, только ты должен идти в файл XML где ты имел объявленный FAB и добавлять один CoordinatorLayout герметизируя в корпусе ты RecyclerView и FAB и к этому ты добавляешь свойство app:layout_behavior что соединяет для твоего класса java:

<android.support.design.widget.CoordinatorLayout 
   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.support.v7.widget.RecyclerView 
      android:id="@+id/recycler_view" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"/>  

   <android.support.design.widget.FloatingActionButton
      android:id="@+id/fab"
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margin="16dp" 
      app:layout_anchor="@+id/recycler_view" 
      app:layout_anchorGravity="bottom|end" 
      app:layout_behavior="com.victoria.fabsmove.FABMove" />

</android.support.design.widget.CoordinatorLayout>

Я заношу в список!

ВТОРОЙ МЕТОД:

Этот метод, для меня, это мне кажется относительно простым, много больше, чем первый, потому что не нужно создавать столькие, сшейте. Просто ты должен добавлять функцию addOnScrollListener() в RecyclerView и sobrescribir метод onScrolled() для того, чтобы он обнаружил движение списка.

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy){
            if (dy > 0)
                // Puedes ocultarlo simplemente
                //fab.hide();
                // o añadir la animación deseada
                fab.animate().translationY(fab.getHeight() +
                            getResources().getDimension(R.dimen.fab_margin))
                            .setInterpolator(new LinearInterpolator())
                            .setDuration(1000); // Cambiar al tiempo deseado
            else if (dy < 0)
                //fab.show();
                 fab.animate().translationY(0)
                            .setInterpolator(new LinearInterpolator())
                            .setDuration(1000); // Cambiar al tiempo deseado

        }
    });

С этим уже он был бы совсем готов. Если у тебя есть какое-то сомнение, предупреди немедленно.

Все же, ответ, который дал наш приятель Андрес Хильермо Кастельянос А (соединение), потому что ты кроме того учишь себя, чтобы создавать меню прямо в FAB и он очень интересен.

Много удачи с твоим app!!

3
ответ дан 24.11.2019, 14:14
  • 1
    спасибо, я приспособил немного c и # 243; я говорю моему app, функционируй верно – Webserveis 04.06.2016, 16:11

CompaГ±ero, в этом сайте https://www.sitepoint.com/animating-android-floating-action-button / найдет ответ шаг за шагом и кроме того смоги загружать пример, который находит в этом git https://github.com/sitepoint-editors/FloatingActionButton_Animation_Project

, Он надеялся помочь ему.

0
ответ дан 24.11.2019, 14:14

Мое решение используя FloatingActionButton.Behavior приспосабливая код ответа @Vicky_Vicent

Я добавляю один flag чтобы знать, находится ли оживление в процессе, чтобы предотвращать перегрузку оживления.

public class AboutFabScrollBehavior extends FloatingActionButton.Behavior {

    private boolean startAnimation = false;

    public AboutFabScrollBehavior(Context context, AttributeSet attributeSet) {
        super();
    }

    @Override
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, final FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {

        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);

        if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) {
            // User scrolled down and the FAB is currently visible -> hide the FAB
            if (!startAnimation) {
                Interpolator interpolador = null;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    interpolador = AnimationUtils.loadInterpolator(MyApplication.getAppContext(),
                            android.R.interpolator.fast_out_linear_in);
                }

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {

                    child.animate()
                            //.translationYBy(0f)
                            .translationY(child.getHeight() +
                                    child.getContext().getResources().getDimension(R.dimen.fab_margin))
                            .setInterpolator(interpolador)
                            .setDuration(child.getContext().getResources().getInteger(android.R.integer.config_shortAnimTime))
                            .setListener(new AnimatorListenerAdapter() {
                                @Override
                                public void onAnimationEnd(Animator animation) {
                                    super.onAnimationEnd(animation);
                                    child.setVisibility(View.GONE);
                                    startAnimation = false;
                                }
                            })
                            .start();
                }
                startAnimation = true;
            }


        } else if (dyConsumed < 0 && child.getVisibility() == View.GONE) {
            // User scrolled up and the FAB is currently not visible -> show the FAB
            if (!startAnimation) {
                child.setVisibility(View.VISIBLE);

                Interpolator interpolador = null;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    interpolador = AnimationUtils.loadInterpolator(MyApplication.getAppContext(),
                            android.R.interpolator.fast_out_linear_in);
                }

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    child.animate()
//                            .translationYBy(150f)
                            .translationY(0f)
                            .setInterpolator(interpolador)
                            .setDuration(child.getContext().getResources().getInteger(android.R.integer.config_shortAnimTime))
                            .setListener(new AnimatorListenerAdapter() {
                                @Override
                                public void onAnimationEnd(Animator animation) {
                                    super.onAnimationEnd(animation);
                                    startAnimation = false;
                                }
                            })
                            .start();
                }


                Animation animation = AnimationUtils.loadAnimation(MyApplication.getAppContext(),
                        R.anim.fade_in);
                child.startAnimation(animation);
            }
        }
    }

    @Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) {
        // Ensure we react to vertical scrolling
        return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL
                || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
        //return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL;
    }
}
0
ответ дан 24.11.2019, 14:14

Теги

Похожие вопросы