前言
Platform:RK35xx
Os Version : Android 14.0
由于适配遥控聚焦到AllApp_Button 以方便打开抽屉,参考了Android 11.0 的修改会有改动,不啰嗦了直接上货
所需要的资源文件
1.packages/apps/Launcher3/res/drawable-hdpi/ic_allapps.png
2.packages/apps/Launcher3/res/drawable-hdpi/ic_allapps_pressed.png
3.packages/apps/Launcher3/res/drawable-mdpi/ic_allapps.png
4.packages/apps/Launcher3/res/drawable-mdpi/ic_allapps_pressed.png
5.packages/apps/Launcher3/res/drawable-xhdpi/ic_allapps.png
6.packages/apps/Launcher3/res/drawable-xhdpi/ic_allapps_pressed.png
7.packages/apps/Launcher3/res/drawable-xxhdpi/ic_allapps.png
8.packages/apps/Launcher3/res/drawable-xxhdpi/ic_allapps_pressed.png
9.packages/apps/Launcher3/res/drawable/all_apps_button_icon.xml
10.packages/apps/Launcher3/res/layout/all_apps_button.xml
所修改的代码
1.packages/apps/Launcher3/src/com/android/launcher3/Hotseat.java 2.packages/apps/Launcher3/res/values/dimens.xml
图片资源
这里可以根据适配 适度拉伸图片,我都是用一个
ic_allapps.png
没有触发按下的图片
ic_allapps_pressed.png
被按下的图片
文件资源
all_apps_button_icon.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2011 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.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@drawable/ic_allapps_pressed" />
<item android:state_pressed="true" android:drawable="@drawable/ic_allapps_pressed" />
<item android:drawable="@drawable/ic_allapps" />
</selector>
all_apps_button.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 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.
-->
<TextView style="@style/BaseIcon" />
修改如下:
--- a/packages/apps/Launcher3/src/com/android/launcher3/Hotseat.java
+++ b/packages/apps/Launcher3/src/com/android/launcher3/Hotseat.java
@@ -26,6 +26,12 @@ import android.view.View;
import android.view.ViewDebug;
import android.view.ViewGroup;
import android.widget.FrameLayout;
+import android.widget.TextView;
+//Jackson add ++
+import com.android.launcher3.celllayout.CellLayoutLayoutParams;
+import android.graphics.drawable.Drawable;
+//Jackson add --
+
/**
* View class that represents the bottom row of the home screen.
@@ -41,7 +47,9 @@ public class Hotseat extends CellLayout implements Insettable {
private boolean mSendTouchToWorkspace;
private final View mQsb;
-
+ //Jackson add ++
+ private final Launcher mLauncher;
+ //Jackson add --
public Hotseat(Context context) {
this(context, null);
}
@@ -52,7 +60,9 @@ public class Hotseat extends CellLayout implements Insettable {
public Hotseat(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
-
+ //Jackson add ++
+ mLauncher = Launcher.getLauncher(context);
+ //Jackson add --
mQsb = LayoutInflater.from(context).inflate(R.layout.search_container_hotseat, th
is, false);
addView(mQsb);
}
@@ -81,6 +91,10 @@ public class Hotseat extends CellLayout implements Insettable {
} else {
setGridSize(dp.numShownHotseatIcons, 1);
}
+ //Jackson add ++
+ // Add AllAppsButton
+ addAllAppButton(dp.numShownHotseatIcons);
+ //Jackson add --
}
@Override
@@ -198,5 +212,39 @@ public class Hotseat extends CellLayout implements Insettable {
public View getQsb() {
return mQsb;
}
+ //Jackson add ++
+ private void addAllAppButton(int numHotseatIcons) {
+ // Add the Apps button
+ Context context = getContext();
+ DeviceProfile grid = mActivity.getDeviceProfile();
+ int allAppsButtonRank = numHotseatIcons / 2;
+
+ LayoutInflater inflater = LayoutInflater.from(context);
+ TextView allAppsButton = (TextView) inflater.inflate(R.layout.all_apps_button, th
is, false);
+ Drawable d = context.getResources().getDrawable(R.drawable.all_apps_button_icon);
+ d.setBounds(0, 0, grid.iconSizePx, grid.iconSizePx);
+
+ int scaleDownPx = getResources().getDimensionPixelSize(R.dimen.all_apps_button_sc
ale_down);
+ Rect bounds = d.getBounds();
+ d.setBounds(bounds.left, bounds.top + scaleDownPx / 2, bounds.right - scaleDownPx
,
+ bounds.bottom - scaleDownPx / 2);
+ allAppsButton.setCompoundDrawables(null, d, null, null);
+
+ allAppsButton.setContentDescription(context.getString(R.string.all_apps_button_la
bel));
+ if (mLauncher != null) {
+ allAppsButton.setOnClickListener((v) -> {
+ if (!mLauncher.isInState(LauncherState.ALL_APPS)) {
+ mLauncher.getStateManager().goToState(LauncherState.ALL_APPS);
+ }
+ });
+ allAppsButton.setOnFocusChangeListener(mLauncher.getFocusHandler());
+ }
+ int x = getCellXFromOrder(allAppsButtonRank);
+ int y = getCellYFromOrder(allAppsButtonRank);
+ CellLayoutLayoutParams lp = new CellLayoutLayoutParams(x, y, 1, 1);
+ lp.canReorder = false;
+ addViewToCellLayout(allAppsButton, -1, allAppsButton.getId(), lp, true);
+ }
+ //Jackson add --
}
Hotseat.java
/*
* Copyright (C) 2011 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.
*/
package com.android.launcher3;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewDebug;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
//Jackson add ++
import com.android.launcher3.celllayout.CellLayoutLayoutParams;
import android.graphics.drawable.Drawable;
//Jackson add --
/**
* View class that represents the bottom row of the home screen.
*/
public class Hotseat extends CellLayout implements Insettable {
// Ratio of empty space, qsb should take up to appear visually centered.
public static final float QSB_CENTER_FACTOR = .325f;
@ViewDebug.ExportedProperty(category = "launcher")
private boolean mHasVerticalHotseat;
private Workspace<?> mWorkspace;
private boolean mSendTouchToWorkspace;
private final View mQsb;
//Jackson add ++
private final Launcher mLauncher;
//Jackson add --
public Hotseat(Context context) {
this(context, null);
}
public Hotseat(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public Hotseat(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
//Jackson add ++
mLauncher = Launcher.getLauncher(context);
//Jackson add --
mQsb = LayoutInflater.from(context).inflate(R.layout.search_container_hotseat, this, false);
addView(mQsb);
}
/**
* Returns orientation specific cell X given invariant order in the hotseat
*/
public int getCellXFromOrder(int rank) {
return mHasVerticalHotseat ? 0 : rank;
}
/**
* Returns orientation specific cell Y given invariant order in the hotseat
*/
public int getCellYFromOrder(int rank) {
return mHasVerticalHotseat ? (getCountY() - (rank + 1)) : 0;
}
public void resetLayout(boolean hasVerticalHotseat) {
removeAllViewsInLayout();
mHasVerticalHotseat = hasVerticalHotseat;
DeviceProfile dp = mActivity.getDeviceProfile();
resetCellSize(dp);
if (hasVerticalHotseat) {
setGridSize(1, dp.numShownHotseatIcons);
} else {
setGridSize(dp.numShownHotseatIcons, 1);
}
//Jackson add ++
// Add AllAppsButton
addAllAppButton(dp.numShownHotseatIcons);
//Jackson add --
}
@Override
public void setInsets(Rect insets) {
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
DeviceProfile grid = mActivity.getDeviceProfile();
if (grid.isVerticalBarLayout()) {
mQsb.setVisibility(View.GONE);
lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
if (grid.isSeascape()) {
lp.gravity = Gravity.LEFT;
lp.width = grid.hotseatBarSizePx + insets.left;
} else {
lp.gravity = Gravity.RIGHT;
lp.width = grid.hotseatBarSizePx + insets.right;
}
} else {
mQsb.setVisibility(View.VISIBLE);
lp.gravity = Gravity.BOTTOM;
lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
lp.height = grid.hotseatBarSizePx;
}
Rect padding = grid.getHotseatLayoutPadding(getContext());
setPadding(padding.left, padding.top, padding.right, padding.bottom);
setLayoutParams(lp);
InsettableFrameLayout.dispatchInsets(this, insets);
}
public void setWorkspace(Workspace<?> w) {
mWorkspace = w;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// We allow horizontal workspace scrolling from within the Hotseat. We do this by delegating
// touch intercept the Workspace, and if it intercepts, delegating touch to the Workspace
// for the remainder of the this input stream.
int yThreshold = getMeasuredHeight() - getPaddingBottom();
if (mWorkspace != null && ev.getY() <= yThreshold) {
mSendTouchToWorkspace = mWorkspace.onInterceptTouchEvent(ev);
return mSendTouchToWorkspace;
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// See comment in #onInterceptTouchEvent
if (mSendTouchToWorkspace) {
final int action = event.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mSendTouchToWorkspace = false;
}
return mWorkspace.onTouchEvent(event);
}
// Always let touch follow through to Workspace.
return false;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
DeviceProfile dp = mActivity.getDeviceProfile();
mQsb.measure(MeasureSpec.makeMeasureSpec(dp.hotseatQsbWidth, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(dp.hotseatQsbHeight, MeasureSpec.EXACTLY));
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
int qsbMeasuredWidth = mQsb.getMeasuredWidth();
int left;
DeviceProfile dp = mActivity.getDeviceProfile();
if (dp.isQsbInline) {
int qsbSpace = dp.hotseatBorderSpace;
left = Utilities.isRtl(getResources()) ? r - getPaddingRight() + qsbSpace
: l + getPaddingLeft() - qsbMeasuredWidth - qsbSpace;
} else {
left = (r - l - qsbMeasuredWidth) / 2;
}
int right = left + qsbMeasuredWidth;
int bottom = b - t - dp.getQsbOffsetY();
int top = bottom - dp.hotseatQsbHeight;
mQsb.layout(left, top, right, bottom);
}
/**
* Sets the alpha value of just our ShortcutAndWidgetContainer.
*/
public void setIconsAlpha(float alpha) {
getShortcutsAndWidgets().setAlpha(alpha);
}
/**
* Sets the alpha value of just our QSB.
*/
public void setQsbAlpha(float alpha) {
mQsb.setAlpha(alpha);
}
public float getIconsAlpha() {
return getShortcutsAndWidgets().getAlpha();
}
/**
* Returns the QSB inside hotseat
*/
public View getQsb() {
return mQsb;
}
//Jackson add ++
private void addAllAppButton(int numHotseatIcons) {
// Add the Apps button
Context context = getContext();
DeviceProfile grid = mActivity.getDeviceProfile();
int allAppsButtonRank = numHotseatIcons / 2;
LayoutInflater inflater = LayoutInflater.from(context);
TextView allAppsButton = (TextView) inflater.inflate(R.layout.all_apps_button, this, false);
Drawable d = context.getResources().getDrawable(R.drawable.all_apps_button_icon);
d.setBounds(0, 0, grid.iconSizePx, grid.iconSizePx);
int scaleDownPx = getResources().getDimensionPixelSize(R.dimen.all_apps_button_scale_down);
Rect bounds = d.getBounds();
d.setBounds(bounds.left, bounds.top + scaleDownPx / 2, bounds.right - scaleDownPx,
bounds.bottom - scaleDownPx / 2);
allAppsButton.setCompoundDrawables(null, d, null, null);
allAppsButton.setContentDescription(context.getString(R.string.all_apps_button_label));
if (mLauncher != null) {
allAppsButton.setOnClickListener((v) -> {
if (!mLauncher.isInState(LauncherState.ALL_APPS)) {
mLauncher.getStateManager().goToState(LauncherState.ALL_APPS);
}
});
allAppsButton.setOnFocusChangeListener(mLauncher.getFocusHandler());
}
int x = getCellXFromOrder(allAppsButtonRank);
int y = getCellYFromOrder(allAppsButtonRank);
CellLayoutLayoutParams lp = new CellLayoutLayoutParams(x, y, 1, 1);
lp.canReorder = false;
addViewToCellLayout(allAppsButton, -1, allAppsButton.getId(), lp, true);
}
//Jackson add --
}
dimens.xml
diff --git a/packages/apps/Launcher3/res/values/dimens.xml b/packages/apps/Launcher3/res/values/dimens.xml
index 1079e0000d..9b71d7c6c5 100644
--- a/packages/apps/Launcher3/res/values/dimens.xml
+++ b/packages/apps/Launcher3/res/values/dimens.xml
@@ -443,4 +443,5 @@
<!-- Default Ime height. Used only for logging purposes.
Assume this is default keyboard height in EN locale in case the keyboard height is not known when queried.-->
<dimen name="default_ime_height">300dp</dimen>
+ <dimen name="all_apps_button_scale_down">0dp</dimen>
</resources>
效果图
最后,创作不易,转发请标注来源。
如果能帮到你,点一波关注,哥们,然后私发一句Jackson 666 感谢!