Есть ли код для установки обоев без обрезки и масштабирования в Android?

я создаю приложение галереи, мое первое приложение, и это мой код

    Bitmap bmd = BitmapFactory.decodeStream(is);

    try{
        getApplicationContext().setWallpaper(bmd);
    }catch(IOException e){
        e.printStackTrace();
    }

Приведенный выше код устанавливает обои. Но после установки обои обрезаются или масштабируются !! Есть ли какие-либо изменения, которые я могу сделать в приведенном выше коде, чтобы я мог установить обои без масштабирования или обрезки, когда он установлен !!!!

Помогите плиззз!! Заранее спасибо :-)


person Kalpana    schedule 19.12.2012    source источник
comment
Вы хотите установить размер растрового изображения равным размеру дисплея устройства или хотите добиться эффекта параллакса?   -  person forcelain    schedule 27.01.2014


Ответы (2)


Я опаздываю, чтобы ответить на это. Надеюсь, это поможет вам и тем, кто посещает ваш вопрос:

В вашем случае попробуйте подогнать изображение под размер устройства примерно так:

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels << 1; // best wallpaper width is twice screen width

// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);

// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, width, height);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
Bitmap decodedSampleBitmap = BitmapFactory.decodeFile(path, options);

WallpaperManager wm = WallpaperManager.getInstance(this);
try {
    wm.setBitmap(decodedSampleBitmap);
} catch (IOException e) {
    Log.e(TAG, "Cannot set image as wallpaper", e);
}

Если приведенный выше код не работает, сделайте небольшую модификацию:

...
WallpaperManager wm = WallpaperManager.getInstance(this);
try {
    wm.setBitmap(decodedSampleBitmap);
    wm.suggestDesiredDimensions(width, height);
} catch (IOException e) {
    Log.e(TAG, "Cannot set image as wallpaper", e);
}

И метод calculateInSampleSize:

public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) > reqHeight
                && (halfWidth / inSampleSize) > reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

и не забудьте добавить разрешения:

<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS"/>
<uses-permission android:name="android.permission.SET_WALLPAPER"/>
person Chintan Soni    schedule 05.02.2014
comment
Что такое метод calculateInSampleSize. Пожалуйста, объясните его. - person Robin Royal; 05.02.2015
comment
Не работает, обрезает по высоте. Но как установить обои по всей ширине растрового изображения? - person NickUnuchek; 24.02.2016

Самый простой способ — развернуть изображение обоев на nn квадратов и поместить содержимое в центр нового изображения. Если ваш файл w1024h600, ваши обои должны быть 10241024. Если ваш файл w600h1024, ваши обои также должны быть 1024*1024.

person Wayne    schedule 14.04.2021