Android 仿京東页慷,可滑動(dòng)的懸浮分享按鈕撇簿,頁(yè)面滑動(dòng)可顯示和隱藏

前言:

為了更好的推廣拉新聂渊,懸浮按鈕分享的使用越來(lái)越多,京東 識(shí)貨首頁(yè)都使用了常駐的懸浮按鈕四瘫,我們要實(shí)現(xiàn)的功能如下:
????1.懸浮按鈕可以上下拖動(dòng)
????2.頁(yè)面滑動(dòng)的時(shí)候,懸浮按鈕移動(dòng)到最右側(cè)隱藏起來(lái)欲逃,頁(yè)面停止滑動(dòng)的時(shí)候顯示出來(lái)
????3.懸浮按鈕點(diǎn)擊跳轉(zhuǎn)到指定的分享頁(yè)面

確定了功能點(diǎn)找蜜,實(shí)現(xiàn)了一個(gè)Demo來(lái)看下:


ShareButton.gif

分析實(shí)現(xiàn):

??1.功能實(shí)現(xiàn)起來(lái)其實(shí)并不復(fù)雜,首先按鈕能夠被拖動(dòng)稳析,就要處理他的onTouch事件洗做,所以我們就定義一個(gè)ShareImageView繼承ImageView,重寫(xiě)它的onTouchEvent方法 處理滑動(dòng)事件 控制view的移動(dòng)彰居,這里我們使用更新LayoutParams來(lái)更新位置

@Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        int touchSlop = 2;
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                isOnclick = true;
                startX = event.getRawX();
                startY = event.getRawY();
                break;

            case MotionEvent.ACTION_MOVE:
                float x = event.getRawX();
                float Y = event.getRawY();
                // 偏移量
                int offsetX = (int) (x - startX);
                int offsetY = (int) (Y - startY);
                if (Math.abs(offsetY) > touchSlop) {
                    isOnclick = false;
                }
                // 增量更新
                int margin = getTop() + offsetY;
                if (margin > top && margin < (screenHeight - bottom)) {
                    //layout(getLeft(), getTop()+offsetY, getRight(),getBottom() + offsetY);
                    RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) getLayoutParams();
                    //layoutParams.leftMargin = getLeft() + offsetX;
                    layoutParams.topMargin = margin;
                    setLayoutParams(layoutParams);
                }
                // 更新起始點(diǎn)
                startX = x;
                startY = Y;
                break;

            case MotionEvent.ACTION_UP:
                if (isOnclick){
                    performClick();
                }
                break;
        }
        return true;
    }
以上有兩個(gè)注意的點(diǎn):1.setLayoutParams更新位置是可以滑動(dòng)出屏幕的 這樣的體驗(yàn)肯定是不好的诚纸,所以要給它一個(gè)限制 ??2.在手指抬起的時(shí)候調(diào)用一下performClick();不然setOnClickListener不會(huì)被觸發(fā)。



??2.頁(yè)面滑動(dòng)時(shí)候顯示與隱藏陈惰,就要監(jiān)聽(tīng)recycleview的滾動(dòng)事件畦徘,SCROLL_STATE_IDLE,SCROLL_STATE_DRAGGING抬闯,SCROLL_STATE_SETTLING:
當(dāng)前屏幕停止?jié)L動(dòng)井辆,屏幕在滾動(dòng) 且 用戶(hù)仍在觸碰或手指還在屏幕上,隨用戶(hù)的操作屏幕上產(chǎn)生的慣性滑動(dòng)溶握。兩種滑動(dòng)事件觸發(fā)的時(shí)候都要進(jìn)行監(jiān)聽(tīng) 做隱藏處理杯缺,屏幕停止?jié)L動(dòng)時(shí)候顯示出來(lái)

private class MyScrollListener extends RecyclerView.OnScrollListener {

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            switch (newState) {
                //0:當(dāng)前屏幕停止?jié)L動(dòng);1時(shí):屏幕在滾動(dòng) 且 用戶(hù)仍在觸碰或手指還在屏幕上睡榆;2時(shí):隨用戶(hù)的操作萍肆,屏幕上產(chǎn)生的慣性滑動(dòng);
                case RecyclerView.SCROLL_STATE_IDLE:
                    isRecycleViewScroll = false;
                    showShareImage();
                    break;
                case RecyclerView.SCROLL_STATE_DRAGGING:
                    if (!isRecycleViewScroll && !isBottom && !isTop) {
                        isRecycleViewScroll = true;
                        hideShareImage();
                    }
                    break;
                case RecyclerView.SCROLL_STATE_SETTLING:
                    if (!isRecycleViewScroll && !isBottom  && !isTop) {
                        isRecycleViewScroll = true;
                        hideShareImage();
                    }
                    break;
            }
        }

        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            boolean bottom = recyclerView.canScrollVertically(1);
            boolean top = recyclerView.canScrollVertically(-1);
            if (!bottom) {
                isBottom = true;
            } else {
                isBottom = false;
            }
            if (!top) {
                isTop = true;
            } else {
                isTop = false;
            }
        }
    }
