Android Launcher3桌面图标样式修改(添加圆角)

1.源码类:LauncherActivityCachingLogic.java

java 复制代码
/*
 * Copyright (C) 2018 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.icons;

import android.content.ComponentName;
import android.content.Context;
import android.content.pm.LauncherActivityInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.RectF;
import android.graphics.Shader;
import android.os.UserHandle;
import android.util.Log;

import com.android.launcher3.IconProvider;
import com.android.launcher3.R;
import com.android.launcher3.icons.cache.CachingLogic;
import com.android.launcher3.util.ResourceBasedOverride;

/**
 * Caching logic for LauncherActivityInfo.
 */
public class LauncherActivityCachingLogic
        implements CachingLogic<LauncherActivityInfo>, ResourceBasedOverride {

    /**
     * Creates and returns a new instance
     */
    public static LauncherActivityCachingLogic newInstance(Context context) {
        return Overrides.getObject(LauncherActivityCachingLogic.class, context,
                R.string.launcher_activity_logic_class);
    }

    @Override
    public ComponentName getComponent(LauncherActivityInfo object) {
        return object.getComponentName();
    }

    @Override
    public UserHandle getUser(LauncherActivityInfo object) {
        return object.getUser();
    }

    @Override
    public CharSequence getLabel(LauncherActivityInfo object) {
        return object.getLabel();
    }

    @Override
    public void loadIcon(Context context, LauncherActivityInfo object,
            BitmapInfo target) {
        LauncherIcons li = LauncherIcons.obtain(context);
        li.createBadgedIconBitmap(
                IconProvider.INSTANCE.get(context)
                        .getIcon(object, li.mFillResIconDpi, true /* flattenDrawable */),
                object.getUser(), object.getApplicationInfo().targetSdkVersion).applyTo(target);
        li.recycle();
        
        //这里添加即可
        target.icon=roundBitmap(target.icon,150,150,30);
    }

    /**
     * 添加圆角白色背景
     * @param bitmap
     * @param outWidth
     * @param outHeight
     * @param mRadius
     * @return
     */
    public Bitmap roundBitmap(Bitmap bitmap, int outWidth, int outHeight, float mRadius) {
        if (bitmap == null || bitmap.getWidth() <= 0 || bitmap.getHeight() <= 0) return null;

        //添加白色背景
        Bitmap newBp = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas bpCs = new Canvas(newBp);
        bpCs.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
        bpCs.drawColor(Color.WHITE);
        bpCs.drawBitmap(bitmap, 0, 0, null);
        bitmap = newBp;

        // 缩放设置
        float widthScale = outWidth * 1.0f / bitmap.getWidth();
        float heightScale = outHeight * 1.0f / bitmap.getHeight();
        Matrix matrix = new Matrix();
        matrix.setScale(widthScale, heightScale);

        BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        bitmapShader.setLocalMatrix(matrix);

        // 结果图
        Bitmap targetBitmap = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888);

        // 创建画笔
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setShader(bitmapShader);

        // 创建目标画布
        Canvas targetCanvas = new Canvas(targetBitmap);
        targetCanvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));

        targetCanvas.drawRoundRect(new RectF(0, 0, outWidth, outHeight), mRadius, mRadius, paint);

        return targetBitmap;
    }

}
相关推荐
郑州光合科技余经理10 分钟前
家政O2O平台解析:从0搭建上门预约小程序解决方案
android·java·开发语言·前端·小程序·架构·php
yueqc12 小时前
Android 渲染(三):掉帧监控
android·渲染·apm·掉帧
Mico182 小时前
MySQL 8.0.35 基于GTID 主从复制安装增强半同步复制
android·mysql·adb
Kapaseker2 小时前
你是不是还没用过 select?实战 Kotlin select
android·kotlin
__Witheart__3 小时前
适用于Android内核boot.img生成流程
android·rockchip
木易 士心3 小时前
Jetpack Compose 深度解析:初始组合与重组的底层奥秘
android
GitLqr12 小时前
Flutter 无障碍开发实战:玩转 Semantics 解决视障用户使用痛点
android·flutter·dart
雨白15 小时前
掌握 NestedScrolling 嵌套滑动:手写仿知乎折叠主页
android
Xzaveir17 小时前
别把所有“认证”都塞进 AuthService:实名、一键登录与号码身份的领域拆分
android·人工智能
BerrySen17817 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
android·人工智能