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