此過(guò)程中胀屿,滑動(dòng)到頂部和底部再繼續(xù)滑動(dòng)還是會(huì)觸發(fā)滑動(dòng)事件 所以要做一個(gè)判斷塘揣。
recyclerView.canScrollVertically(1);返回false的時(shí)候 判定滑動(dòng)到了底部
recyclerView.canScrollVertically(-1);返回false的時(shí)候 判定滑動(dòng)到了頂部



3.最后懸浮按鈕添加一下屬性動(dòng)畫(huà)

private void showShareImage() {
        float translationX = shareImageView.getTranslationX();
        ObjectAnimator animator = ObjectAnimator.ofFloat(shareImageView, "translationX", 0);
        animator.setDuration(600);
        if (!isAnimatorEnd) {
            animator.setStartDelay(1200);
        }
        animator.start();
    }

    private void hideShareImage() {
        isAnimatorEnd = false;
        float translationX = shareImageView.getTranslationX();
        ObjectAnimator animator = ObjectAnimator.ofFloat(shareImageView, "translationX", shareImageView.dp2px(getActivity(),70));
        animator.setDuration(600);
        animator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                isAnimatorEnd = true;
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });
        animator.start();
    }

注意動(dòng)畫(huà)未結(jié)束時(shí) 延時(shí)執(zhí)行顯示動(dòng)畫(huà)


詳細(xì)代碼見(jiàn) :

github地址:https://github.com/l845590743/ShareButton


如果對(duì)您有幫助,歡迎小星星一下??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碉纳,一起剝皮案震驚了整個(gè)濱河市勿负,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌劳曹,老刑警劉巖奴愉,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異铁孵,居然都是意外死亡锭硼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)蜕劝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)檀头,“玉大人轰异,你說(shuō)我怎么就攤上這事∈钍迹” “怎么了搭独?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)廊镜。 經(jīng)常有香客問(wèn)我牙肝,道長(zhǎng),這世上最難降的妖魔是什么嗤朴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任配椭,我火速辦了婚禮,結(jié)果婚禮上雹姊,老公的妹妹穿的比我還像新娘股缸。我一直安慰自己,他們只是感情好吱雏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布敦姻。 她就那樣靜靜地躺著,像睡著了一般坎背。 火紅的嫁衣襯著肌膚如雪替劈。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天得滤,我揣著相機(jī)與錄音陨献,去河邊找鬼。 笑死懂更,一個(gè)胖子當(dāng)著我的面吹牛眨业,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沮协,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼龄捡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了慷暂?” 一聲冷哼從身側(cè)響起聘殖,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎行瑞,沒(méi)想到半個(gè)月后奸腺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡血久,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年突照,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氧吐。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讹蘑,死狀恐怖末盔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情座慰,我是刑警寧澤陨舱,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站版仔,受9級(jí)特大地震影響隅忿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜邦尊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望优烧。 院中可真熱鬧蝉揍,春花似錦、人聲如沸畦娄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)熙卡。三九已至杖刷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驳癌,已是汗流浹背滑燃。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颓鲜,地道東北人表窘。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像甜滨,于是被迫代替她去往敵國(guó)和親乐严。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • 內(nèi)容 抽屜菜單 ListView WebView SwitchButton 按鈕 點(diǎn)贊按鈕 進(jìn)度條 TabLayo...
    8ba406212441閱讀 5,505評(píng)論 0 5
  • 一衣摩、ViewPager2介紹 1 簡(jiǎn)介 谷歌為什么要出這個(gè)組件呢昂验?官方是這么說(shuō)的: 2 具體改動(dòng): New fea...
    XQSY閱讀 18,429評(píng)論 1 25
  • MaterialDesign是一套全新的界面設(shè)計(jì)語(yǔ)言,包含視覺(jué),運(yùn)動(dòng),互動(dòng)效果等特性. Design Suppor...
    小徐andorid閱讀 964評(píng)論 0 9
  • JavaScript 與 HTML 之間的交互是通過(guò)事件實(shí)現(xiàn)的。事件艾扮,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特定的交互瞬...
    LemonnYan閱讀 679評(píng)論 0 4
  • 本節(jié)介紹各種常見(jiàn)的瀏覽器事件既琴。 鼠標(biāo)事件 鼠標(biāo)事件指與鼠標(biāo)相關(guān)的事件,主要有以下一些栏渺。 click 事件呛梆,dblc...
    許先生__閱讀 2,437評(píng)論 0 4