欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

android 【安卓13-Framework】SystemUI定制之屏蔽下拉狀態(tài)欄部分快捷按鈕

1、需求

屏蔽下拉狀態(tài)欄谷歌錄屏、省電模式、二維碼掃描器等快捷按鈕。

2、修改路徑

普及:安卓的SystemUI包提供了狀態(tài)欄、導(dǎo)航欄、通知中心等重要的用戶界面元素。 狀態(tài)欄小部件UI顯示修改路徑:frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java

3、修改思路

下拉狀態(tài)欄屬于系統(tǒng)UI的一部分,位于SystemUI包下,不同安卓版本這個包的代碼有些許出入,但是萬變不離其宗,掌握修改原理即可,下面來一步步分析如何修改以及為什么要這樣修改:

(1)修改方法

打開這個文件:frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java,定位到這個方法: 這個方法做了兩件事,第一件事是加載“存貨”(Stock tiles),什么是存貨呢,就是安卓原生自帶的小部件,比如WiFi、藍牙、定位等快捷按鈕,第二件事是加載工程師自定義的小部件(Custom tiles),在這里我們先不研究自定義的小部件,以后有時間再研究。 既然是加載“存貨”,那這些存貨從哪里來呢,先不看這個,我先把修改代碼放出來,若不想研究原理可不看后面,修改代碼如下:

@Nullable

protected QSTileImpl createTileInternal(String tileSpec) {

// Stock tiles.

if (mTileMap.containsKey(tileSpec)

// We should not return a Garbage Monitory Tile if the build is not Debuggable

&& (!tileSpec.equals(GarbageMonitor.MemoryTile.TILE_SPEC) || Build.IS_DEBUGGABLE)) {

//屏蔽下拉狀態(tài)欄中的幾個tile,返回空對象

Set multipleStrings = new HashSet<>();

multipleStrings.add("screenrecord"); //谷歌錄屏

multipleStrings.add("battery"); // 省電模式

multipleStrings.add("qr_code_scanner"); // 二維碼掃描器

if (multipleStrings.contains(tileSpec)) {

return null;

}

return mTileMap.get(tileSpec).get();

}

// Custom tiles

if (tileSpec.startsWith(CustomTile.PREFIX)) {

return CustomTile.create(

mCustomTileBuilderProvider.get(), tileSpec, mQsHostLazy.get().getUserContext());

}

// Broken tiles.

Log.w(TAG, "No stock tile spec: " + tileSpec);

return null;

}

好了,結(jié)束!

nonono,開個玩笑,接下來講解原理,因為有些版本不是這樣改的,待會就知道了。

(2)修改原理

首先我們知道,谷歌的代碼寫的都是很優(yōu)雅的,想完全看懂不容易,這里我們只啃一部分,那就是下拉狀態(tài)欄那些快捷按鈕(QS tile)是如何添加的。 首先我們觀察SystemUI目錄,里面有很多子目錄,大部分都是每一個模塊細化出來,比如WiFi相關(guān)UI放在一個目錄,聲音UI放一個目錄,目錄里面基本都是寫小模塊的具體實現(xiàn)。

而qs目錄就是專門負責(zé)實現(xiàn)通知欄或狀態(tài)欄這個面板的各種功能和交互效果,比如圖標(biāo)的顯示、動畫效果、點擊事件的處理等。 這里我們主要看qs目錄,該目錄結(jié)構(gòu)如圖: 其中,QSContainerImpl.java 這個類作為下拉狀態(tài)欄快速面板的布局承載各種View,QSTileHost.java類是個接口實現(xiàn)類,里面實現(xiàn)了對tile的增刪改查操作: 例如,我們想移除谷歌相機,同樣可以在布局初始化處調(diào)用removeTile方法:

@Override

public void removeTile(String spec) {

if (spec.startsWith(CustomTile.PREFIX)) {

// If the tile is removed (due to it not actually existing), mark it as removed. That

// way it will be marked as newly added if it appears in the future.

setTileAdded(CustomTile.getComponentFromSpec(spec), mCurrentUser, false);

}

mMainExecutor.execute(() -> changeTileSpecs(tileSpecs-> tileSpecs.remove(spec)));

}

傳入一個字符串“screenrecord”,關(guān)于怎么知道各個組件的鍵值,后面會講。 注意,調(diào)用這個方法只能移除原生自帶的一些組件鍵值,addTile(String spec) 這個方法也是只能創(chuàng)建自帶的組件。 接下來回到上面修改的實現(xiàn)類QSFactoryImpl.java里面看它是如何移除谷歌相機的,首先,這個mTileMap是一個map 集合,里面加載了所有的谷歌原生tile鍵值 我們看下這個map 是從哪里傳遞過來的, 看到是通過構(gòu)造方法傳遞,繼續(xù)找哪里調(diào)用這個構(gòu)造方法 在這個類里面,我們看到tileMap在這里傳遞了進來,看一下tileMap的結(jié)構(gòu)

