日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sidhu眼中的CoordinatorLayout.Behavior(二)

發(fā)布時間:2025/7/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sidhu眼中的CoordinatorLayout.Behavior(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

在上一節(jié)sidhu眼中的CoordinatorLayout.Behavior(一)中,我們講解了如何以通過Behavior來重寫某個控件的觸摸事件
可是我們只講了如何將觸摸事件拋出來,那怎么對這些數(shù)據(jù)進行處理呢?這就是我們今天要講的內(nèi)容了,Behavior的嵌套滑動機制
首先我們來理解一下什么是嵌套滑動,了解Android Design的大家想必已經(jīng)非常熟悉這種交互了

在一個控件滑動的同時,動態(tài)調(diào)整自身或其他控件的寬高或位置來達到更好的交互。
其實說白了,這個就是NestedScrollingParent和NestedScrollingChild的實際運用(不清楚的同學(xué)可以看這篇文章,Android 嵌套滑動機制(NestedScrolling))。仔細思考發(fā)現(xiàn),實現(xiàn)嵌套滑動的關(guān)鍵,其實就是將自身的滑動事件告訴其他控件。現(xiàn)在大家知道我寫第一篇文章的那個Behavior的用途了吧,哈哈、

那我們就開始講解今天的內(nèi)容,同樣,在文章的開始,我們先提出幾個疑問:

  • A發(fā)出消息,E也發(fā)出消息,怎樣判斷哪個是我們想要處理的滑動事件?

  • A使B變化的同時,A能否也能一起變化?

  • A使B發(fā)生改變的同時,B是否能發(fā)出消息,使C根據(jù)自己變化?

  • A發(fā)出消息,E也發(fā)出消息,怎樣判斷哪個是我們想要處理的滑動事件?

    我們再來看一下之前提過的Behavior的處理邏輯圖

    當收到觸摸事件后,CoordinatorLayout通知了所有的Behavior,換句話講,就是Behavior會收到自己不需要處理的滑動事件。
    我們來重寫一下Behavior的onStartNestedScroll方法,會發(fā)現(xiàn)里面有個叫做target的View參數(shù)傳進來,而這個target就是發(fā)出這個滑動事件的View。其對應(yīng)的,就是當初寫NestedScrollingChildHelper時,傳入的那個View。而onStartNestedScroll方法是在target調(diào)用了startNestedScroll的時候才被調(diào)用的,也就是滑動事件發(fā)出的起始時間點,所以此時用這個taget來判斷是否是我們所關(guān)心的那個view發(fā)出的最適合不過了。至于是用id(getId)還是類型(instanceof)來判斷就看你自己喜歡了、、
    在onStartNestedScroll這個方法里,return true則對后續(xù)的操作進行處理,return false則忽略掉,后續(xù)方法不會被調(diào)用。

    A使B變化的同時,A能否也能一起變化?

    這個答案當然也是肯定的啦,你連target對象都拿到了,還有什么不能做,哈哈、、
    說的多不如實戰(zhàn)練一下。那我們接著昨天的寫,網(wǎng)上很多都是根據(jù)滑動位移移到對應(yīng)距離的例子,那我們不妨寫一個其他的例子:根據(jù)手勢的上滑下滑來用動畫效果隱顯頭部。
    大致效果是這樣的

    藍色部分用的是我們上一篇文章寫的Behavior,而紅色部分則用我們今天寫的Behavior。

    先看一下xml文件

    <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><Viewandroid:id="@+id/rel_head"android:layout_width="match_parent"android:layout_height="200dp"android:background="@color/colorAccent"app:layout_behavior=".HideHeadBehavior" /><Viewandroid:id="@+id/rel_body"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="200dp"android:background="@color/colorPrimaryDark"app:layout_behavior=".TouchBehavior" /></android.support.design.widget.CoordinatorLayout>

    布局很簡單,上面有個200dp高的紅色部分,紅色下面是藍色部分

    Activity更簡單,因為它什么都不用做、、

    public class TouchTestActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_touch_text);}}

    那重點是我們的Behavior了

    package com.mintmedical.mybehaviordemo;import android.animation.ValueAnimator; import android.content.Context; import android.support.design.widget.CoordinatorLayout; import android.util.AttributeSet; import android.view.View;/*** Created by SidHu on 2016/8/17.*/ public class HideHeadBehavior extends CoordinatorLayout.Behavior {private boolean isHeadHide = false;private boolean isAnimating = false;private final int SCROOL_VALUE = 50;private int childHeight;private final int animationDuration = 500;public HideHeadBehavior(Context context, AttributeSet attrs) {super(context, attrs);}@Overridepublic boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {if (target.getId() == R.id.rel_body) {if (childHeight == 0) {childHeight = child.getHeight();}return true;} else {return false;}}@Overridepublic void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);if (isAnimating) {return;}if (dy > SCROOL_VALUE && !isHeadHide) {hide(child, target);} else if (dy < -SCROOL_VALUE && isHeadHide) {show(child, target);}}public void hide(final View child, final View target) {isHeadHide = true;ValueAnimator valueAnimator = new ValueAnimator();valueAnimator.setIntValues(0, childHeight);valueAnimator.setDuration(animationDuration);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {if (child.getBottom() > 0) {int value = (int) animation.getAnimatedValue();isAnimating = value != childHeight;child.layout(child.getLeft(), -value, child.getRight(), -value + childHeight);target.layout(target.getLeft(), -value + childHeight, target.getRight(), target.getBottom());}}});valueAnimator.start();}public void show(final View child, final View target) {isHeadHide = false;ValueAnimator valueAnimator = new ValueAnimator();valueAnimator.setIntValues(0, childHeight);valueAnimator.setDuration(animationDuration);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {if (child.getBottom() < childHeight) {int value = (int) animation.getAnimatedValue();isAnimating = value != childHeight;child.layout(child.getLeft(), value - childHeight, child.getRight(), value);target.layout(target.getLeft(), value, target.getRight(), target.getBottom());}}});valueAnimator.start();}}

    代碼簡直非~~非~非常簡單,對嘛,寫demo就是要簡單,有時候看別人寫的demo,無關(guān)業(yè)務(wù)一大堆,代碼老長,看了半天才找到那句對我有用的代碼。
    這個類里,排除兩個值動畫,只有兩個方法

    @Override public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {if (target.getId() == R.id.rel_body) {if (childHeight == 0) {childHeight = child.getHeight();}return true;} else {return false;} }

    判斷是否為我們關(guān)心的target對象,是返回true,否返回false,順便獲取了下child(也就是紅色部分)的高度。

    @Override public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);if (isAnimating) {return;}if (dy > SCROOL_VALUE && !isHeadHide) {hide(child, target);} else if (dy < -SCROOL_VALUE && isHeadHide) {show(child, target);} }

    接收到滑動數(shù)據(jù)后,假如動畫結(jié)束,對滑動的值進行一個閾值和方向的判斷,然后調(diào)用對應(yīng)動畫。
    而在值動畫里面,我們就僅僅不停改變Head和Body的Layout位置,實現(xiàn)動畫效果、
    整個類就解釋完了!快去試試在手機上的運行效果吧、

    A使B發(fā)生改變的同時,B是否能發(fā)出消息,使C根據(jù)自己變化?

    就得嘛得!!!!
    不是還有一個問題嘛、、、
    這個問題的回答當然也是肯定的啦,其實聰明的你或許已經(jīng)猜想到應(yīng)該怎么實現(xiàn)了,沒錯,就是根據(jù)第一篇文章依葫蘆畫瓢嘛。哈哈,趕緊試一試吧、不過到時候我寫的會有點稍微不一樣,因為下一篇要講的是:Behavior的布局依賴、、
    sidhu眼中的CoordinatorLayout.Behavior(三)

    如果覺得這篇文章對你有幫助,點個贊鼓勵一下吧、、(●'?'●)

    總結(jié)

    以上是生活随笔為你收集整理的sidhu眼中的CoordinatorLayout.Behavior(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。