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;
    }

}
相关推荐
早上好啊! 树哥37 分钟前
安卓开发:清除缓存并重启,删除指定路径下的文件缓存
android·缓存
h***346338 分钟前
Nginx 缓存清理
android·前端·后端
Tom4i1 小时前
Perfetto 快速上手
android·性能优化·perfetto
fatiaozhang95272 小时前
创维桌面云终端-创维LB2002-黑盒-国科gk6323-2+8G-短接强刷固件包
android·电视盒子·刷机固件·机顶盒刷机·创维lb2002·创维lb2002-黑盒·创维lb2002-白盒
q***71858 小时前
MySQL--》如何在MySQL中打造高效优化索引
android·mysql·adb
IT痴者10 小时前
《PerfettoSQL 的通用查询模板》---Android-trace
android·开发语言·python
游戏开发爱好者810 小时前
iOS IPA 上传工具全面解析,从 Transporter 到开心上架(Appuploader)命令行的高效上架实践
android·ios·小程序·https·uni-app·iphone·webview
alexhilton12 小时前
Jetpack Compose中的阴影艺术
android·kotlin·android jetpack
百***618715 小时前
Spring的构造注入
android·java·spring
Tom4i15 小时前
Kotlin 中的 inline 和 reified 关键字
android·开发语言·kotlin