Установите обои с растровым изображением, чтобы избежать обрезки
Я пытаюсь сделать приложение для обоев. И у меня были большие проблемы во время установки обоев с растровым изображением. Я пытаюсь найти ответ на неделю.
Я хочу установить растровое изображение на обои, как
- избегать урожая
- scaleType:fit_center(выравнивание по центру по вертикали, соотношение сторон)
Как я могу это сделать?
PS И я обнаружил, что, может быть, я могу использовать Bitmap.createBitmap, но моя попытка была неудачной снова и снова. Я понятия не имею, что я должен использовать только WallPaperManager или оба Bitmap.createBitmp тоже.
статическое растровое изображение createBitmap(источник растрового изображения, int x, int y, int width, int height, Matrix m, логический фильтр)
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 ответ
Если вы хотите обрезать растровое изображение от центра и с тем же разрешением экрана, используйте метод ниже. Здесь Return bitmap соответствует вашему разрешению экрана и кадрированию.
Например Ваш растровый размер 480х820
Ваше устройство размером 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;
}