Vorwort
Ich habe kürzlich eine Anfrage für die Google EDLA-Zertifizierung erhalten. Ich bin für die Änderung des nativen Desktop-Layouts von Google verantwortlich. Durch das Studium des Quellcodes werde ich einige Änderungsideen veröffentlichen. Sie können darin nachsehen, ob es nützliche Informationen dazu gibt Du. Zu den wichtigsten Änderungen gehören:
1. Die Suchleiste und die untere Navigationsleiste sind nicht zentriert.
2. Die Anwendungen in der Mitte sind nicht wie erforderlich angeordnet. Weitere Informationen finden Sie bei Mocke.
3. Neutrales S-Write, Screen Mirroring Kshare und Begrüßungsseitenanwendungen sind nicht zentriert zum nativen Google-Desktop hinzugefügt.
FIG-Situation:
Referenzbild:
1. Änderungen am Google-Suchfeld
Die von den Änderungen betroffenen Bereiche sind:
1、Launcher3\res\xml\device_profiles.xml
2、com/android/launcher3/Workspace.java
1. Beachten Sie zunächst den Code „device_profiles.xml“. Im Allgemeinen laden Geräte mit großem Bildschirm (Tablets) das 6*5-Layout und mobile Geräte das Layout des Mobiltelefons. In dieser Datei sind 4 verschiedene Layouttypen definiert. Wie kann festgestellt werden, welches Layout vom Gerät geladen wird? Wolltuch? Sie können lange auf das Anwendungssymbol auf dem Desktop drücken, dann beobachten, wie viele Raster verschoben werden können, und dann anhand der Anzahl der Zeilen und Spalten die zu ändernde Layoutposition ermitteln. Mein Gerät lädt beispielsweise ein 6 * 5-Layout. Ich ändere hier **launcher:numSearchContainerColumns="5"**, um das Google-Suchfeld so zu ändern, dass es 5 Raster einnimmt (insgesamt 7 Raster im horizontalen Bildschirm).
<--这个行数可以根据自己想要的效果修改,比如我就改了7*6布局,6行7列--/>
<grid-option
launcher:name="6_by_5"
launcher:numRows="6"
launcher:numColumns="7"
launcher:numSearchContainerColumns="5"
launcher:numFolderRows="3"
launcher:numFolderColumns="4"
launcher:numHotseatIcons="0"
launcher:hotseatColumnSpanLandscape="2"
launcher:numAllAppsColumns="6"
launcher:isScalable="true"
launcher:inlineNavButtonsEndSpacing="@dimen/taskbar_button_margin_6_5"
launcher:devicePaddingId="@xml/paddings_6x5"
launcher:dbFile="launcher_6_by_5.db"
launcher:defaultLayoutId="@xml/default_workspace_6x5"
launcher:deviceCategory="tablet" >
<display-option
launcher:name="Tablet"
launcher:minWidthDps="900"
launcher:minHeightDps="820"
launcher:minCellHeight="120"
launcher:minCellWidth="102"
launcher:minCellHeightLandscape="104"
launcher:minCellWidthLandscape="120"
launcher:iconImageSize="60"
launcher:iconTextSize="14"
launcher:borderSpaceHorizontal="16"
launcher:borderSpaceVertical="64"
launcher:borderSpaceLandscapeHorizontal="64"
launcher:borderSpaceLandscapeVertical="16"
launcher:horizontalMargin="54"
launcher:horizontalMarginLandscape="120"
launcher:allAppsCellWidth="96"
launcher:allAppsCellHeight="142"
launcher:allAppsCellWidthLandscape="126"
launcher:allAppsCellHeightLandscape="126"
launcher:allAppsIconSize="60"
launcher:allAppsIconTextSize="14"
launcher:allAppsBorderSpaceHorizontal="8"
launcher:allAppsBorderSpaceVertical="16"
launcher:allAppsBorderSpaceLandscape="16"
launcher:hotseatBarBottomSpace="30"
launcher:hotseatBarBottomSpaceLandscape="40"
launcher:canBeDefault="true" />
</grid-option>
</profiles>
2. Ändern Sie die Position des Google-Suchfelds in workspace.java. Suchen Sie diese Methode in der Klasse: bindAndInitFirstWorkspaceScreen und suchen Sie sie hier.
public void bindAndInitFirstWorkspaceScreen() {
if (!FeatureFlags.QSB_ON_FIRST_SCREEN) {
return;
}
// Add the first page
CellLayout firstPage = insertNewWorkspaceScreen(Workspace.FIRST_SCREEN_ID, getChildCount());
// Always add a first page pinned widget on the first screen.
if (mFirstPagePinnedItem == null) {
// In transposed layout, we add the first page pinned widget in the Grid.
// As workspace does not touch the edges, we do not need a full
// width first page pinned widget.
mFirstPagePinnedItem = LayoutInflater.from(getContext())
.inflate(R.layout.search_container_workspace, firstPage, false);
}
int cellHSpan = mLauncher.getDeviceProfile().inv.numSearchContainerColumns;
//格子数从0开始算,这里表示搜索框位置从X轴第2格子,y轴第3个格子算起,x轴占据5(cellHSpan)个格子,y轴占据1个格子
CellLayoutLayoutParams lp = new CellLayoutLayoutParams(1, 2, cellHSpan, 1, FIRST_SCREEN_ID);
lp.canReorder = false;
if (!firstPage.addViewToCellLayout(
mFirstPagePinnedItem, 0, R.id.search_container_workspace, lp, true)) {
Log.e(TAG, "Failed to add to item at (0, 0) to CellLayout");
mFirstPagePinnedItem = null;
}
}
Tipp: Wenn auf dem Desktop zu Beginn kein Google-Suchfeld vorhanden ist, können Sie es in Form eines Widgets hinzufügen. Beim Hinzufügen eines Widgets gibt es zwei Situationen. Die konkrete zu verwendende Methode hängt davon ab, ob das System die Konfiguration gelesen hat Datei. Wenn nicht, verwenden Sie sie. Die erste Möglichkeit besteht darin, sie direkt zur Layoutdatei hinzuzufügen, z. B. res/xml/default_workspace_6x5.xml:
<appwidget
container="-100"
screen="0"
x="1"
y="2"
spanX="5"
spanY="1"
packageName="com.google.android.googlequicksearchbox"
className="com.google.android.googlequicksearchbox.SearchWidgetProvider"/>
Eine andere Möglichkeit besteht darin, beispielsweise: release\vendor\partner_gms\apps\GmsSampleIntegration\res_dhs_full\xml\partner_default_layout.xml zur Konfigurationsdatei unter dem google_gms-Paket hinzuzufügen
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2017 Google Inc. All Rights Reserved. -->
<favorites>
<!-- Hotseat (We use the screen as the position of the item in the hotseat) -->
<!-- Dialer Messaging Calendar Contacts Camera -->
<!--<favorite container="-101" screen="0" x="0" y="0" packageName="com.google.android.dialer" className="com.google.android.dialer.extensions.GoogleDialtactsActivity"/>-->
<!--<favorite container="-101" screen="1" x="1" y="0" packageName="com.google.android.apps.messaging" className="com.google.android.apps.messaging.ui.ConversationListActivity"/>-->
<!-- <favorite container="-101" screen="0" x="0" y="0" packageName="com.android.settings" className="com.android.settings.Settings"/> -->
<!-- <favorite container="-101" screen="1" x="1" y="0" packageName="com.android.deskclock" className="com.android.deskclock.DeskClock"/> -->
<!-- <favorite container="-101" screen="2" x="2" y="0" packageName="com.google.android.calendar" className="com.android.calendar.event.LaunchInfoActivity"/> -->
<!-- <favorite container="-101" screen="3" x="3" y="0" packageName="com.google.android.contacts" className="com.android.contacts.activities.PeopleActivity"/> -->
<!-- <favorite container="-101" screen="4" x="4" y="0" packageName="com.android.camera2" className="com.android.camera.CameraLauncher"/> -->
<!-- In Launcher3, workspaces extend infinitely to the right, incrementing from zero -->
<!-- Google folder -->
<!-- Google, Chrome, Gmail, Maps, YouTube, (Drive), (Music), (Movies), Duo, Photos -->
<folder title="@string/google_folder_title" screen="0" x="1" y="3">
<favorite packageName="com.google.android.googlequicksearchbox" className="com.google.android.googlequicksearchbox.SearchActivity"/>
<favorite packageName="com.android.chrome" className="com.google.android.apps.chrome.Main"/>
<favorite packageName="com.google.android.gm" className="com.google.android.gm.ConversationListActivityGmail"/>
<favorite packageName="com.google.android.apps.maps" className="com.google.android.maps.MapsActivity"/>
<favorite packageName="com.google.android.youtube" className="com.google.android.youtube.app.honeycomb.Shell$HomeActivity"/>
<favorite packageName="com.google.android.apps.docs" className="com.google.android.apps.docs.app.NewMainProxyActivity"/>
<favorite packageName="com.google.android.apps.youtube.music" className="com.google.android.apps.youtube.music.activities.MusicActivity"/>
<favorite packageName="com.google.android.videos" className="com.google.android.videos.GoogleTvEntryPoint"/>
<favorite packageName="com.google.android.apps.tachyon" className="com.google.android.apps.tachyon.MainActivity"/>
<favorite packageName="com.google.android.apps.photos" className="com.google.android.apps.photos.home.HomeActivity"/>
</folder>
<favorite screen="0" x="5" y="3" packageName="com.android.vending" className="com.android.vending.AssetBrowserActivity"/>
<appwidget screen="0" x="2" y="0" packageName="com.android.deskclock" className="com.android.alarmclock.DigitalAppWidgetProvider" spanX="3" spanY="2" />
<appwidget screen="0" x="1" y="2" packageName="com.google.android.googlequicksearchbox" className="com.google.android.googlequicksearchbox.SearchWidgetProvider" spanX="5" spanY="1" />
</favorites>
Der auskommentierte Inhalt ist die Anwendung, die die HotSeat-Anzeige auf dem Desktop definiert. Das appwidget-Tag wird zum Hinzufügen von Widgets verwendet. Die Desktop-Uhr kann auf diese Weise hinzugefügt werden. Das Ordner-Tag definiert einen Desktop-Ordner, der die zu speichernden Anwendungen definieren kann im Ordner. .
2. Ändern Sie die Position der ersten Bildschirmanwendung
Wie beim Google-Suchfeld wird die Anzahl der Zeilen und Spalten des Desktops in der Datei „device_profiles.xml“ definiert, und dann wird der geänderte Speicherort basierend darauf bestimmt, ob das System die Layoutdatei „partner_default_layout.xml“ liest; (1) Wenn ja Lesen Sie, es befindet sich in partner_default_layout.xml. Definieren Sie den Paketnamen, den Typ und die Standortinformationen der Anwendung. <favorite screen="0" x="5" y="3" packageName="com.android.vending" className="com.android.vending.AssetBrowserActivity"/>
Fügen Sie beispielsweise die Google Store-App in der 6. Spalte von screen="0" (erster Bildschirm) und der 4. Zeile des Rasters hinzu . (2) Wenn die Layoutdatei partner_default_layout.xml nicht gelesen wird, ändern Sie den Anwendungsspeicherort in der entsprechenden X×X.xml.
3. Änderung der unteren Taskleiste und Navigationsleiste
1. Wenn die HotSeat-Anwendung unten festgelegt ist, d. h. das in partner_default_layout.xml definierte Tag „container="-101" (Teil des in der Datei auskommentierten Codes), wird die unten festgelegte Anwendung verwendet auf dem Desktop angezeigt werden. Zeigt die zuletzt verwendete Taskleiste an. Wenn von HotSeat angeheftete Anwendungen blockiert sind, wird die zuletzt verwendete Taskleiste standardmäßig angezeigt, um die angehefteten Anwendungen zu ersetzen. Die Anzahl der in der zuletzt verwendeten Taskleiste angezeigten Symbole hängt vom Launcher ab:numHotseatIcons=" 0"-Attribut in der Datei device_profiles.xml. isTablet festlegen Attribut auf false , was bedeutet, dass das Gerät auf eingestellt ist Auf dem Bildschirm des Mobiltelefons wird die zuletzt verwendete Taskleiste nicht auf dem Bildschirm des Mobiltelefons angezeigt und die Navigationsleiste wird standardmäßig zentriert. Ich habe diese Methode ausprobiert, aber sie funktioniert bei großen Geräten nicht -Bildschirmgeräte und können nicht den gewünschten Effekt erzielen. Sie können lesen, was er geschrieben hat: Geräte mit großem Bildschirm Navigationsleiste rechts
2. Wenn Sie meine Methode verwenden, setzen Sie die Anzahl der von hotSeat angezeigten Symbole auf 0: launcher:numHotseatIcons="0"
Wenn Sie es direkt kompilieren, tritt während der Laufzeit eine Laufzeitausnahme auf. Wenn Sie das Protokoll durchsuchen, werden Sie feststellen, dass es viele Stellen im Quellcode gibt Dies wird bei der Berechnung des Layouts entfernt. Nehmen Sie numHotseatIcons und wir wissen, dass der Divisor nicht 0 sein kann, sodass der Desktop mit einem Fehler abstürzt. Zu diesem Zeitpunkt müssen wir den Ort ändern, an dem die Ausnahme verursacht wird ( beachten Sie, dass das Setzen von numHotseatIcons auf 1 und 0 eine Ausnahme verursacht , da für numHotseatIcons eine -1-Operation vorliegt). Der geänderte Speicherort lautet wie folgt:
com/android /launcher3/DeviceProfile.java
Drücken Sie in dieser Kategorie Strg+F, um nach numShownHotseatIcons zu suchen. Alle Berechnungen im Zusammenhang mit numShownHotseatIcons werden beurteilt. Wenn es 0 ist, können Sie den Algorithmus in einen anderen ändern. Sie können
die Variable auch suchen und verfolgen numHotseatIcons zuerst global in device_profiles.xml und verfolgen Sie es Schritt für Schritt. Gehen Sie zur Klasse DeviceProfile.java, um den gesamten Prozess klarer zu machen.
Hier ist der spezifische Speicherort meiner Änderungen. Die Screenshots enthalten Zeilennummern als Referenz:
Hinweis Diese Methode wird auch darin verwendet.
Ändern Sie diese beiden Berechnungsmethoden
und ändern Sie sie hier. Wir haben die aktuelle Taskleiste entfernt! !
4. Der nächste Schritt besteht darin, die Navigationsleiste zu zentrieren
Zuerst beobachten wir die Datei „device_profiles.xml“ und stellen fest, dass es diese Variable gibt.
Auf der Suche nach dieser Variablen verfolgen wir den Code und stellen fest, dass diese Variable den dp-Wert der unteren Navigationsleiste vom rechten Rand aus steuert. Je größer der Wert, Je näher es an der Mitte liegt. Mit dieser Idee ist es nicht schwierig, die Navigationsleiste zu zentrieren. Zunächst wissen wir, dass die Navigationsleiste rechts zentriert ist, da das System erkennt, dass es sich um ein Gerät mit großem Bildschirm handelt Tablet. Da wir das Tablet-Attribut beibehalten möchten, können wir die Zentrierung der Navigationsleiste nicht steuern, indem wir das Gerät in den Mobilmodus wechseln. Sie können also den rechten Rand steuern!
Das Ändern dieses Werts ist sehr einfach. Sie müssen nur den referenzierten Ressourcenwert ändern.
Wir geben die Datei ein und ändern den rechten Rand.
Sie können diesen Wert langsam debuggen. Ich habe ihn hier zentriert.
5. Zusammenfassung
Schreiben Sie eine Zusammenfassung: Stellen Sie zunächst fest, ob das System die Layoutdatei in partner_gms lädt, und ändern Sie dann den Layoutcode. Ich habe diesen Quellcode mehr als eine Woche lang studiert. Es gibt nicht genügend Informationen zum Launcher3 von Android 13 im Internet. Am Ende muss ich den Quellcode-Tracking-Code selbst studieren und ihn während dieser Zeit kompilieren und debuggen. Dutzende Male! !
endgültige Wirkung