问题
I'm trying to make a Wallpaper Application. And I had big trouble during set wallpaper with bitmap. I try to figure out answer for a week.
I want to set Bitmap in to wallpaper like
- avoid crop
- scaleType:fit_center(align center vertical, aspect ratio)
How can I make it?
P.S. And I found that maybe I can use Bitmap.createBitmap, but my try was failed over and over. I have no idea that I should use only WallPaperManager or both Bitmap.createBitmp Too.
static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
public void setScreenBitmap(final Bitmap bitmapInputed)
{
final WallpaperManager wpm = WallpaperManager.getInstance(myContext);
final Display display = ((Activity) this.myContext).getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
try
{
wpm.setBitmap(Bitmap.createScaledBitmap(bitmapInputed, width, height, true));
}
catch (IOException e)
{
Log.e(TAG+".setScreenBitmap", e.toString());
e.printStackTrace();
}
wpm.setWallpaperOffsetSteps(1.0f, 1.0f);
wpm.suggestDesiredDimensions(width, height);
}
09-06 20:38:15.563: W/System.err(4892): java.lang.IllegalArgumentException: x must be >= 0
09-06 20:38:15.563: W/System.err(4892): at android.graphics.Bitmap.checkXYSign(Bitmap.java:285)
09-06 20:38:15.563: W/System.err(4892): at android.graphics.Bitmap.createBitmap(Bitmap.java:580)
09-06 20:38:15.568: W/System.err(4892): at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
09-06 20:38:15.568: W/System.err(4892): at com.myarena.util.MyWallpaperUtil.getBitmapFromCenterAndScreenSize(MyWallpaperUtil.java:459)
09-06 20:38:15.568: W/System.err(4892): at com.myarena.util.MyWallpaperUtil.setScreenBitmap(MyWallpaperUtil.java:485)
09-06 20:38:15.568: W/System.err(4892): at com.myarena.util.MyWallpaperUtil.changeWallpaper(MyWallpaperUtil.java:231)
09-06 20:38:15.568: W/System.err(4892): at com.myarena.controller.ControllerActivity$PlaceholderFragment$2.onClick(ControllerActivity.java:213)
09-06 20:38:15.568: W/System.err(4892): at android.view.View.performClick(View.java:4489)
09-06 20:38:15.568: W/System.err(4892): at android.view.View$PerformClick.run(View.java:18803)
09-06 20:38:15.568: W/System.err(4892): at android.os.Handler.handleCallback(Handler.java:730)
09-06 20:38:15.568: W/System.err(4892): at android.os.Handler.dispatchMessage(Handler.java:92)
09-06 20:38:15.568: W/System.err(4892): at android.os.Looper.loop(Looper.java:137)
09-06 20:38:15.568: W/System.err(4892): at android.app.ActivityThread.main(ActivityThread.java:5493)
09-06 20:38:15.568: W/System.err(4892): at java.lang.reflect.Method.invokeNative(Native Method)
09-06 20:38:15.568: W/System.err(4892): at java.lang.reflect.Method.invoke(Method.java:525)
09-06 20:38:15.568: W/System.err(4892): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
09-06 20:38:15.568: W/System.err(4892): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
09-06 20:38:15.568: W/System.err(4892): at dalvik.system.NativeStart.main(Native Method)
回答1:
If you want bitmap crop from centre and same screen resolution then use below method. Here Return bitmap is same your screen resolution and crop.
For Ex. Your Bitmap size 480x820
Your device size 480x800 its Return 480x800 (top 10 pixel and bottom 10 pixel remove after scale).
Your device size 800x1280 its Return 800x1280 (top 43 pixel and bottom 43 pixel remove after scale).
private Bitmap cropBitmapFromCenterAndScreenSize(Bitmap bitmap) {
float screenWidth, screenHeight;
float bitmap_width = bitmap.getWidth(), bitmap_height = bitmap
.getHeight();
Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay();
screenWidth = display.getWidth();
screenHeight = display.getHeight();
Log.i("TAG", "bitmap_width " + bitmap_width);
Log.i("TAG", "bitmap_height " + bitmap_height);
float bitmap_ratio = (float) (bitmap_width / bitmap_height);
float screen_ratio = (float) (screenWidth / screenHeight);
int bitmapNewWidth, bitmapNewHeight;
Log.i("TAG", "bitmap_ratio " + bitmap_ratio);
Log.i("TAG", "screen_ratio " + screen_ratio);
if (screen_ratio > bitmap_ratio) {
bitmapNewWidth = (int) screenWidth;
bitmapNewHeight = (int) (bitmapNewWidth / bitmap_ratio);
} else {
bitmapNewHeight = (int) screenHeight;
bitmapNewWidth = (int) (bitmapNewHeight * bitmap_ratio);
}
bitmap = Bitmap.createScaledBitmap(bitmap, bitmapNewWidth,
bitmapNewHeight, true);
Log.i("TAG", "screenWidth " + screenWidth);
Log.i("TAG", "screenHeight " + screenHeight);
Log.i("TAG", "bitmapNewWidth " + bitmapNewWidth);
Log.i("TAG", "bitmapNewHeight " + bitmapNewHeight);
int bitmapGapX, bitmapGapY;
bitmapGapX = (int) ((bitmapNewWidth - screenWidth) / 2.0f);
bitmapGapY = (int) ((bitmapNewHeight - screenHeight) / 2.0f);
Log.i("TAG", "bitmapGapX " + bitmapGapX);
Log.i("TAG", "bitmapGapY " + bitmapGapY);
bitmap = Bitmap.createBitmap(bitmap, bitmapGapX, bitmapGapY,
screenWidth,screenHeight);
return bitmap;
}
来源:https://stackoverflow.com/questions/25699168/set-wallpaper-with-bitmap-avoid-crop-and-set-fit-center