Kevin Learn Android:Behavior 相关

作者: Kevin_小飞象 | 来源:发表于2021-07-03 13:56 被阅读0次
    17.jpg

    Behavior 介绍

    作用于 CoordinatorLayout 的子 View 的交互行为插件。一个 Behavior 实现了用户的一个或者多个交互行为,它们可能包括拖拽、滑动、快滑或者其他一些手势。

    Behavior 是一个顶层抽象类,其他的一些具体行为的 Behavior 都是继承自这个类。它提供了几个重要的方法:

    /**
         * 表示是否给应用了Behavior 的View 指定一个依赖的布局,通常,当依赖的View 布局发生变化时
         * 不管被被依赖View 的顺序怎样,被依赖的View也会重新布局
         * @param parent
         * @param child 绑定behavior 的View
         * @param dependency   依赖的view
         * @return 如果child 是依赖的指定的View 返回true,否则返回false
         */
        @Override
        public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
            return super.layoutDependsOn(parent, child, dependency);
        }
    
        /**
         * 当被依赖的View 状态(如:位置、大小)发生变化时,这个方法被调用
         * @param parent
         * @param child
         * @param dependency
         * @return
         */
        @Override
        public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
            return super.onDependentViewChanged(parent, child, dependency);
        }
    
        /**
         *  当coordinatorLayout 的子View试图开始嵌套滑动的时候被调用。当返回值为true的时候表明
         *  coordinatorLayout 充当nested scroll parent 处理这次滑动,需要注意的是只有当返回值为true
         *  的时候,Behavior 才能收到后面的一些nested scroll 事件回调(如:onNestedPreScroll、onNestedScroll等)
         *  这个方法有个重要的参数nestedScrollAxes,表明处理的滑动的方向。
         *
         * @param coordinatorLayout 和Behavior 绑定的View的父CoordinatorLayout
         * @param child  和Behavior 绑定的View
         * @param directTargetChild
         * @param target
         * @param nestedScrollAxes 嵌套滑动 应用的滑动方向,看 {@link ViewCompat#SCROLL_AXIS_HORIZONTAL},
         *                         {@link ViewCompat#SCROLL_AXIS_VERTICAL}
         * @return
         */
        @Override
        public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
            return super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
        }
    
        /**
         * 嵌套滚动发生之前被调用
         * 在nested scroll child 消费掉自己的滚动距离之前,嵌套滚动每次被nested scroll child
         * 更新都会调用onNestedPreScroll。注意有个重要的参数consumed,可以修改这个数组表示你消费
         * 了多少距离。假设用户滑动了100px,child 做了90px 的位移,你需要把 consumed[1]的值改成90,
         * 这样coordinatorLayout就能知道只处理剩下的10px的滚动。
         * @param coordinatorLayout
         * @param child
         * @param target
         * @param dx  用户水平方向的滚动距离
         * @param dy  用户竖直方向的滚动距离
         * @param consumed
         */
        @Override
        public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {
            super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
        }
    
        /**
         * 进行嵌套滚动时被调用
         * @param coordinatorLayout
         * @param child
         * @param target
         * @param dxConsumed target 已经消费的x方向的距离
         * @param dyConsumed target 已经消费的y方向的距离
         * @param dxUnconsumed x 方向剩下的滚动距离
         * @param dyUnconsumed y 方向剩下的滚动距离
         */
        @Override
        public void onNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
            super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
        }
    
        /**
         *  嵌套滚动结束时被调用,这是一个清除滚动状态等的好时机。
         * @param coordinatorLayout
         * @param child
         * @param target
         */
        @Override
        public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target) {
            super.onStopNestedScroll(coordinatorLayout, child, target);
        }
    
        /**
         * onStartNestedScroll返回true才会触发这个方法,接受滚动处理后回调,可以在这个
         * 方法里做一些准备工作,如一些状态的重置等。
         * @param coordinatorLayout
         * @param child
         * @param directTargetChild
         * @param target
         * @param nestedScrollAxes
         */
        @Override
        public void onNestedScrollAccepted(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
            super.onNestedScrollAccepted(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
        }
    
        /**
         * 用户松开手指并且会发生惯性动作之前调用,参数提供了速度信息,可以根据这些速度信息
         * 决定最终状态,比如滚动Header,是让Header处于展开状态还是折叠状态。返回true 表
         * 示消费了fling.
         *
         * @param coordinatorLayout
         * @param child
         * @param target
         * @param velocityX x 方向的速度
         * @param velocityY y 方向的速度
         * @return
         */
        @Override
        public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, View child, View target, float velocityX, float velocityY) {
            return super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY);
        }
    
        //可以重写这个方法对子View 进行重新布局
        @Override
        public boolean onLayoutChild(CoordinatorLayout parent, View child, int layoutDirection) {
            return super.onLayoutChild(parent, child, layoutDirection);
        }
    

    引入 material 包:

    implementation 'com.google.android.material:material:1.2.1'
    

    BottomSheetBehavior

    01.png
    1. 效果图


      03.jpg
    2. 布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/coordinator"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <TextView
            android:id="@+id/btn_show_bottom_sheet"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/darker_gray"
            android:padding="10dp"
            android:text="显示/隐藏 BottomSheet"
            android:textColor="@color/black" />
    
        <FrameLayout
            android:id="@+id/share_view"
            app:layout_behavior="@string/bottom_sheet_behavior"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/white"
            android:orientation="vertical"
            app:behavior_peekHeight="0dp"
            >
            <include layout="@layout/bottom_sheet_share_dialog"/>
        </FrameLayout>
    
    </androidx.coordinatorlayout.widget.CoordinatorLayout>
    

    bottom_sheet_share_dialog.xml

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/ll_bottom_sheet"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:behavior_peekHeight="80dp"
        app:layout_behavior="@string/bottom_sheet_behavior"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:background="@android:color/holo_red_light"
            android:gravity="center"
            android:text="上拉解锁隐藏功能"
            android:textColor="@color/white"
            android:textSize="20sp" />
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:background="@android:color/holo_blue_light"
            android:gravity="center"
            android:text="a"
            android:textSize="20sp" />
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:background="@android:color/holo_orange_dark"
            android:gravity="center"
            android:text="b"
            android:textSize="20sp" />
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:background="@android:color/holo_green_light"
            android:gravity="center"
            android:text="c"
            android:textSize="20sp" />
    
    </LinearLayout>
    
    1. 逻辑代码
    public class MainActivity extends BaseActivity {
        @BindView(R.id.share_view)
        FrameLayout mBottomSheet;
    
        private BottomSheetBehavior behavior;
    
        @Override
        public int getLayoutId() {
            return R.layout.activity_main;
        }
    
        @Override
        public void initView() {
    
        }
    
        @OnClick(R.id.btn_show_bottom_sheet)
        public void click(){
            behavior = BottomSheetBehavior.from(mBottomSheet);
            if (behavior.getState() == BottomSheetBehavior.STATE_EXPANDED) {
                behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
            }else {
                behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
            }
        }
    }
    

    BottomSheetDialog

    1. 效果图


      02.jpg
    2. 布局文件
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 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">
        <RelativeLayout
            android:id="@+id/top_layout"
            android:layout_width="match_parent"
            android:layout_height="90dp"
            android:elevation="1dp"
            tools:ignore="UnusedAttribute">
    
            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="75dp"
                android:background="@color/white"
                android:layout_alignParentBottom="true"
                android:paddingStart="120dp">
    
                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="bottom"
                    android:paddingBottom="5dp"
                    android:orientation="vertical">
    
                    <TextView
                        android:id="@+id/tv_total_price"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="¥88.88"
                        android:textColor="@color/purple_500"
                        android:textSize="16sp"
                        android:textStyle="bold"
                        tools:ignore="HardcodedText,TextViewEdits" />
    
    
                    <TextView
                        android:id="@+id/tv_goods_no"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:visibility="visible"
                        android:text="商品编码:888888"
                        tools:ignore="HardcodedText" />
    
                </LinearLayout>
    
    
            </FrameLayout>
    
            <androidx.cardview.widget.CardView
                android:id="@+id/cardView"
                android:layout_width="90dp"
                android:layout_height="90dp"
                android:layout_marginEnd="14dp"
                android:layout_marginStart="20dp"
                android:layout_marginBottom="5dp"
                app:cardBackgroundColor="@color/white"
                app:cardCornerRadius="6dp"
                app:cardElevation="2dp">
    
                <ImageView
                    android:id="@+id/iv_goods"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:scaleType="centerCrop"
                    android:src="@mipmap/meizi"
                    tools:ignore="ContentDescription" />
    
            </androidx.cardview.widget.CardView>
    
        </RelativeLayout>
    
        <androidx.core.widget.NestedScrollView
            android:id="@+id/scrollView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/top_layout"
            android:background="@color/white">
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginEnd="14dp"
                android:layout_marginStart="14dp"
                android:layout_marginTop="100dp"
                android:orientation="vertical">
    
            </LinearLayout>
    
        </androidx.core.widget.NestedScrollView>
    
        <LinearLayout
            android:id="@+id/bottom_layout"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_below="@+id/scrollView"
            android:orientation="horizontal">
    
            <TextView
                android:id="@+id/tv_add_shopping_sku"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:alpha="0.8"
                android:background="@color/colorAccent"
                android:gravity="center"
                android:text="加入购物车"
                android:textColor="@color/white"
                tools:ignore="HardcodedText" />
    
            <TextView
                android:id="@+id/tv_orders_sku"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="@color/purple_500"
                android:gravity="center"
                android:text="立即购买"
                android:textColor="@color/white"
                tools:ignore="HardcodedText" />
        </LinearLayout>
    
    </RelativeLayout>
    
    1. 逻辑代码
    public class MainActivity extends BaseActivity {
        @Override
        public int getLayoutId() {
            return R.layout.activity_main;
        }
    
        @Override
        public void initView() {
    
        }
    
        private void showDialog() {
            BottomSheetDialog dialog = new BottomSheetDialog(this);
            dialog.setContentView(R.layout.dialog_bottom_sheet);
    
            dialog.getDelegate().findViewById(R.id.design_bottom_sheet)
                    .setBackgroundColor(getResources().getColor(android.R.color.transparent));
            dialog.show();
    
        }
    
        @OnClick(R.id.btn_show_bottom_sheet)
        public void click(){
            showDialog();
        }
    }
    

    SwipeDissmissBehavior

    1. 布局文件
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/coordinator"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <TextView
            android:id="@+id/tv_swipe"
            android:layout_width="match_parent"
            android:layout_height="120dp"
            android:background="@color/red_f"
            android:padding="10dp"
            android:text="滑动删除"
            android:gravity="center"
            android:textColor="@color/black" />
    
    </androidx.coordinatorlayout.widget.CoordinatorLayout>
    
    1. 代码
    public class MainActivity extends BaseActivity {
        @BindView(R.id.tv_swipe)
        TextView mSwipe;
    
        private SwipeDismissBehavior mDismissBehavior;
    
        @Override
        public int getLayoutId() {
            return R.layout.activity_main;
        }
    
        @Override
        public void initView() {
            mDismissBehavior = new SwipeDismissBehavior();
            mDismissBehavior.setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_ANY);
            mDismissBehavior.setListener(new SwipeDismissBehavior.OnDismissListener() {
                @Override
                public void onDismiss(View view) {
    
                }
    
                @Override
                public void onDragStateChanged(int state) {
    
                }
            });
            CoordinatorLayout.LayoutParams coordinatorParams =
                    (CoordinatorLayout.LayoutParams) mSwipe.getLayoutParams();
            coordinatorParams.setBehavior(mDismissBehavior);
        }
    
    }
    

    相关文章

      网友评论

        本文标题:Kevin Learn Android:Behavior 相关

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