CoordinatorLayout.Behavior简单使用和学习

CoordinatorLayout.Behavior使用和学习


CoordinatorLayout.Behavior怎么用
主要是在以CoordinatorLayout为父布局的控件中使用app:layout_behavior=”demo.com.behaviordemo.MyBehavior1”,引号中的值是自定义的继承CoordinatorLayout.Behavior < View >类的路径,泛型中的view为使用该Behavior的控件。

自定义Behavior时,根据想要实现的效果主要是分为两种情况,去覆写父类不同的方法。第一种需求:根据可滚动控件(如:RecyclerView,NestedScrollView)滚动的距离,将当前控件进行折叠形变。第二种需求:可滚动控件上下滚动的时候,显示和隐藏其他控件,如知乎首页。
下面demo就是实现了第二种需求。覆写了两个方法:
1.onStartNestedScroll
这个方法比较简单,需要返回Boolean值,当返回true时,说明用户关心这种情况,就会执行onNestedPreScroll中的逻辑,比如下面的demo中返回 return (axes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;关心的是上下滑动的情况
2.onNestedPreScroll
在这个方法中写上下滚动时的child控件需要做的操作,比如当前demo,当dy小于0,并且child控件是显示状态的时候,就给child开启一个向下的平移动画;当dy大于0,并且child控件隐藏状态时,给child开启一个向上的平移动画

Java代码:
package demo.com.behaviordemo;

import android.animation.ObjectAnimator;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.view.ViewCompat;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

/**
 * Created by Administrator on 2018/6/14.
 */

public class MyBehavior extends CoordinatorLayout.Behavior<View> {
    private boolean isShow = true;

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

    @Override
    public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, @NonNull View directTargetChild,
                                       @NonNull View target, int axes, int type) {
        Log.d("asda", "onStartNestedScroll");

        return (axes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
    }

    @Override
    public void onNestedPreScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, @NonNull View target, int dx, int dy,
                                  @NonNull int[] consumed, int type) {
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
        Log.d("asda", "onNestedPreScroll" + dy);
        if (dy < 0) {
            if (isShow)
                return;
            ObjectAnimator translationY = ObjectAnimator.ofFloat(child, "translationY", child.getHeight(), 0f);
            translationY.setDuration(200);
            translationY.start();
            isShow = !isShow;
        } else if (dy > 0) {
            if (!isShow)
                return;
            ObjectAnimator translationY = ObjectAnimator.ofFloat(child, "translationY", 0f, child.getHeight());
            translationY.setDuration(200);
            translationY.start();
            isShow = !isShow;
        }
    }


    @Override
    public boolean onNestedPreFling(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, @NonNull View target, float velocityX, float
            velocityY) {
        Log.d("asda", "onNestedPreFling");
        return super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY);
    }
}

xml文件:

.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="demo.com.behaviordemo.MainActivity">

    .support.v7.widget.RecyclerView
        android:id="@+id/rv_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    "@+id/tv_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorAccent"
        android:gravity="center"
        android:layout_gravity="bottom"
        android:padding="10dp"
        android:text="@string/app_name"
        app:layout_behavior="demo.com.behaviordemo.MyBehavior1"
        app:layout_constraintBottom_toBottomOf="@+id/rv_content" />
.support.design.widget.CoordinatorLayout>

你可能感兴趣的:(CoordinatorLayout.Behavior简单使用和学习)