FloatingActionButton設(shè)置Behavior只能執(zhí)行一次原因以及解決辦法

這兩天重構(gòu)項(xiàng)目阎姥,遇到需要添加一個(gè)Fab的時(shí)候闭专,就隨便上網(wǎng)上copy了一段代碼,測(cè)試的時(shí)候發(fā)現(xiàn)逗余,只能執(zhí)行一次特咆,之后就不會(huì)走Behavior的onNestedScroll方法了。
在網(wǎng)上找了半天解決辦法录粱,也沒有找到腻格。最后只能看看源碼到底是因?yàn)槭裁窗苫埃苯由显创a


@Override
public boolean onStartNestedScroll(View child, View target, int axes, int type) {
    boolean handled = false;

    final int childCount = getChildCount();
    for (int i = 0; i < childCount; i++) {
        final View view = getChildAt(i);
        if (view.getVisibility() == View.GONE) {
            // If it's GONE, don't dispatch
            continue;
        }
        final LayoutParams lp = (LayoutParams) view.getLayoutParams();
        final Behavior viewBehavior = lp.getBehavior();
        if (viewBehavior != null) {
            final boolean accepted = viewBehavior.onStartNestedScroll(this, view, child,
                    target, axes, type);
            handled |= accepted;
            lp.setNestedScrollAccepted(type, accepted);
        } else {
            lp.setNestedScrollAccepted(type, false);
        }
    }
    return handled;
}

自定義的Behavior中的onStartNestedScroll方法最后會(huì)走到CoordinatorLayout方法的onStartNestedScroll方法中 在里面判斷了一下childView的visibility的屬性是不是GONE 是的話就會(huì)跳過

同樣的onNestedScroll中也會(huì)判斷childView的屬性,是GONE的時(shí)候就回跳過菜职。所以在設(shè)置需要執(zhí)行Behavior的View的屬性就不要設(shè)置成GONE就可以了青抛。

@Override
public void onNestedScroll(View target, int dxConsumed, int dyConsumed,
        int dxUnconsumed, int dyUnconsumed, int type) {
    final int childCount = getChildCount();
    boolean accepted = false;

    for (int i = 0; i < childCount; i++) {
        final View view = getChildAt(i);
        if (view.getVisibility() == GONE) {
            // If the child is GONE, skip...
            continue;
        }

        final LayoutParams lp = (LayoutParams) view.getLayoutParams();
        if (!lp.isNestedScrollAccepted(type)) {
            continue;
        }

        final Behavior viewBehavior = lp.getBehavior();
        if (viewBehavior != null) {
            viewBehavior.onNestedScroll(this, view, target, dxConsumed, dyConsumed,
                    dxUnconsumed, dyUnconsumed, type);
            accepted = true;
        }
    }

    if (accepted) {
        onChildViewsChanged(EVENT_NESTED_SCROLL);
    }
}


最后附上自己寫的BaseBehavior以及一個(gè)可用的Behavior


open class BaseBehavior<T : View> constructor(context: Context,attrs:AttributeSet): CoordinatorLayout.Behavior<T>(){

    private val mFastInterpolator = FastOutSlowInInterpolator()


    // 顯示view
    fun scaleShow(view: View,l :ListenerAnimatorEndBuild?) {
        view.visibility = View.VISIBLE
        ViewCompat.animate(view)
                .scaleX(1.0f)
                .scaleY(1.0f)
                .alpha(1.0f)
                .setDuration(500)
                .setListener(l?.build())
                .setInterpolator(mFastInterpolator)
                .start()
    }


    // 隱藏view
    fun scaleHide(view: View,l:ListenerAnimatorEndBuild?) {
        ViewCompat.animate(view)
                .scaleX(0.0f)
                .scaleY(0.0f)
                .alpha(0.0f)
                .setDuration(500)
                .setInterpolator(mFastInterpolator)
                .setListener(l?.build())
                .start()
    }


    class ListenerAnimatorEndBuild {
        // 記錄View移出動(dòng)畫是否執(zhí)行完。
        private var isOutExecute = false

        private val outAnimatorListener: ViewPropertyAnimatorListener

        // View移出動(dòng)畫是否執(zhí)行完酬核。
        val isFinish: Boolean
            get() = !isOutExecute

