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

}
相关推荐
SHUIPING_YANG5 分钟前
webman项目开机自启动
android
幸运之旅25 分钟前
ARouter 基本原理
android·架构
沐怡旸39 分钟前
【底层机制】Handler/Looper 实现线程切换的技术细节
android·面试
轻口味1 小时前
Rokid Glasses 移动端控制应用开发初体验-助力业务创新
android·操作系统·app
帅得不敢出门2 小时前
Android监听第三方播放获取音乐信息及包名
android·java
2503_928411562 小时前
10.9 鸿蒙创建和运行项目
android·华为·harmonyos
alexhilton12 小时前
Kotlin互斥锁(Mutex):协程的线程安全守护神
android·kotlin·android jetpack
spencer_tseng13 小时前
Eclipse 4.7 ADT (Android Development Tools For Eclipse)
android·java·eclipse
archko15 小时前
android pdf框架-15,mupdf工具与其它
android·pdf
.豆鲨包18 小时前
【Android】MVP架构模式
android·架构