1. 程式人生 > >Android8.0 Launcher3 快捷方式圖示的圓角處理

Android8.0 Launcher3 快捷方式圖示的圓角處理

以防忘記,做個記錄。

類:LauncherIcons.java

對圖示進行縮放處理的函式:

public static Bitmap createIconBitmap(Drawable icon, Context context, float scale) {
        synchronized (sCanvas) {
            final int iconBitmapSize = LauncherAppState.getIDP(context).iconBitmapSize;
			float scaleM = (iconBitmapSize-iconBitmapSize*scale)/2;
            int width = iconBitmapSize;
            int height = iconBitmapSize;


            if (icon instanceof PaintDrawable) {
                PaintDrawable painter = (PaintDrawable) icon;
                painter.setIntrinsicWidth(width);
                painter.setIntrinsicHeight(height);
            } else if (icon instanceof BitmapDrawable) {
                // Ensure the bitmap has a density.
                BitmapDrawable bitmapDrawable = (BitmapDrawable) icon;
                Bitmap bitmap = bitmapDrawable.getBitmap();
                if (bitmap != null && bitmap.getDensity() == Bitmap.DENSITY_NONE) {
                    bitmapDrawable.setTargetDensity(context.getResources().getDisplayMetrics());
                }
            }


            int sourceWidth = icon.getIntrinsicWidth();
            int sourceHeight = icon.getIntrinsicHeight();
            if (sourceWidth > 0 && sourceHeight > 0) {
                // Scale the icon proportionally to the icon dimensions
                final float ratio = (float) sourceWidth / sourceHeight;
                if (sourceWidth > sourceHeight) {
                    height = (int) (width / ratio);
                } else if (sourceHeight > sourceWidth) {
                    width = (int) (height * ratio);
                }
            }
            // no intrinsic size --> use default size
            int textureWidth = iconBitmapSize;
            int textureHeight = iconBitmapSize;


            Bitmap bitmap = Bitmap.createBitmap(textureWidth, textureHeight,
                    Bitmap.Config.ARGB_8888);
            final Canvas canvas = sCanvas;
            canvas.setBitmap(bitmap);


            final int left = (textureWidth-width) / 2;
            final int top = (textureHeight-height) / 2;


            sOldBounds.set(icon.getBounds());
            if (Utilities.ATLEAST_OREO && icon instanceof AdaptiveIconDrawable) {
                int offset = Math.max((int)(ShadowGenerator.BLUR_FACTOR * iconBitmapSize),
                        Math.min(left, top));
                int size = Math.max(width, height);
                icon.setBounds(offset, offset, size, size);
            } else {
                icon.setBounds(left, top, left+width, top+height);
            }
            canvas.save(Canvas.MATRIX_SAVE_FLAG);
             //對圖示進行縮放處理,顯示為固定大小
            canvas.scale(scale, scale, textureWidth / 2, textureHeight / 2);
            icon.draw(canvas);
            canvas.restore();
            icon.setBounds(sOldBounds);
            canvas.setBitmap(null);
			
        //return bitmap;

        //返回已經過處理的圓角bitmap  
	return getRoundedBitmap(bitmap, scaleM);
        }
    }

圓角處理函式:

public static Bitmap getRoundedBitmap(Bitmap mBitmap, float scaleM){  
        Bitmap bgBitmap = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), Bitmap.Config.ARGB_8888);    
        
        Canvas mCanvas = sCanvas;
	mCanvas.setBitmap(bgBitmap);    
        Paint mPaint = new Paint(); 
	RectF mRectM = new RectF(scaleM, scaleM, mBitmap.getWidth()-scaleM, mBitmap.getHeight()-scaleM); //設定剪裁圓角的區域		
        Rect mRect = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight());    
        RectF mRectF = mRectM;    
         
        float roundPx = 15;    //圓角半徑
        mPaint.setAntiAlias(true);    
       //Log.d("wy"+TAG,"mBitmap.getWidth()="+mBitmap.getWidth()+", mBitmap.getHeight()="+mBitmap.getHeight());
        mCanvas.drawRoundRect(mRectF, roundPx, roundPx, mPaint);           
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));         
        mCanvas.drawBitmap(mBitmap, mRect, mRect, mPaint);    
        return bgBitmap;    
    }  

相關推薦

Android8.0 Launcher3 快捷方式圖示圓角處理