        init {
            outAnimatorListener = object : ViewPropertyAnimatorListener {
                override fun onAnimationStart(view: View) {
                    isOutExecute = true
                }

                override fun onAnimationEnd(view: View) {
                    view.visibility = View.INVISIBLE
                    isOutExecute = false
                }

                override fun onAnimationCancel(view: View) {
                    isOutExecute = false
                }
            }
        }

        // 返回ViewPropertyAnimatorListener蜜另。
        fun build(): ViewPropertyAnimatorListener {
            return outAnimatorListener
        }
    }

}


class FabBehavior constructor(context: Context, attributeSet: AttributeSet) : BaseBehavior<FloatingActionButton>(context, attributeSet) {

    private var  listenerAnimatorEndBuild = ListenerAnimatorEndBuild()

    override fun onStartNestedScroll(coordinatorLayout: CoordinatorLayout,
                                     child: FloatingActionButton,
                                     directTargetChild: View,
                                     target: View, axes: Int, type: Int): Boolean {
        return axes == ViewCompat.SCROLL_AXIS_VERTICAL
    }


    override fun onNestedScroll(coordinatorLayout: CoordinatorLayout,
                                child: FloatingActionButton,
                                target: View,
                                dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int,
                                type: Int) {
        if (dyConsumed > 0 && dyUnconsumed == 0) {
            KLog.d("behavior", "上滑中。愁茁。蚕钦。")
        }
        if (dyConsumed == 0 && dyUnconsumed > 0) {
            KLog.d("behavior", "到邊界了還在上滑。鹅很。。")
        }
        if (dyConsumed < 0 && dyUnconsumed == 0) {
            KLog.d("behavior", "下滑中罪帖。促煮。。")
        }
        if (dyConsumed == 0 && dyUnconsumed < 0) {
            KLog.d("behavior", "到邊界了整袁,還在下滑菠齿。。坐昙。")
        }

        //頁(yè)面向上滑動(dòng)像素?cái)?shù)大于0 || 拉到底還在向上拉 && 退出動(dòng)畫是否正在執(zhí)行 && FAB按鈕當(dāng)前顯示中
        if ((dyConsumed > 0 || dyUnconsumed > 0) && listenerAnimatorEndBuild.isFinish&& child.visibility == View.VISIBLE) {
            //隱藏Fab
            scaleHide(child,listenerAnimatorEndBuild)
        } else if ((dyConsumed < 0 || dyUnconsumed < 0) && child.visibility != View.VISIBLE) {
            //顯示Fab按鈕
            scaleShow(child,null)
        }
    }
    
}

copy過去就能用了 部分動(dòng)畫代碼是上網(wǎng)上找的绳匀,畢竟我懶的寫。炸客。疾棵。
至于是kotlin寫的也沒關(guān)系,之間copy的話 as會(huì)自動(dòng)轉(zhuǎn)為java的痹仙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末是尔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子开仰,更是在濱河造成了極大的恐慌拟枚,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件众弓,死亡現(xiàn)場(chǎng)離奇詭異恩溅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谓娃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門脚乡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人傻粘,你說我怎么就攤上這事每窖“锏簦” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵窒典,是天一觀的道長(zhǎng)蟆炊。 經(jīng)常有香客問我,道長(zhǎng)瀑志,這世上最難降的妖魔是什么涩搓? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮劈猪,結(jié)果婚禮上昧甘,老公的妹妹穿的比我還像新娘。我一直安慰自己战得,他們只是感情好充边,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著常侦,像睡著了一般浇冰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聋亡,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天肘习,我揣著相機(jī)與錄音,去河邊找鬼坡倔。 笑死漂佩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的罪塔。 我是一名探鬼主播投蝉,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼垢袱!你這毒婦竟也來了墓拜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤请契,失蹤者是張志新(化名)和其女友劉穎咳榜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爽锥,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涌韩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氯夷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臣樱。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雇毫,到底是詐尸還是另有隱情玄捕,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布棚放,位于F島的核電站枚粘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏飘蚯。R本人自食惡果不足惜馍迄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望局骤。 院中可真熱鬧攀圈,春花似錦、人聲如沸峦甩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凯傲。三九已至撕捍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泣洞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工默色, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留球凰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓腿宰,卻偏偏與公主長(zhǎng)得像呕诉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吃度,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容