使用位图设置壁纸避免裁剪并设置适合中心

时间:2014-09-06 10:12:21

标签: java android bitmap android-wallpaper

我正在尝试制作壁纸应用程序。 在使用位图设置壁纸时遇到了大麻烦。我试着找出一个星期的答案。

我想将Bitmap设置为类似

的壁纸
  1. 避免裁剪
  2. scaleType:fit_center(对齐中心垂直,宽高比)
  3. 我该怎么做?

    P.S。我发现也许我可以使用Bitmap.createBitmap,但我的尝试却一遍又一遍地失败了。 我不知道我应该只使用WallPaperManager或者同时使用Bitmap.createBitmp。

      

    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 个答案:

答案 0 :(得分:2)

如果您想从中心和相同的屏幕分辨率进行位图裁剪,请使用以下方法。 返回位图与屏幕分辨率和裁剪相同。

对于Ex。您的位图大小为480x820

您的设备尺寸为480x800,其返回值为480x800(前10个像素,后10个像素在刻度后移除)。

您的设备尺寸为800x1280,其返回值为800x1280(缩放后顶部43像素和底部43像素)。

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;
}