1. 程式人生 > >解決AppBarLayout在華為手機6.0系統快速滑動時抖動問題

解決AppBarLayout在華為手機6.0系統快速滑動時抖動問題

   最近有個需求要做類似UC、今日頭條標題欄吸附懸停效果,相信大家會用CoordinatorLayout+AppBarLayout來實現,於是加入了專案中,效果是實現了,玩得很愉快,可是玩了一會發現一個原生的bug,問題描述如下:

用手指輕輕滑動CoordinatorLayout部分(, 上滑, 快速擡起手指, 形成一個fling操作. 其實就是向上滑動一下.這時, 整個CoordinatorLayout部分會向上移動(fling), 在停止移動之前, 在下面的白色區域(也就是xml佈局中的NestedScrollView)來一個反向的滑動(fling) , 這時整個頁面就會開始或大或小的抖動, 非常明顯.

螢幕錄製如下:

標題

解決問題的方法如下:

自定義AppBarLayout的Behavior程式碼:
/**
 * 自定義AppBarLayout的Behavior解決華為手機6.0系統抖動問題
 */
public class CustomBehavior extends AppBarLayout.Behavior {
    private OverScroller mScroller;

    public CustomBehavior() {
    }

    public CustomBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
        getParentScroller(context);
    }

    /**
     * 反射獲得滑動屬性。
     *
     * @param context
     */
    private void getParentScroller(Context context) {
        if (mScroller != null) return;
        mScroller = new OverScroller(context);
        try {
            Class<?> reflex_class = getClass().getSuperclass().getSuperclass();//父類AppBarLayout.Behavior父類的父類HeaderBehavior
            Field fieldScroller = reflex_class.getDeclaredField("mScroller");
            fieldScroller.setAccessible(true);
            fieldScroller.set(this, mScroller);
        } catch (Exception e) {
        }
    }

    //fling上滑appbar然後迅速fling下滑recycler時, HeaderBehavior的mScroller並未停止, 會導致上下來回晃動
    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed, int type) {
        if (mScroller != null) { //當recyclerView 做好滑動準備的時候 直接幹掉Appbar的滑動
            if (mScroller.computeScrollOffset()) {
                mScroller.abortAnimation();
            }
        }
        if (type == ViewCompat.TYPE_NON_TOUCH && getTopAndBottomOffset() == 0) { //recyclerview的慣性比較大 ,會頂在頭部一會兒, 到頭直接幹掉它的滑動
            ViewCompat.stopNestedScroll(target, type);
        }
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
    }

    @Override
    public boolean onTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent e) {

        switch (e.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                break;
        }

        return super.onTouchEvent(parent, child, e);
    }

在佈局中的使用方法如下:


大家可以親自體驗下沒有加自定義的Behavior會出現啥問題,最後放上完整程式碼地址

相關推薦

解決AppBarLayout手機6.0系統快速滑動抖動問題

   最近有個需求要做類似UC、今日頭條標題欄吸附懸停效果,相信大家會用CoordinatorLayout+AppBarLayout來實現,於是加入了專案中,效果是實現了,玩得很愉快,可是玩了一會發現一個原生的bug,問題描述如下: 用手指輕輕滑動CoordinatorLa

