日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android默认壁纸的历史,Android 默认壁纸 简单分析

發布時間:2023/12/20 Android 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android默认壁纸的历史,Android 默认壁纸 简单分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android的背景墻紙功能的實現主要由散布在下面幾個文件中的類來完成:

(1)frameworks/base/core/java/android/app/WallpaperManager.java

提供了API類,類WallpaperManager的各種函數接口為應用開發者所使用。

(2)frameworks/base/services/java/com/android/server/WallpaperManagerService.java

上述的API類將跨進程調用到system_server進程中的服務類WallpaperManagerService

(3)frameworks/base/core/java/android/service/wallpaper/WallpaperService.java

定義了抽象類WallpaperServic以及內嵌的墻紙繪制引擎基類Engine(子類用于實現墻紙的繪制渲染,若需preview則需創建多個引擎子類實例)。另外,該文件所在文件夾中還定義了幾個AIDL接口文件,用于跨進程的調用。

(4)frameworks/base/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java

類ImageWallpaper實現了上面的WallpaperServic,同時其里面嵌套類DrawableEngine作為一個引擎子類,用于HomeScreen狀態下的墻紙的渲染繪制(見其drawFrameLocked函數以及drawWallpaperWithCanvas和drawWallpaperWithOpenGL,后者用于當機器的內存有512MB時采用硬件加速的OpenGL進行繪制渲染,因為其更耗內存)。在drawFrameLocked中 ,是否真的要繪制更新,則由是否可見(變量mVisible)、是否需要繪制更新(mRedrawNeeded)和位置偏移有改變(mOffsetsChanged)來控制。

背景圖片的繪制區域,則在updateWallpaperLocked中通過WallpaperManager獲取背景圖的位圖來得到:

mBackground = mWallpaperManager.getBitmap();

注意:所得到的位圖的尺寸則在WallpaperManagerService.java中確定,見WallpaperManagerService的兩個函數getWidthHint和getHeightHint。而后兩者中的背景圖片中的高和寬的值則由WallpaperManagerService.loadSettingsLocked裝載手機中的/data/system/wallpaer_info.xml得到(當刷機第一次重啟或恢復出廠設置后重啟時,該文件被生成,其中的值來自調用者對WallpaperManagerService.setDimensionHints的調用)。但是,第一次啟動時,wallpaer_info.xml不存在,也就不采用其里面的值。這時,則采用的是getMaximumSizeDimension,也就是背景圖的寬和高由getMaximumSizeDimension決定,代碼如下:

// We always want to have some reasonable width hint.

WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);

Display d = wm.getDefaultDisplay();

int baseSize = d.getMaximumSizeDimension();

if (mWidth < baseSize) {

mWidth = baseSize;

}

if (mHeight < baseSize) {

mHeight = baseSize;

}

這有可能帶來背景圖不能充滿整個屏幕的問題,因為ImageWallpaper.drawFrameLocked會根據surface大小來確定繪制背景:

SurfaceHolder sh = getSurfaceHolder();

final Rect frame = sh.getSurfaceFrame();

final int dw = frame.width();

final int dh = frame.height();

final int availw = dw - mBackgroundWidth;

final int availh = dh - mBackgroundHeight;

int xPixels = availw < 0 ? (int)(availw * mXOffset + .5f) : (availw / 2);

int yPixels = availh < 0 ? (int)(availh * mYOffset + .5f) : (availh / 2);

其中mBackgroundWidth和mBackgroundHeight來自WallpaperManagerService中的兩個函數getWidthHint和getHeightHint中的變量的值。筆者的一個工程樣機的調試log輸出如下:

11-27 09:43:20.030 2041 2041 D ImageWallpaper: dw=1080,dh=960,mBackgroundWidth=960,mBackgroundHeight=960,availw=120,availh=0,xPixels=60,yPixels=0,mXOffset=0.0,mYOffset=0.0

通過在WallpaperManagerService.loadSettingsLocked中改變其值的方式可以解決這一問題,但只能針對該產品,不具有普遍性:

diff --git a/services/java/com/android/server/WallpaperManagerService.java b/services/java/com/android/server/WallpaperManagerService.java

index 4925a4e..79cb8b8 100644

--- a/services/java/com/android/server/WallpaperManagerService.java

+++ b/services/java/com/android/server/WallpaperManagerService.java

@@ -388,7 +388,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub {

public void setDimensionHints(int width, int height) throws RemoteException {

checkPermission(android.Manifest.permission.SET_WALLPAPER_HINTS);

-

+ Slog.d(“@BillYang_ycg”, “setDimensionHints: width=”+width+”,height=”+height);

if (width }

@@ -809,7 +809,12 @@ class WallpaperManagerService extends IWallpaperManager.Stub {

Display d = wm.getDefaultDisplay();

int baseSize = d.getMaximumSizeDimension();

if (mWidth < baseSize) {

– mWidth = baseSize;

+ //The width of background paper is not correct if use getMaximumSizeDimension

+ // when first time boot after factory reset: wallpaper dose not cover the whole screen

+ //Here I hacked it to correct this issue. Added by @BillYang_ycg, Nov 27 2012

+ int w = d.getRawWidth()*2;

+ Slog.d(“@BillYang_ycg”,”mWidth=”+w);

+ mWidth = w;

}

if (mHeight < baseSize) {

mHeight = baseSize;

以上代碼基于Android 4.4.4 分析。

總結

以上是生活随笔為你收集整理的android默认壁纸的历史,Android 默认壁纸 简单分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。