val tileMap = mutableMapOf>>(

"internet" to Provider { internetTile },

"bt" to Provider { bluetoothTile },

"dnd" to Provider { dndTile },

"inversion" to Provider { colorInversionTile },

"airplane" to Provider { airplaneTile },

"work" to Provider { workTile },

"rotation" to Provider { rotationTile },

"flashlight" to Provider { flashlightTile },

"location" to Provider { locationTile },

"cast" to Provider { castTile },

"hotspot" to Provider { hotspotTile },

"battery" to Provider { batterySaverTile },

"saver" to Provider { dataSaverTile },

"night" to Provider { nightDisplayTile },

"nfc" to Provider { nfcTile },

"dark" to Provider { darkModeTile },

"screenrecord" to Provider { screenRecordTile },

"reduce_brightness" to Provider { reduceBrightColorsTile },

"cameratoggle" to Provider { cameraToggleTile },

"mictoggle" to Provider { microphoneToggleTile },

"controls" to Provider { deviceControlsTile },

"alarm" to Provider { alarmTile },

"wallet" to Provider { quickAccessWalletTile },

"qr_code_scanner" to Provider { qrCodeScannerTile },

"onehanded" to Provider { oneHandedModeTile },

"color_correction" to Provider { colorCorrectionTile },

"dream" to Provider { dreamTile },

"font_scaling" to Provider { fontScalingTile }

)

這段代碼是 Kotlin 語言編寫的,它定義了一個名為 tileMap 的可變映射(MutableMap)。這個映射的鍵是字符串類型(String),而值是 Provider> 類型。Provider 是 Dagger 框架中的一個接口,它代表了一個對象的延遲提供者,即當(dāng)需要時才會創(chuàng)建該對象。以**“screenrecord” to Provider { screenRecordTile },**為例,這個screenrecord鍵值映射了一個provider,當(dāng)請求screenrecord鍵時,會返回一個screenRecordTile對象,這個對象就是谷歌錄屏這個按鈕的實體,實現(xiàn)了谷歌錄屏這個快捷按鈕的一些行為,比如點擊錄制,停止錄制等。 我們回到創(chuàng)建過程看 在創(chuàng)建過程時加入過濾集合,將不需要顯示的快捷按鈕的鍵值加到set中,如果集合包含要創(chuàng)建的tile,就返回一個空對象,上面對對象判空,如果為空,則不會創(chuàng)建tile。

明白了創(chuàng)建原理,改起來就很簡單了,比如在安卓其他版本,這個實現(xiàn)類并不是這樣寫的 這里這個實現(xiàn)類是直接在當(dāng)前類根據(jù)tile標(biāo)識返回對應(yīng)的實體

@Nullable

protected QSTileImpl createTileInternal(String tileSpec) {

// Stock tiles.

switch (tileSpec) {

case "wifi":

return mWifiTileProvider.get();

case "internet":

return mInternetTileProvider.get();

case "bt":

return mBluetoothTileProvider.get();

/*case "cell":

return mCellularTileProvider.get();*/

case "dnd":

return mDndTileProvider.get();

case "inversion":

return mColorInversionTileProvider.get();

case "airplane":

return mAirplaneModeTileProvider.get();

/*case "work":

return mWorkModeTileProvider.get();

case "rotation":

return mRotationLockTileProvider.get();

case "flashlight":

return mFlashlightTileProvider.get();

case "location":

return mLocationTileProvider.get();*/

case "cast":

return mCastTileProvider.get();

case "hotspot":

return mHotspotTileProvider.get();

/*case "battery":

return mBatterySaverTileProvider.get();

case "saver":

return mDataSaverTileProvider.get();

case "night":

return mNightDisplayTileProvider.get();

case "nfc":

return mNfcTileProvider.get();

case "dark":

return mUiModeNightTileProvider.get();*/

/*case "screenrecord":

return mScreenRecordTileProvider.get();*/

/*case "reduce_brightness":

return mReduceBrightColorsTileProvider.get();

case "cameratoggle":

return mCameraToggleTileProvider.get();

case "mictoggle":

return mMicrophoneToggleTileProvider.get();*/

case "controls":

return mDeviceControlsTileProvider.get();

/*case "alarm":

return mAlarmTileProvider.get();

case "wallet":

return mQuickAccessWalletTileProvider.get();

case "qr_code_scanner":

return mQRCodeScannerTileProvider.get();

case "onehanded":

return mOneHandedModeTileProvider.get();*/

case "color_correction":

return mColorCorrectionTileProvider.get();

/*case "dream":

return mDreamTileProvider.get();*/

}

// Custom tiles

if (tileSpec.startsWith(CustomTile.PREFIX)) {

return CustomTile.create(

mCustomTileBuilderProvider.get(), tileSpec, mQsHostLazy.get().getUserContext());

}

// Debug tiles.

/*if (Build.IS_DEBUGGABLE) {

if (tileSpec.equals(GarbageMonitor.MemoryTile.TILE_SPEC)) {

return mMemoryTileProvider.get();

}

}*/

// Broken tiles.

Log.w(TAG, "No stock tile spec: " + tileSpec);

return null;

}

這種也很簡單,直接注釋掉不要的tile即可,這個版本的實現(xiàn)類寫的稍微就沒那么優(yōu)雅了,但是基本原理都一樣。 好了,先寫到這里。

3、總結(jié)

系統(tǒng)下拉狀態(tài)欄包含的內(nèi)容還是很多的,目前只分析了如何移除快捷按鈕,繼續(xù)刨析還可以實現(xiàn)增加自定義的按鈕,不過得遵循谷歌的一套做法,再深入了解還可以美化狀態(tài)欄,這些就留給以后去慢慢分析了。

共勉:分享知識,共同進步!

好文推薦

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/18836301.html

發(fā)布評論

您暫未設(shè)置收款碼

請在主題配置——文章設(shè)置里上傳

掃描二維碼手機訪問

文章目錄