android----側邊欄(DrawerLayout)(完美解決只能在邊緣滑出)

一步一步
第一步: 創(chuàng)建空項目

image.png

第二步: 修改布局文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000">

<!--  主頁面  -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#fff"
        >
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="首頁"
            />
    </LinearLayout>

<!--  側邊欄  -->
    <LinearLayout
        android:id="@+id/drawer_start"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#eda02c"
        android:layout_gravity="start"
        >
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="側邊欄"
            android:textColor="#fff"
            />
    </LinearLayout>

</androidx.drawerlayout.widget.DrawerLayout>

此時app效果圖為:


cebianlan_demo.gif

可以看到只能從邊緣觸發(fā)側邊欄, 想要類似qq側邊欄, 可以從中間滑出來, 網上有大部分有兩種方法, 一種反射修改mEdgeSize的值來實現(xiàn), 另一種通過activity事件分發(fā)配合mDrawerLayout.opDrawer(GravityCompat.START)來實現(xiàn), 后者必須手指離開屏幕才能觸發(fā), 體驗不好, 我們這里用第一種方法, 通過反射修改mEdgeSize的值

在onCreate()方法里進行編寫

    DrawerLayout mDrawerLayout;//根布局
    LinearLayout mLinearLayout;//側邊欄布局
    View mContent;//主頁面布局

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //--------------------START--------------------------------
        mDrawerLayout = findViewById(R.id.drawer_layout_root);//獲取根布局
        mLinearLayout = findViewById(R.id.drawer_start);//獲取側邊欄布局
        mContent = mDrawerLayout.getChildAt(0);//獲取主頁面布局, 可以看到主頁面布局是父布局的第一個子布局, 可以這樣獲得, 也可以定義id

        try {
            Field leftDraggerField = mDrawerLayout.getClass().getDeclaredField("mLeftDragger");//通過反射獲得DrawerLayout類中mLeftDragger字段
            leftDraggerField.setAccessible(true);//私有屬性要允許修改
            ViewDragHelper vdh = (ViewDragHelper) leftDraggerField.get(mDrawerLayout);//獲取ViewDragHelper的實例, 通過ViewDragHelper實例獲取mEdgeSize字段
            Field edgeSizeField = vdh.getClass().getDeclaredField("mEdgeSize");//依舊是通過反射獲取ViewDragHelper類中mEdgeSize字段, 這個字段控制邊緣觸發(fā)范圍
            edgeSizeField.setAccessible(true);//依然是私有屬性要允許修改
            int edgeSize = edgeSizeField.getInt(vdh);//這里獲得mEdgeSize真實值
            Log.d("AAA", "mEdgeSize: "+edgeSize);//這里可以打印一下看看值是多少

            //Start 獲取手機屏幕寬度番甩,單位px
            Point point = new Point();
            getWindowManager().getDefaultDisplay().getRealSize(point);
            //End 獲取手機屏幕

            Log.d("AAA", "point: "+point.x);//依然可以打印一下看看值是多少
            edgeSizeField.setInt(vdh, Math.max(edgeSize, point.x));//這里設置mEdgeSize的值3刍病P崂薄!,Math.max函數取得是最大值,也可以自己指定想要觸發(fā)的范圍值勺三,如: 500,注意單位是px
            //寫到這里已經實現(xiàn)了,但是你會發(fā)現(xiàn)需曾,如果長按觸發(fā)范圍吗坚,側邊欄也會彈出來,而且速度不太同步呆万,穩(wěn)定

            //Start 解決長按會觸發(fā)側邊欄
            //長按會觸發(fā)側邊欄是DrawerLayout類的私有類ViewDragCallback中的mPeekRunnable實現(xiàn)導致商源,我們通過反射把它置空
            Field leftCallbackField = mDrawerLayout.getClass().getDeclaredField("mLeftCallback");//通過反射拿到私有類ViewDragCallback字段
            leftCallbackField.setAccessible(true);//私有字段設置允許修改
            ViewDragHelper.Callback vdhCallback = (ViewDragHelper.Callback) leftCallbackField.get(mDrawerLayout);//ViewDragCallback類是私有類,我們返回類型定義成他的父類
            Field peekRunnableField = vdhCallback.getClass().getDeclaredField("mPeekRunnable");//我們依然是通過反射拿到關鍵字段谋减,mPeekRunnable
            peekRunnableField.setAccessible(true);//不解釋了
            //定義一個空的實現(xiàn)
            Runnable nullRunnable = new Runnable(){
                @Override
                public void run() {

                }
            };
            peekRunnableField.set(vdhCallback, nullRunnable);//給mPeekRunnable字段置空
            //End 解決長按觸發(fā)側邊欄

        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
        //--------------------END--------------------------------
    }

至此側邊欄邊緣問題解決牡彻,與當前版本qq側邊欄一樣


cebianlan_demo_finish.gif

原文鏈接:
完美開啟DrawerLayout全屏手勢側滑 - 簡書 (jianshu.com)
以上解決方案搬的是評論中 Febers 的評論!3龅庄吼!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市严就,隨后出現(xiàn)的幾起案子总寻,更是在濱河造成了極大的恐慌,老刑警劉巖盈蛮,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件废菱,死亡現(xiàn)場離奇詭異技矮,居然都是意外死亡抖誉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門衰倦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袒炉,“玉大人,你說我怎么就攤上這事樊零∥掖牛” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵驻襟,是天一觀的道長夺艰。 經常有香客問我,道長沉衣,這世上最難降的妖魔是什么郁副? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮豌习,結果婚禮上存谎,老公的妹妹穿的比我還像新娘拔疚。我一直安慰自己,他們只是感情好既荚,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布稚失。 她就那樣靜靜地躺著,像睡著了一般恰聘。 火紅的嫁衣襯著肌膚如雪句各。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天晴叨,我揣著相機與錄音诫钓,去河邊找鬼。 笑死篙螟,一個胖子當著我的面吹牛菌湃,可吹牛的內容都是我干的。 我是一名探鬼主播遍略,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼惧所,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绪杏?” 一聲冷哼從身側響起下愈,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蕾久,沒想到半個月后势似,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡僧著,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年履因,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盹愚。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡栅迄,死狀恐怖,靈堂內的尸體忽然破棺而出皆怕,到底是詐尸還是另有隱情毅舆,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布愈腾,位于F島的核電站憋活,受9級特大地震影響,放射性物質發(fā)生泄漏虱黄。R本人自食惡果不足惜悦即,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盐欺,春花似錦赁豆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粉洼,卻和暖如春节预,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背属韧。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工安拟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宵喂。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓糠赦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锅棕。 傳聞我的和親對象是個殘疾皇子拙泽,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內容

  • 原攻略來自于:How To Create a Cool 3D Sidebar Animation Like in ...
    好尼桑閱讀 1,314評論 0 4
  • 16宿命:用概率思維提高你的勝算 以前的我是風險厭惡者,不喜歡去冒險裸燎,但是人生放棄了冒險顾瞻,也就放棄了無數的可能。 ...
    yichen大刀閱讀 6,059評論 0 4
  • 公元:2019年11月28日19時42分農歷:二零一九年 十一月 初三日 戌時干支:己亥乙亥己巳甲戌當月節(jié)氣:立冬...
    石放閱讀 6,888評論 0 2