【Android開發】app升級報錯,解析包出現錯誤(手機8.0系統

問題描述: 今天釋出app版本升級,碰到華為手機8.0系統,安裝升級的時候提示,解析包時出現問題。而其他手機都是正常的。而且當我的包沒有經過360加固的時候,也是可以去升級新版本,加固過後就不行了。 這個導致這個問題的原因有很多,我先把我這邊app的問題處理方案介紹給大家

手機8.0 應用內安裝APK閃退問題

自動更新功能在安卓6.0 7.0下均沒問題華為安卓8.0手機閃退在網路上找了很多 都沒有解決耽誤了很長時間最後發現解決方法很簡單 只要在Mainfest.xml 中加入許可權編碼即可解決<uses-permissionandroid:name="android.perm

手機 Android8.0 使用程式碼安裝APK閃退問題

自己做了個自動更新功能過程是使用程式碼下載完新版本APK自動安裝在安卓6.0 7.0下均沒問題華為安卓8.0手機閃退在網路上找了很多 都沒有解決耽誤了很長時間最後發現解決方法很簡單 只要在Mainfest.xml 中加入許可權編碼即可解決<uses-permission

手機7.0以上7.0上popwindow位置顯示錯亂,飄

由於測試手機上華為meta8,升級了7.0以後突然popwindows顯示位置往上飄了, 其他機型沒啥問題,一直沒找到原因?後來看到一個連線? 原來是 in showAtLocation failed to no gravity 在7.0上沒有工作 解決

解決手機呼叫系統相簿返回值是null的問題

在開發專案中需要呼叫系統相簿,在別的android 手機上能正常的獲取到返回值,但是在華為上卻是返回值為null,下面請看程式碼 Intent imgIntent = new Intent(Inte

Android apk升級 相容6.0 7.0 低版本 手機

上篇部落格寫了用DownloadManager,進行下載,結果發現有些手機並不能相容,查詢原因是DownloadManager.Request 的setDestinationInExternalPublicDir()函式問題,這直接根源掛鉤,Request 有個

Android開發之手機無法看log日誌解決方法(親測可用榮耀6

華為榮耀的測試機,發現在Android Studio下無法檢視log日誌,看不了日誌就不方便解決問題了。 解決方法: 進入手機撥號介面輸入:*#*#2846579#*#*依次選擇ProjectMenu—後臺設定—-LOG設定—LOG開關 點選開啟, 點LOG級別選V

手機模糊拍照解決辦法

拍照模糊 華為拍照模糊 華為手機拍照模糊 華為Mate9、P10等手機拍照模糊、無法對焦的情況,除硬件問題(硬件問題建議去網點檢測,1年保修期內免費維修)、鏡頭汙染、對焦失敗等原因外,還可能是開啟了大光圈模式! 1.華為手機大光圈模式為什麽會導致拍照模糊?大光圈,可以令對焦的主體從雜亂的背景中凸顯

解決手機無法輸出Debug級別log的問題

進入 bsp name net 我們 人員 android開發 輸入 識別 近期購入了新款的華為手機榮耀8,手感、性能、顏值都非常好。作為android開發工程師,自然會用到真機進行日常的調試。然而,這部手機並沒有這麽“聽話“!反復嘗試開啟開發者選項中的設置項,依舊無法輸出

解決手機圖片選擇無效及產生的open failed: EACCES (Permission denied)錯誤

裏的 provide 圖片選擇 providers 加載 hot storage nts 手機 在華為手機上調起圖片選擇時原來的效果如下 原來的代碼是 Intent intent = new Intent(); intent.setAction(Intent.ACT

手機WebView長按不能複製,記一次少見奇葩bug解決之旅

風起 接到反饋,說是之前一個老專案的詳情頁(html)長按不能複製了(華為mate9),uh…不記得需求裡有長按複製功能,不過現在原生webview是支援長按複製的,所以就是個預設需求了,那這個bug是要改的。 拿手邊的華為和小米試了一下,的確不能複製,然後到模擬器上跑了下,uh…長

解決手機下方導航欄壓蓋佈局的方法(同時使用AndroidSlidingUpPanel和SlidingMenu出現的問題)

我在使用AndroidSlidingUpPanel開源專案的時候將專案匯入了我的工程中,同時我又使用了SlidingMenu的框架,於是出現了這種問題。 問題的解決:本來單獨使用AndroidSlidingUpPanel框架的時候我調出導航欄佈局也會跟著做相應適

vue2.0手機手機自帶瀏覽器開啟白屏的問題

使用vue2.0 開發的單頁面網站,  在華為部分型號(p20也是....),部分安卓手機開啟頁面是空白; 網上的方法是把把es6 轉 為 es5, 當時我使用的 vue-cli , webpack 內建babel,會自動轉碼, 排查這種可能性;  根據理解可能是這些瀏覽器的核心版本比

vue2.0手機手機自帶瀏覽器打開白屏的問題

因此 使用 sset 內置 info modules 發現 ron 內容 使用vue2.0 開發的單頁面網站, 在華為部分型號(p20也是....),部分安卓手機打開頁面是空白; 網上的方法是把把es6 轉 為 es5, 當時我使用的 vue-cli , webpack

解決手機USB除錯app閃退重啟介面清空log日誌問題

機型:華為mate10手機 開發環境:Android studio 3.0 開發app的時候,出現問題,閃退,去控制檯找錯誤日誌,看log的輸出,結果一秒閃過,什麼都沒有. 網上搜了半天,順便記錄: 進入撥號介面輸入:* #* #2846579#* #

開發中 手機無法 直接 進入相簿獲取圖片解決方案

開發中碰到無法直接進入相簿的情況,會彈出選擇介面,而需求是要直接從相簿獲取圖片public void localImage(int code) {Intent intent;if (Build.VERSION.SDK_INT < 19) {intent = new I

Android 6.0系統讀寫檔案出現FileNotFoundException:EACCES (permission denied)解決辦法

先檢查你的AndroidManifest.xml是否已經有讀寫許可權: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-

MAR 27 解決手機訪問Google Play:從伺服器檢索資訊出錯。[DF-DFERH-01]

雖然路由器已經設定了梯子,但是用華為手機訪問Google Play時,還是提示:從伺服器檢索資訊時出錯。[DF-DFERH-01]。   雖然在手機上把梯子設定成全域性模式,連線Google Play後再斷掉梯子連線可以升級應用,但實在是麻煩。   放狗搜了一

手機連線androidStudio和列印C程式碼log解決方法

相信有部分程式設計師碰到過華為手機開啟了開發者模式和打開了usb除錯模式後也連線不上androidStudio的問題 ,起初我也對這個簡單的問題折磨過一會,後來找到了原因其實很簡單 就是連上電腦後,開發者模式和usb除錯開啟後,下拉狀態列,在狀態列中有一個”正在