美文网首页
Android自定义Behavior,实现复杂布局效果(二)

Android自定义Behavior,实现复杂布局效果(二)

作者: 山上的神仙 | 来源:发表于2019-03-10 11:55 被阅读0次

在自定义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>

感觉很有意思,抽空写个复杂布局,再详细写写吧

相关文章

网友评论

      本文标题:Android自定义Behavior,实现复杂布局效果(二)

      本文链接:https://www.haomeiwen.com/subject/qbdupqtx.html