Android客制化------7.0设置壁纸存在的一些问题
来源:互联网 发布:c语言软件测试 编辑:程序博客网 时间:2024/06/06 21:02
最近在开7.0的坑,遇到了一些小问题,记录一下。很大可能这个问题只是我这个芯片的代码上才存在的,不过殊途同归啦。
第一个问题就是,我们增加内置可选壁纸,选择这些壁纸后进行设置,会发现拉伸很明显。通过增加打印log发现
diff --git a/src/com/android/wallpaperpicker/WallpaperCropActivity.java b/src/com/android/wallpaperpicker/WallpaperCropActivity.javaold mode 100644new mode 100755index bdb601b..67d1551--- a/src/com/android/wallpaperpicker/WallpaperCropActivity.java+++ b/src/com/android/wallpaperpicker/WallpaperCropActivity.java@@ -337,15 +337,22 @@ public class WallpaperCropActivity extends Activity implements Handler.Callback Point inSize = mCropView.getSourceDimensions(); Point outSize = WallpaperUtils.getDefaultWallpaperSize(getResources(), getWindowManager());+ android.util.Log.d(LOGTAG,"inSize.x = " + inSize.x + " inSize.y = " + inSize.y+ + " outSize.x = " + outSize.x + " outSize.y = " + outSize.y); RectF crop = Utils.getMaxCropRect( inSize.x, inSize.y, outSize.x, outSize.y, false); // Passing 0, 0 will cause launcher to revert to using the // default wallpaper size CropAndFinishHandler onEndCrop = new CropAndFinishHandler(new Point(0, 0), shouldFadeOutOnFinish); CropAndSetWallpaperTask cropTask = new CropAndSetWallpaperTask( streamProvider, this, crop, streamProvider.getRotationFromExif(this), outSize.x, outSize.y, onEndCrop); DialogUtils.executeCropTaskAfterPrompt(this, cropTask, getOnDialogCancelListener()); }
我们的壁纸尺寸是1024*600,log打印的inSize都是正确的,但是outSize却变成了1200*1024了,由此产生了壁纸设置后有拉伸的情况。
因此问题就是出在这个Size的变化上,我们继续跟踪源码,会发现
diff --git a/src/com/android/wallpaperpicker/WallpaperUtils.java b/src/com/android/wallpaperpicker/WallpaperUtils.javaold mode 100644new mode 100755index 1532190..a4d88d7--- a/src/com/android/wallpaperpicker/WallpaperUtils.java+++ b/src/com/android/wallpaperpicker/WallpaperUtils.java@@ -137,7 +137,7 @@ public final class WallpaperUtils { // We need to ensure that there is enough extra space in the wallpaper // for the intended parallax effects- final int defaultWidth, defaultHeight;+ int defaultWidth, defaultHeight; if (res.getConfiguration().smallestScreenWidthDp >= 720) { defaultWidth = (int) (maxDim * wallpaperTravelToScreenWidthRatio(maxDim, minDim)); defaultHeight = maxDim;@@ -145,6 +145,11 @@ public final class WallpaperUtils { defaultWidth = Math.max((int) (minDim * WALLPAPER_SCREENS_SPAN), maxDim); defaultHeight = maxDim; }+ android.util.Log.d("WallpaperCropActivity"," res.getConfiguration().smallestScreenWidthDp = "+ + res.getConfiguration().smallestScreenWidthDp + " defaultWidth = " + defaultWidth+ + " minDim =" + minDim + " maxDim =" + maxDim);+ defaultWidth = maxDim;+ defaultHeight = minDim; sDefaultWallpaperSize = new Point(defaultWidth, defaultHeight); } return sDefaultWallpaperSize;
问题的根源就是这个defaultWidth和defaultHeight啦。继续打印log发现maxDim和minDim就是我们正确的壁纸尺寸,这两个变量都是final的更改下修饰符,同时将最终设置的尺寸更改为正确的,辣么设置的壁纸的拉伸问题就暂时解决了。
第二个问题,就是设置sd卡中的图片作为壁纸,这个东西源码分析的过程比较复杂。可以通过dumpsys wallpaper以及dumpsys SurfaceFlinger来查看图片的设置尺寸。更改的地方涉及三处。分别是launcher3、framework/base/core以及SystemUI。
packages/apps/Launcher3diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.javaindex 38545e2..ecd3ad6 100644--- a/src/com/android/launcher3/InvariantDeviceProfile.java+++ b/src/com/android/launcher3/InvariantDeviceProfile.java@@ -177,7 +177,7 @@ public class InvariantDeviceProfile { (int) (largeSide * wallpaperTravelToScreenWidthRatio(largeSide, smallSide)), largeSide); } else {- defaultWallpaperSize = new Point(Math.max(smallSide * 2, largeSide), largeSide);+ defaultWallpaperSize = new Point(largeSide, largeSide); } }frameworks/base--- a/core/java/android/app/WallpaperManager.java+++ b/core/java/android/app/WallpaperManager.java@@ -55,6 +55,7 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.text.TextUtils; import android.util.Log;+import android.view.WindowManager; import android.view.WindowManagerGlobal; import libcore.io.IoUtils;@@ -310,7 +311,7 @@ public class WallpaperManager { mCachedWallpaper = null; mCachedWallpaperUserId = 0; try {- mCachedWallpaper = getCurrentWallpaperLocked(userId);+ mCachedWallpaper = getCurrentWallpaperLocked(context,userId); mCachedWallpaperUserId = userId; } catch (OutOfMemoryError e) { Log.w(TAG, "No memory load current wallpaper", e);@@ -342,7 +343,7 @@ public class WallpaperManager { } }- private Bitmap getCurrentWallpaperLocked(int userId) {+ private Bitmap getCurrentWallpaperLocked(Context context,int userId) { if (mService == null) { Log.w(TAG, "WallpaperService not running"); return null;@@ -354,7 +355,15 @@ public class WallpaperManager { params, userId); if (fd != null) { try {+ WindowManager mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);+ int wW = mWindowManager.getDefaultDisplay().getWidth();+ int wH = mWindowManager.getDefaultDisplay().getHeight(); BitmapFactory.Options options = new BitmapFactory.Options();+ options.inJustDecodeBounds = true;+ BitmapFactory.decodeFileDescriptor(+ fd.getFileDescriptor(), null, options);+ options.inSampleSize = calculateInSampleSize(options, wW,wH);+ options.inJustDecodeBounds = false; return BitmapFactory.decodeFileDescriptor( fd.getFileDescriptor(), null, options); } catch (OutOfMemoryError e) {@@ -369,11 +378,30 @@ public class WallpaperManager { return null; }+ private int calculateInSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight){+ int width = options.outWidth;+ int height = options.outHeight;+ int inSampleSize = 1;+ if (width > reqWidth && height > reqHeight){+ int widthRatio = Math.round((float) width / (float) reqWidth);+ int heightRatio = Math.round((float) width / (float) reqWidth);+ inSampleSize = Math.max(widthRatio, heightRatio);+ }+ return inSampleSize;+ }+ private Bitmap getDefaultWallpaper(Context context, @SetWallpaperFlags int which) {+ WindowManager mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);+ int wW = mWindowManager.getDefaultDisplay().getWidth();+ int wH = mWindowManager.getDefaultDisplay().getHeight(); InputStream is = openDefaultWallpaper(context, which); if (is != null) { try { BitmapFactory.Options options = new BitmapFactory.Options();+ options.inJustDecodeBounds = true;+ BitmapFactory.decodeStream(is, null, options);+ options.inSampleSize = calculateInSampleSize(options, wW,wH);+ options.inJustDecodeBounds = false; return BitmapFactory.decodeStream(is, null, options); } catch (OutOfMemoryError e) { Log.w(TAG, "Can't decode stream", e);diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.javaindex c88931d..fecc47e 100755--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java@@ -229,14 +229,15 @@ public class ImageWallpaper extends WallpaperService { surfaceHeight = Math.max(displayInfo.logicalHeight, mBackgroundHeight); }- if (FIXED_SIZED_SURFACE) {+ //Log.d(TAG,"----surfaceWidth = "+surfaceWidth+" surfaceHeight= "+surfaceHeight);+ /*if (FIXED_SIZED_SURFACE) { // Used a fixed size surface, because we are special. We can do // this because we know the current design of window animations doesn't // cause this to break. surfaceHolder.setFixedSize(surfaceWidth, surfaceHeight); mLastRequestedWidth = surfaceWidth; mLastRequestedHeight = surfaceHeight;- } else {+ } else*/ { surfaceHolder.setSizeFromLayout(); } return hasWallpaper;
阅读全文
0 0
- Android客制化------7.0设置壁纸存在的一些问题
- android设置壁纸 的方法
- android开发壁纸的设置
- Android设置壁纸的大小
- Android设置壁纸的几种方案
- android-设置屏幕壁纸
- Android壁纸设置
- android 设置壁纸
- Android setWallpaper()设置壁纸
- Android设置壁纸
- Android Launcher 设置壁纸
- Android设置壁纸
- android 设置壁纸
- Android设置壁纸
- Android 壁纸设置 总结
- 设置Android默认壁纸为动态壁纸
- 设置Android默认壁纸为动态壁纸
- 设置Android默认壁纸为动态壁纸
- 10
- VS 中NuGet 尝试还原程序包时出错"*"已拥有为"**"定义的依赖项
- interface 与abstract之间的区别与联系
- js函数的多种写法
- 苹果疯了,现在又开始坑支付宝!
- Android客制化------7.0设置壁纸存在的一些问题
- Liferay7.0的安装初始化与使用
- myeclipse10配置maven
- android aidl oneway用法
- 移动端上下滑动swiper,第二个页面内容大于屏幕尺寸,现在的问题是,超出部分无法通过滚动条下滑查看。
- Tornado
- UVa201
- dcloud------mui 点击底部选项卡,获取文本内容
- 五分钟让你全面理解ADO.NET连接池