当前位置: 首页 > news >正文

Android 14 系统统一修改app启动时图标大小和圆角

Android 14 统一修改app启动时图标大小和圆角

修改如下:

目录:frameworks/base/core/java/android/window/SplashScreenView.java

frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java


import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.ColorInt;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.TestApi;
import android.annotation.UiThread;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Outline;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteCallback;
import android.os.Trace;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.SurfaceControlViewHost;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.android.internal.R;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.policy.DecorView;
import java.time.Duration;mUiThreadInitTask.accept(() -> view.mIconView = createSurfaceView(view));} else {view.mIconView = createSurfaceView(view);}view.initIconAnimation(mIconDrawable);view.mIconAnimationStart = mIconAnimationStart;view.mIconAnimationDuration = mIconAnimationDuration;} else if (mIconSize != 0) {ImageView imageView = view.findViewById(R.id.splashscreen_icon_view);assert imageView != null;//start add codeimageView.setOutlineProvider(new ViewOutlineProvider() {@Overridepublic void getOutline(View view, Outline outline) {outline.setRoundRect(0,0,view.getWidth(),view.getHeight(),40);}});imageView.setClipToOutline(true);// end add codefinal ViewGroup.LayoutParams params = imageView.getLayoutParams();params.width = mIconSize;params.height = mIconSize;imageView.setLayoutParams(params);if (mIconDrawable != null) {imageView.setImageDrawable(mIconDrawable);imageView.setScaleType(ImageView.ScaleType.FIT_XY);}if (mIconBackground != null) {imageView.setBackground(mIconBackground);}hasIcon = true;view.mIconView = imageView;}if (mOverlayDrawable != null || (!hasIcon && !mAllowHandleSolidColor)) {view.setNotCopyable();}private Bitmap mBrandingBitmap;private long mIconAnimationStartMillis;private long mIconAnimationDurationMillis;private SurfaceControlViewHost.SurfacePackage mSurfacePackage;private RemoteCallback mClientCallback;public SplashScreenViewParcelable(SplashScreenView view) {final View iconView = view.getIconView();//start add codeif(mIconSize==0){mIconSize = iconView != null ? iconView.getWidth() : 0;}// end add codemBackgroundColor = view.getInitBackgroundColor();mIconBackground = iconView != null ? copyDrawable(iconView.getBackground()) : null;mSurfacePackage = view.mSurfacePackageCopy;if (mSurfacePackage == null) {// We only need to copy the drawable if we are not using a SurfaceViewmIconBitmap = iconView != null? copyDrawable(((ImageView) view.getIconView()).getDrawable()) : null;}mBrandingBitmap = copyDrawable(view.getBrandingView().getBackground());

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityThread;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.AdaptiveIconDrawable;
import android.graphics.drawable.BitmapDrawable;
import android.util.DisplayMetrics;
import android.util.Slog;
import android.view.ContextThemeWrapper;
import android.view.Display;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.window.SplashScreenView;
import android.window.StartingWindowInfo;
import android.window.StartingWindowInfo.StartingWindowType;
import com.android.ex.camera2.portability.debug.Log;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.graphics.palette.Palette;
import com.android.internal.graphics.palette.Quantizer;
import com.android.internal.graphics.palette.VariationalKMeansQuantizer;
import com.android.internal.protolog.common.ProtoLog;
import com.android.launcher3.icons.BaseIconFactory;
import com.android.launcher3.icons.IconProvider;
import com.android.wm.shell.common.TransactionPool;
import com.android.wm.shell.protolog.ShellProtoLogGroup;mAllowHandleSolidColor = allowHandleSolidColor;return this;}SplashScreenView build() {Drawable iconDrawable;if (mSuggestType == STARTING_WINDOW_TYPE_SOLID_COLOR_SPLASH_SCREEN|| mSuggestType == STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN) {// empty or legacy splash screen casemFinalIconSize = 0;//  start add code              
//            } else if (mTmpAttrs.mSplashScreenIcon != null) {
//                // Using the windowSplashScreenAnimatedIcon attribute
//                iconDrawable = mTmpAttrs.mSplashScreenIcon;//                // There is no background below the icon, so scale the icon up
//                if (mTmpAttrs.mIconBgColor == Color.TRANSPARENT
//                        || mTmpAttrs.mIconBgColor == mThemeColor) {
//                    mFinalIconSize *= NO_BACKGROUND_SCALE;
//                }
//                createIconDrawable(iconDrawable, false /* legacy */, false /* loadInDetail */);//  end add code    } else {android.util.Log.d("xuping","SplashScreenContentDrawer--build---22222");final float iconScale = (float) mIconSize / (float) mDefaultIconSize;final int densityDpi = mContext.getResources().getConfiguration().densityDpi;final int scaledIconDpi =(int) (0.5f + iconScale * densityDpi * NO_BACKGROUND_SCALE);Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "getIcon");iconDrawable = mHighResIconProvider.getIcon(mActivityInfo, densityDpi, scaledIconDpi);Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);// start add code
//                if (!processAdaptiveIcon(iconDrawable)) {
//                    ProtoLog.v(ShellProtoLogGroup.WM_SHELL_STARTING_WINDOW,
//                            "The icon is not an AdaptiveIconDrawable");
//                    Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "legacy_icon_factory");
//                    final ShapeIconFactory factory = new ShapeIconFactory(
//                            SplashscreenContentDrawer.this.mContext,
//                            scaledIconDpi, mFinalIconSize);
//                    final Bitmap bitmap = factory.createScaledBitmap(iconDrawable,
//                            BaseIconFactory.MODE_DEFAULT);
//                    Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
//                    createIconDrawable(new BitmapDrawable(bitmap), true,
//                            mHighResIconProvider.mLoadInDetail);
//                }// end add codecreateIconDrawable(iconDrawable, true , mHighResIconProvider.mLoadInDetail);}return fillViewWithIcon(mFinalIconSize, mFinalIconDrawables, mUiThreadInitTask);}private class ShapeIconFactory extends BaseIconFactory {protected ShapeIconFactory(Context context, int fillResIconDpi, int iconBitmapSize) {super(context, fillResIconDpi, iconBitmapSize, true /* shapeDetection */);}}private Context mStandaloneContext;private IconProvider mStandaloneIconProvider;HighResIconProvider(Context context, IconProvider sharedIconProvider) {mSharedContext = context;mSharedIconProvider = sharedIconProvider;}Drawable getIcon(ActivityInfo activityInfo, int currentDpi, int iconDpi) {mLoadInDetail = false;// strat add codeDrawable drawable = getAppIconFromPackageName(mSharedContext,activityInfo.applicationInfo.packageName);
//            if (currentDpi < iconDpi && currentDpi < DisplayMetrics.DENSITY_XHIGH) {drawable = loadFromStandalone(activityInfo, currentDpi, iconDpi);
//            } else {
//                drawable = mSharedIconProvider.getIcon(activityInfo, iconDpi);
//            }
//            if (drawable == null) {
//                drawable = mSharedContext.getPackageManager().getDefaultActivityIcon();
//            }// end add codereturn drawable;}// strat add codepublic Drawable getAppIconFromPackageName(Context context, String packageName) {PackageManager packageManager = context.getPackageManager();Drawable appIcon =null;try {ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0);appIcon = packageManager.getApplicationIcon( applicationInfo);} catch (Exception e) {android.util.Log.d(TAG,"getAppIconFromPackageName Null");}return appIcon;}// end add codeprivate Drawable loadFromStandalone(ActivityInfo activityInfo, int currentDpi,int iconDpi) {if (mStandaloneContext == null) {final Configuration defConfig = mSharedContext.getResources().getConfiguration();mStandaloneContext = mSharedContext.createConfigurationContext(defConfig);mStandaloneIconProvider = new IconProvider(mStandaloneContext);}Resources resources;try {resources = mStandaloneContext.getPackageManager()

相关文章:

  • 解锁Linux共享内存:进程间通信的超高速通道(转)
  • 今日行情明日机会——20250425
  • 什么是CN2专线?全面解析中国电信的高性能网络服务
  • Android Studio开发中Application和Activity生命周期详解
  • MySQL基础——聚合查询(全面解析)
  • 入侵检测系统(IDS)与入侵防御系统(IPS):功能对比与部署实践
  • Linux-06 ubuntu 系统截图软件使用简单记录
  • 大型工程里 AI 编码困境重重,未来如何破局?
  • CodeMeter Runtime 安装失败排查与解决指南
  • Operating System 实验二 内存管理实验
  • 华硕NUC产品闪耀第31届中国国际广播电视信息网络展览会
  • 打造高功率、高电流和高可靠性电路板的厚铜PCB生产
  • Unity Shader Properties详解
  • 项目实战-基于大数据分析的暖通系统改造模型【感谢Akila公司以及学院的支持】
  • 如何通过电路测量运放的增益带宽积(GBP)和压摆率(SR)
  • 深入 Vue 核心:通信、生命周期与 API 的全面解析
  • 在 Ubuntu 22.04|20.04|18.04 上安装 PostgreSQL 13
  • Pycharm(三):梯度下降法
  • 【AI平台】n8n入门3:第二个工作流,链接网上大模型(含三种方式)
  • SQL语句练习 自学SQL网 基础查询
  • 大学2025丨专访南开人工智能学院院长赵新:人工智能未来会变成通识类课程
  • 文庙印象:一周城市生活
  • 一图读懂|上海海关公布一季度数据:钢材出口增长超143%
  • 贵州赤水被指“整改复耕”存形式主义,当地部署耕地流出整改“回头看”
  • 我国首次发布铁线礁、牛轭礁珊瑚礁“体检”报告,菲炮制言论毫无科学和事实依据
  • 920余名在缅甸当阳等地实施跨境电信网络诈骗的中国籍犯罪嫌疑人被移交我方