Android WallpaperManager crop изображения
Я работаю над простым окном некоторых изображений, которые у меня есть. Это файлы .png в папках с рисунком.
Вот несколько фрагментов кода:
WallpaperManager myWallpaperManager = WallpaperManager.getInstance(getApplicationContext());
....
myWallpaperManager.setResource(R.drawable.image1);
Независимо от того, какой размер или разрешение я использую, когда установлены обои, он обретает исходное изображение. Когда я использую то же изображение, что и фон, он имеет правильный размер и показывает все изображение. Я думал, что это может быть проблема с моим эмулятором, поэтому я попытался запустить его на самом устройстве (HTC eris), и у меня такая же проблема. Я сделал изображение размером и разрешением экрана для eris, и оно все еще обрезает его. Затем я сделал изображение только на дюйм высотой и разрешением 100 dpi. Он был очень пикселирован на эриде, но все же обрезал изображение.
Любая помощь будет принята с благодарностью.
Я попытался добавить некоторые изображения, чтобы показать до и после, но как новый пользователь мне не удалось это сделать.
Ответы
Ответ 1
Проверьте значения, возвращаемые http://developer.android.com/reference/android/app/WallpaperManager.html#getDesiredMinimumWidth() и http://developer.android.com/reference/android/app/WallpaperManager.html#getDesiredMinimumHeight() и попытайтесь использовать эти значения в качестве размеров обоев.
Ответ 2
У меня была та же проблема. Я сделал изображение, которое представляет собой размер экрана и добавление прокладки к изображению так, чтобы оно было размером с WallpaperManager getDesiredMinimumWidth() и getDesiredMinimumHeight().
Казалось бы лучше, чтобы какой-то код автоматически добавлял дополнение, так что я использовал ниже. Убедитесь, что изображение имеет тот же размер, что и экран.
private void setWallpaper() {
try {
WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
//import non-scaled bitmap wallpaper
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
Bitmap wallpaper = BitmapFactory.decodeResource(getResources(), R.drawable.wallpaper, options);
if (wallpaperManager.getDesiredMinimumWidth() > wallpaper.getWidth() &&
wallpaperManager.getDesiredMinimumHeight() > wallpaper.getHeight()) {
//add padding to wallpaper so background image scales correctly
int xPadding = Math.max(0, wallpaperManager.getDesiredMinimumWidth() - wallpaper.getWidth()) / 2;
int yPadding = Math.max(0, wallpaperManager.getDesiredMinimumHeight() - wallpaper.getHeight()) / 2;
Bitmap paddedWallpaper = Bitmap.createBitmap(wallpaperManager.getDesiredMinimumWidth(), wallpaperManager.getDesiredMinimumHeight(), Bitmap.Config.ARGB_8888);
int[] pixels = new int[wallpaper.getWidth() * wallpaper.getHeight()];
wallpaper.getPixels(pixels, 0, wallpaper.getWidth(), 0, 0, wallpaper.getWidth(), wallpaper.getHeight());
paddedWallpaper.setPixels(pixels, 0, wallpaper.getWidth(), xPadding, yPadding, wallpaper.getWidth(), wallpaper.getHeight());
wallpaperManager.setBitmap(paddedWallpaper);
} else {
wallpaperManager.setBitmap(wallpaper);
}
} catch (IOException e) {
Log.e(TAG,"failed to set wallpaper");
}
}
Ответ 3
Может быть, я могу помочь.
// 1. Get screen size.
DisplayMetrics metrics = new DisplayMetrics();
Display display = getWindowManager().getDefaultDisplay();
display.getMetrics(metrics);
final int screenWidth = metrics.widthPixels;
final int screenHeight = metrics.heightPixels;
// 2. Make the wallpaperManager fit the screen size.
final WallpaperManager wallpaperManager = WallpaperManager.getInstance(ViewWallpaperActivity.this);
wallpaperManager.suggestDesiredDimensions(screenWidth, screenHeight);
// 3. Get the desired size.
final int width = wallpaperManager.getDesiredMinimumWidth();
final int height = wallpaperManager.getDesiredMinimumHeight();
// 4. Scale the wallpaper.
Bitmap bitmap = getBitmap(); // getBitmap(): Get the image to be set as wallpaper.
Bitmap wallpaper = Bitmap.createScaledBitmap(bitmap, width, height, true);
// 5. Set the image as wallpaper.
try {
wallpaperManager.setBitmap(wallpaper);
} catch (IOException e) {
e.printStackTrace();
}
Обратите внимание, что вы должны вызвать suggestDesiredDimensions
, затем вызвать getDesiredMinimumWidth
и getDesiredMinimumHeight
чтобы получить размер, который будет масштабироваться.