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

}
相关推荐
Good_tea_h1 小时前
Android中的单例模式
android·单例模式
计算机源码社6 小时前
分享一个基于微信小程序的居家养老服务小程序 养老服务预约安卓app uniapp(源码、调试、LW、开题、PPT)
android·微信小程序·uni-app·毕业设计项目·毕业设计源码·计算机课程设计·计算机毕业设计开题
丶白泽7 小时前
重修设计模式-结构型-门面模式
android
晨春计8 小时前
【git】
android·linux·git
标标大人9 小时前
c语言中的局部跳转以及全局跳转
android·c语言·开发语言
竹林海中敲代码9 小时前
Qt安卓开发连接手机调试(红米K60为例)
android·qt·智能手机
木鬼与槐10 小时前
MySQL高阶1783-大满贯数量
android·数据库·mysql
iofomo10 小时前
【Abyss】Android 平台应用级系统调用拦截框架
android·开发工具·移动端
AirDroid_cn12 小时前
在家找不到手机?除了语音助手,还可以用远程控制!
android·智能手机·远程控制·手机使用技巧·远程控制手机
Good_tea_h20 小时前
Android中如何处理运行时权限?
android