wallpaper设置壁纸图片被拉伸

时间:2021/04/07
之前公司不允许csdn,笔记写在其它地方。最近整理过来

问题描述:

原生壁纸设置壁纸之后,图片被拉伸。导出/data/system/users/0/wallpaper_info.xml

手机分辨率480854 壁纸被设置成2480 * 854

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<wp id="10" width="960" height="854" cropLeft="0" cropTop="0" cropRight="0" cropBottom="0" colorsCount="3" colorValue0="-13485218" colorValue1="-801681" colorValue2="-2239870" colorHints="4" name="" />

修复方案

1、壁纸代码中宽高计算
packages/apps/WallpaperPicker2/src/com/android/wallpaper/util/WallpaperCropUtils.java

public static Point getDefaultCropSurfaceSize(Resources resources, Display display, boolean scroll) {
    
    
    Point minDims = new Point();
    Point maxDims = new Point();
    display.getCurrentSizeRange(minDims, maxDims);

    int maxDim = Math.max(maxDims.x, maxDims.y);
    int minDim = Math.max(minDims.x, minDims.y);

    if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {
    
    
        Point realSize = new Point();
        display.getRealSize(realSize);
        maxDim = Math.max(realSize.x, realSize.y);
        minDim = Math.min(realSize.x, realSize.y);
    }

    final int defaultWidth, defaultHeight;
    if (resources.getConfiguration().smallestScreenWidthDp >= 720) {
    
    
        defaultWidth = (int) (maxDim * wallpaperTravelToScreenWidthRatio(maxDim, minDim));
        defaultHeight = maxDim;
    } else {
    
    
        //这个值默认是2 WALLPAPER_SCREENS_SPAN 双屏壁纸
        defaultWidth = minDim;//scroll ? Math.max((int) (minDim * WALLPAPER_SCREENS_SPAN), maxDim) : minDim;
        defaultHeight = maxDim;
    }


    return new Point(defaultWidth, defaultHeight);
}

2、packages/apps/Launcher3/src/com/android/launcher3/Workspace.java中设置壁纸宽高

protected void setWallpaperDimension() {
    
    
    Executors.THREAD_POOL_EXECUTOR.execute(new Runnable() {
    
    
        @Override
        public void run() {
    
    
            final Point size = LauncherAppState.getIDP(getContext()).defaultWallpaperSize;
            if (size.x != mWallpaperManager.getDesiredMinimumWidth()
                    || size.y != mWallpaperManager.getDesiredMinimumHeight()) {
    
    
                mWallpaperManager.suggestDesiredDimensions(size.x, size.y);
            }
        }
    });
}

3、frameworks/base/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java中根据显示大小计算壁纸宽高

loadSettingsLocked中:

private void ensureSaneWallpaperDisplaySize(DisplayData wpdData, int displayId) {
    
    
    // We always want to have some reasonable width hint.
    final int baseSize = getMaximumSizeDimension(displayId);
    final int width = getMinimumSizeDimension(displayId);//我自己加的
    Slog.i(TAG, "baseSize:" + baseSize + " width: "+width);
    Slog.i(TAG, "wpdData.mWidth:" + wpdData.mWidth + " wpdData.mHeight: "+wpdData.mHeight);
    if (wpdData.mWidth < width) {
    
    
        wpdData.mWidth = width;
    }
    if (wpdData.mHeight < baseSize) {
    
    
        wpdData.mHeight = baseSize;
    }
    Slog.w(TAG, "wpdData.mWidth:" + wpdData.mWidth + " wpdData.mHeight: "+wpdData.mHeight);
}

以上修改android11上无效
4、frameworks/base/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java

@Override
public boolean shouldZoomOutWallpaper() {
    
    //修改这里的返回值,并且修改WallpaperCropUtils中的修改,可以解决缩放问题
    return !SPRD_STABLE_WALLPAPER;
}

//默认会放大1.1倍
<!-- The max scale for the wallpaper when it's zoomed in -->
<item name="config_wallpaperMaxScale" format="float" type="dimen">1.10</item>

猜你喜欢

转载自blog.csdn.net/a396604593/article/details/129797207