android 8.1高通8909平台桌面默认原生应用Launcher3,行业机不需要抽屉式样式,去抽屉式的方式网上有很多,在此不再赘述。
设备配置文件
大众机型配置,涵盖各种屏幕大小,根据屏幕大小匹配合适的行列,其中就有默认的排列顺序文件,由标签launcher:defaultLayoutId选择。
packages/apps/Launcher3/res/xml/device_profiles.xml
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2016 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<profiles xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.launcher3" >
<profile
launcher:name="Super Short Stubby"
launcher:minWidthDps="255"
launcher:minHeightDps="300"
launcher:numRows="2"
launcher:numColumns="3"
launcher:numFolderRows="2"
launcher:numFolderColumns="3"
launcher:minAllAppsPredictionColumns="3"
launcher:iconSize="48"
launcher:iconTextSize="13.0"
launcher:numHotseatIcons="3"
launcher:defaultLayoutId="@xml/default_workspace_3x3"
/>
<profile
launcher:name="Shorter Stubby"
launcher:minWidthDps="255"
launcher:minHeightDps="400"
launcher:numRows="3"
launcher:numColumns="3"
launcher:numFolderRows="3"
launcher:numFolderColumns="3"
launcher:minAllAppsPredictionColumns="3"
launcher:iconSize="48"
launcher:iconTextSize="13.0"
launcher:numHotseatIcons="3"
launcher:defaultLayoutId="@xml/default_workspace_3x3"
/>
<profile
launcher:name="Short Stubby"
launcher:minWidthDps="275"
launcher:minHeightDps="420"
launcher:numRows="3"
launcher:numColumns="4"
launcher:numFolderRows="3"
launcher:numFolderColumns="4"
launcher:minAllAppsPredictionColumns="4"
launcher:iconSize="48"
launcher:iconTextSize="13.0"
launcher:numHotseatIcons="5"
launcher:defaultLayoutId="@xml/default_workspace_4x4"
/>
<profile
launcher:name="Stubby"
launcher:minWidthDps="255"
launcher:minHeightDps="450"
launcher:numRows="3"
launcher:numColumns="4"
launcher:numFolderRows="3"
launcher:numFolderColumns="4"
launcher:minAllAppsPredictionColumns="4"
launcher:iconSize="48"
launcher:iconTextSize="13.0"
launcher:numHotseatIcons="5"
launcher:defaultLayoutId="@xml/default_workspace_4x4"
/>
<profile
launcher:name="Nexus S"
launcher:minWidthDps="296"
launcher:minHeightDps="491.33"
launcher:numRows="4"
launcher:numColumns="4"
launcher:numFolderRows="4"
launcher:numFolderColumns="4"
launcher:minAllAppsPredictionColumns="4"
launcher:iconSize="48"
launcher:iconTextSize="13.0"
launcher:numHotseatIcons="5"
launcher:defaultLayoutId="@xml/default_workspace_4x4"
/>
<profile
launcher:name="Nexus 4"
launcher:minWidthDps="359"
launcher:minHeightDps="567"
launcher:numRows="4"
launcher:numColumns="4"
launcher:numFolderRows="4"
launcher:numFolderColumns="4"
launcher:minAllAppsPredictionColumns="4"
launcher:iconSize="54"
launcher:iconTextSize="13.0"
launcher:numHotseatIcons="5"
launcher:defaultLayoutId="@xml/default_workspace_4x4"
/>
<profile
launcher:name="Nexus 5"
launcher:minWidthDps="335"
launcher:minHeightDps="567"
launcher:numRows="4"
launcher:numColumns="4"
launcher:numFolderRows="4"
launcher:numFolderColumns="4"
launcher:minAllAppsPredictionColumns="4"
launcher:iconSize="54"
launcher:iconTextSize="13.0"
launcher:numHotseatIcons="5"
launcher:defaultLayoutId="@xml/default_workspace_4x4"
/>
<profile
launcher:name="Large Phone"
launcher:minWidthDps="406"
launcher:minHeightDps="694"
launcher:numRows="5"
launcher:numColumns="5"
launcher:numFolderRows="4"
launcher:numFolderColumns="4"
launcher:minAllAppsPredictionColumns="4"
launcher:iconSize="56"
launcher:iconTextSize="14.4"
launcher:numHotseatIcons="5"
launcher:defaultLayoutId="@xml/default_workspace_5x5"
/>
<profile
launcher:name="Nexus 7"
launcher:minWidthDps="575"
launcher:minHeightDps="904"
launcher:numRows="5"
launcher:numColumns="6"
launcher:numFolderRows="4"
launcher:numFolderColumns="5"
launcher:minAllAppsPredictionColumns="4"
launcher:iconSize="64"
launcher:iconTextSize="14.4"
launcher:numHotseatIcons="7"
launcher:defaultLayoutId="@xml/default_workspace_5x6"
/>
<profile
launcher:name="Nexus 10"
launcher:minWidthDps="727"
launcher:minHeightDps="1207"
launcher:numRows="5"
launcher:numColumns="6"
launcher:numFolderRows="4"
launcher:numFolderColumns="5"
launcher:minAllAppsPredictionColumns="4"
launcher:iconSize="76"
launcher:iconTextSize="14.4"
launcher:numHotseatIcons="7"
launcher:defaultLayoutId="@xml/default_workspace_5x6"
/>
<profile
launcher:name="20-inch Tablet"
launcher:minWidthDps="1527"
launcher:minHeightDps="2527"
launcher:numRows="7"
launcher:numColumns="7"
launcher:numFolderRows="6"
launcher:numFolderColumns="6"
launcher:minAllAppsPredictionColumns="4"
launcher:iconSize="100"
launcher:iconTextSize="20.0"
launcher:numHotseatIcons="7"
launcher:defaultLayoutId="@xml/default_workspace_5x6"
/>
</profiles>
如何选择合适的设备配置文件
InvariantDeviceProfile根据获取的最小w x h在device_profiles.xml中选择最接近数值的profile进行初始化。
packages/apps/Launcher3/src/com/android/launcher3/InvariantDeviceProfile.java
InvariantDeviceProfile(Context context) {
...
// This guarantees that width < height
minWidthDps = Utilities.dpiFromPx(Math.min(smallestSize.x, smallestSize.y), dm);
minHeightDps = Utilities.dpiFromPx(Math.min(largestSize.x, largestSize.y), dm);
ArrayList<InvariantDeviceProfile> closestProfiles = findClosestDeviceProfiles(
minWidthDps, minHeightDps, getPredefinedDeviceProfiles(context));
InvariantDeviceProfile interpolatedDeviceProfileOut =
invDistWeightedInterpolate(minWidthDps, minHeightDps, closestProfiles);
...
ArrayList<InvariantDeviceProfile> getPredefinedDeviceProfiles(Context context) {
ArrayList<InvariantDeviceProfile> profiles = new ArrayList<>();
try (XmlResourceParser parser = context.getResources().getXml(R.xml.device_profiles)) {
final int depth = parser.getDepth();
int type;
while (((type = parser.next()) != XmlPullParser.END_TAG ||
parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) {
if ((type == XmlPullParser.START_TAG) && "profile".equals(parser.getName())) {
TypedArray a = context.obtainStyledAttributes(
Xml.asAttributeSet(parser), R.styleable.InvariantDeviceProfile);
int numRows = a.getInt(R.styleable.InvariantDeviceProfile_numRows, 0);
int numColumns = a.getInt(R.styleable.InvariantDeviceProfile_numColumns, 0);
float iconSize = a.getFloat(R.styleable.InvariantDeviceProfile_iconSize, 0);
profiles.add(new InvariantDeviceProfile(
a.getString(R.styleable.InvariantDeviceProfile_name),
a.getFloat(R.styleable.InvariantDeviceProfile_minWidthDps, 0),
a.getFloat(R.styleable.InvariantDeviceProfile_minHeightDps, 0),
numRows,
numColumns,
a.getInt(R.styleable.InvariantDeviceProfile_numFolderRows, numRows),
a.getInt(R.styleable.InvariantDeviceProfile_numFolderColumns, numColumns),
a.getInt(R.styleable.InvariantDeviceProfile_minAllAppsPredictionColumns, numColumns),
iconSize,
a.getFloat(R.styleable.InvariantDeviceProfile_landscapeIconSize, iconSize),
a.getFloat(R.styleable.InvariantDeviceProfile_iconTextSize, 0),
a.getInt(R.styleable.InvariantDeviceProfile_numHotseatIcons, numColumns),
a.getResourceId(R.styleable.InvariantDeviceProfile_defaultLayoutId, 0),
a.getResourceId(R.styleable.InvariantDeviceProfile_demoModeLayoutId, 0)));
a.recycle();
}
}
} catch (IOException|XmlPullParserException e) {
throw new RuntimeException(e);
}
return profiles;
}
...
}
odm
我们可以在device_profiles.xml中添加最最精准的屏幕尺寸作为定制设备的配置文件,因为配置文件中的尺寸肯定有所差异,才使用最近似值来选择,我们有设备就能配置更加接近的数值。
之后定义属于我们的排序文件:launcher:defaultLayoutId="@xml/default_workspace_4x3"
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2009 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<favorites xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.launcher3">
<!-- screen [0] -->
<!-- first row -->
<favorite
launcher:packageName=""
launcher:className=""
launcher:screen="0"
launcher:x="0"
launcher:y="0" />
<favorite
launcher:packageName=""
launcher:className=""
launcher:screen="0"
launcher:x="1"
launcher:y="0" />
<favorite
launcher:packageName=""
launcher:className=""
launcher:screen="0"
launcher:x="2"
launcher:y="0" />
<!-- second row -->
<favorite
launcher:packageName=""
launcher:className=""
launcher:screen="0"
launcher:x="0"
launcher:y="1" />
<favorite
launcher:packageName=""
launcher:className=""
launcher:screen="0"
launcher:x="1"
launcher:y="1" />
<favorite
launcher:packageName=""
launcher:className=""
launcher:screen="0"
launcher:x="2"
launcher:y="1" />
<!-- third row -->
<favorite
launcher:packageName=""
launcher:className=""
launcher:screen="0"
launcher:x="0"
launcher:y="2" />
<favorite
launcher:packageName=""
launcher:className=""
launcher:screen="0"
launcher:x="1"
launcher:y="2" />
<favorite
launcher:packageName=""
launcher:className=""
launcher:screen="0"
launcher:x="2"
launcher:y="2" />
</favorites>
默认排序用最原始的包名/类名来排列,x=0,y=0为屏幕左上角的第一个位置,以此类推。
具体的标签说明和位置信息请参考:android Launcher3 设置默认桌面应用
android8.1原生配置文件的写法是通过action + category的方式:
<resolve
launcher:screen="0"
launcher:x="0"
launcher:y="-1" >
<favorite launcher:uri="#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_EMAIL;end" />
<favorite launcher:uri="mailto:" />
</resolve>