3

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

  1. avoid crop
  2. 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)
HoJunLee
  • 338
  • 2
  • 5
  • 20

1 Answers1

4

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;
}
Divyang Metaliya
  • 1,908
  • 1
  • 12
  • 14
  • Thanks for answer my question big brother! but, I mean that 'I don't want to crop my bitmap', And I notice know(so late) that I was wrote 'match_parent width' means actually match_parent width or height. sorry... – HoJunLee Sep 06 '14 at 11:01
  • umm... It makes error -> (java.lang.IllegalArgumentException: y must be >= 0) – HoJunLee Sep 06 '14 at 11:18
  • at this line -> (Bitmap.createBitmap(newBitmap, bitmapGapX, bitmapGapY,bitmapNewWidth, bitmapNewHeight);) – HoJunLee Sep 06 '14 at 11:19
  • can you please add log and test that. – Divyang Metaliya Sep 06 '14 at 11:21
  • I think at 'if (screen_ratio > bitmap_ratio)', is wrong. it should be if (screen_ratio < bitmap_ratio) – HoJunLee Sep 06 '14 at 11:36
  • when (gapX=0, gqpY=520, bitmapNewWitdh=720, bitmapNewHeight=240), at Bitmap.createBitmap() has error (java.lang.IllegalArgumentException: y+height must be <= bitmap.height()) – HoJunLee Sep 06 '14 at 11:56