以防忘記,做個記錄。類:LauncherIcons.java對圖示進行縮放處理的函式:public static Bitmap createIconBitmap(Drawable icon, Context context, float scale) { sy

Android8.1 Launcher3修改app圖示

Android8.1 Launcher3修改app圖示 我們有一個需求是將預設的瀏覽器替換為chrome(谷歌瀏覽器),但是需要將chrome的圖示替換成我們重新設計的圖示: 首先將chrome加入進來: vendor/mediatek/proprietary

JMeter 去掉cmd命令視窗的 快捷方式圖示製作 流程

開啟使用jmeter時: 如果使用預設的jmeter.bat啟動的話,會出現一個CMD命令視窗之後再會啟動jmeter工作介面。 直接啟用ApacheJMeter.jar檔案即可跳過CMD命令視窗啟

電腦桌面上驚現 愛淘寶 快捷方式圖示

一天在看韓劇時,無意間看到桌面上出現一個 愛淘寶 快捷方式 圖示,以為是淘寶軟體,唉不對吧, alimamaagent.exe是什麼鬼,不是淘寶. 近期11.11購物節,無數的網頁、軟體都充斥著“血拼雙11”的廣告,這時的電腦桌面如果多了幾個雙11相關的快

MFC release 傳送到桌面快捷方式圖示問題

修改MFC應用程式圖示的方法,網路上已經很多。比較簡單的是用自己轉的ICON檔案替換IDR_MAINFRAME預設圖示檔案,在res資料夾裡。 現在說的問題是,即使實現了exe圖示的更改。然而在release檔案中右鍵傳送桌面快捷方式,出現在桌面的快捷方式圖示仍然是MFC預

桌面的快捷方式圖示異常

  今天開啟電腦,突然發現桌面的vs2013快捷方式變了模樣,看起來很是不爽,解決了一下。 首先,出現這種現象的原因,還是沒有搞清楚,望知道的人留言,萬分感謝! 解決方法很太麻煩了,我找到一種很簡單的

如何去掉快捷方式圖示上面的箭頭

win鍵+R開啟執行,輸入下面的指令執行即可 cmd /k reg delete "HKEY_CLASSES_ROOT\lnkfile" /v IsShortcut /f & taskkill

【學以致用】android功能實現7---android8.0 Launcher獲取快捷方式原始碼分析(3)

獲取完快捷方式的資訊之後,便是如何具體的將快捷方式的名字,圖示和開啟方式放置到桌面上。 最後一步addAndBindAddedWorkspaceItems(                 new LazyShortcutsProvider(context.getAppl

【學以致用】android功能實現5---android8.0 Launcher獲取快捷方式原始碼分析(1)

從其他應用往桌面建立快捷方式,android8.0統一採用requestPinShortcut的方式。 對於桌面而言,是怎麼從requestPinShortcut獲取快捷方式資訊在桌面建立快捷方式呢? Android8.0的快捷方式引數不再通過廣播傳送,而是存放在系統當中

Launcher3學習記錄-Launcher第一次啟動時的快捷方式、Widget加載流程

needed tca see task 通過 syn lvs 基本 stp Launcher3的主Activity是Launcher.java,在onCreate()方法中可以找到數據下載的入口。mModel 是類LauncherModel的引用。 1

Android shortcuts快捷方式實現(支付寶長按圖示彈出快捷方式入口)

前言 Android shortcuts算是比較老的技術了,現在許多諸如支付寶、百度地圖等都實現了這一功能,這一功能是Android7.1推出的新功能,但是在國內app使用的還是比較少。我們先來看一下支付寶實現的效果圖。 這樣我們在使用的時候會方便許多,個人認為這種快捷方式更適合靜

win10系統桌面圖示變為白色方框和去除桌面圖示快捷方式小箭頭的方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

安卓應用建立快捷方式的最新操作(相容安卓8.0

在安卓8.0以前,如果需要給安卓APP建立快捷方式,需要使用到廣播機制。 而在最新的安卓8.0中,舊的廣播建立快捷方式方式是已經過時甚至失效了的。 而新的快捷方式使用了一個新的類:ShortcutManager,谷歌在拋棄舊機制的同時,在ShortcutManager上加

安卓7.0以上作業系統長按桌面logo建立快捷方式

本文已授權微信公眾號:鴻洋(hongyangAndroid)在微信公眾號平臺原創首發。 就在前幾天的一個晚上, Google召開了它的秋季釋出會,

Android8.0 TV焦點處理流程原始碼分析

前言 現在基本上都是觸控式螢幕手機,導致很多開發者對焦點並沒有深刻認識,但仍然存在一些非觸屏手機,還有Android TV平臺都與焦點息息相關,這裡就總結下自己看過多篇文章和自己的實踐經驗。先看兩張焦點圖。 焦點基礎及原始碼分析通過兩篇來帶大家深入認識。

android8.0桌面圖示適配以及相應問題的解決

8.0出來已經有很長很長一段時間了,也有很多大廠app做了適配(華為8.0的手機上如果是圓形icon那就是做了適配的),作為開發者還是得跟著谷歌的腳步啊,直接開始:工欲善其事必先利其器,將as升級到3.0以上,在mipmap-anydpi-v26(沒有就手動建立一個)下建立新

Android 8.0 + Service開啟方式相容處理

Android 8.0 + ,對後臺服務進行了限制了。如果依然採用之前startService()方式。 會導致問題。 前後臺服務的一些區別: 類別 區別 應用 前臺服務 會在通知一欄顯示 ONGOING 的 Not

Android8.0 SystemUI 狀態列訊號圖示

Android 狀態列訊號更新架構 狀態列上訊號區域在電池圖示的左側包括 vpn,ethernet,wifi,sim,airplane等,該區域對應的View為SignalClusterView,其負責顯示以上訊號圖示的顯示 圖中紅框部分就是SignalClu

Android8.0應用安裝許可權處理

最近Google釋出8.0加強了未知應用的監管,本文記錄解決8.0App版本自動更新由於沒有未知應用安裝許可權(此許可權需使用者手動開啟)導致升級失敗問題。相容8.0以前的版本。溫馨提示記得新增基本許可權(6.0以上需動態申請哦): <uses-permissio

利用批處理新增受信任站點、增加ie收藏夾及桌面快捷方式

@echo off reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\dl.pconline.com.cn" /v ht