在自定义Behavior的路上越走越远啦,真的超喜欢这个的!!掌握这个就离高级UI工程师又近一步咯。
接上篇文章来继续了解下 https://www.jianshu.com/p/1a5b02c0f3ee (实现悬浮布局)
此文带来的是,ImageView 或者随便什么布局 贴在RecyclerView上面进行滑动,不是用的普通布局,用的是CoordinatorLayout,虽然比普通布局实现复杂(用代码)(普通布局怎么实现我就不献丑了),但是我们是站在自定义角度去实现的,意义还是不一样的~~
public class ImageBehavior extends CoordinatorLayout.Behavior<View> {
public ImageBehavior() { }
public ImageBehavior(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) {
return (axes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0; //判定只接受垂直方向的滚动
}
//嵌套滑动进行中,要监听的子 View将要滑动,滑动事件即将被消费(但最终被谁消费,可以通过代码控制)
@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.e("print", "dx-->" + dx + "dy-->" + dy + "type-->" + type);
// Log.e("print", "child-->" + child + "target-->" + target);
//dy >0 向下滚动 dy<0 向上滚动 这里 我猜测 dx 应该是代表向左向右滑动
// type 是松开手 惯性滑动,为0的时候是按住滑动 为1的时候是松开手自己惯性滑动
// consumed[0] 告诉 CoordinatorLayout 水平方向滑动距离 给它来消费 为1 就是竖直方向
// Log.e("print", "dy" +dy );
// child.setTranslationY(finalY);
// child.setScaleY(dy);
// consumed[1] = dy;
if (target instanceof RecyclerView) {
boolean downReach =false;
RecyclerView list = (RecyclerView) target;//直接进行强转
// 列表第一个全部可见Item的位置
int pos = ((LinearLayoutManager) list.getLayoutManager()).findFirstCompletelyVisibleItemPosition();
if (pos == 0 ) {
//当 pos 是第一个位置,进行标记。这里做标记的作用是防止区分是子View滑动 还是RecyclerView 滑动
downReach = true;
}else {
downReach = false;
}
float finalY = child.getTranslationY() - dy;//
Log.e("print", "pos" +pos);
if (finalY > 0) {
// consumed[1] = dy;
finalY = 0;
} else if (finalY < -child.getHeight()) {
finalY = -child.getHeight();
}
float temp = -finalY;
// if (finalY < child.getHeight()) {
if (downReach) {
child.setTranslationY(finalY);
}
// if (finalY <=-child.getHeight())
if (temp<child.getHeight()) {
if (downReach) {
consumed[1] = dy;
}
}
}
}
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
android:orientation="vertical"
tools:context=".ThirdActivity"
tools:ignore="MissingPrefix">
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--这里必须添加layout_behavior
这里的意思是,把AppBarLayout和RecyclerView进行绑定在一块
从而进行滑动的相应事件处理
-->
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/recyclerviewbehavior_sample_suspend"></android.support.v7.widget.RecyclerView>
<ImageView
android:id="@+id/title_layout"
android:layout_width="match_parent"
android:layout_height="@dimen/space_480"
android:fitsSystemWindows="true"
android:scaleType="fitXY"
app:layout_behavior="@string/imagebehavior_sample_suspend"
android:src="@mipmap/banner_1">
</ImageView>
</android.support.design.widget.CoordinatorLayout>
</FrameLayout>
感觉很有意思,抽空写个复杂布局,再详细写写吧
网友评论