7

画面サイズに一致する画像を使用してホーム画面に壁紙を適用するアプリがありますが、galaxy s3 では、使用されている画像が画面のサイズと正確に一致していても、適用すると壁紙が拡大されます! これは静止画像であり、ホーム画面でページを切り替えてもスクロールしません。奇妙なことに、組み込みのギャラリーを使用して画像を適用すると、ズームなしで壁紙が正常に適用されます (「画像のトリミング」画面が表示されますが、トリミング領域自体が画像の端と一致します)。

私が使用するコードは、一連の電話 (galaxy note、ace 2、s2 など) では正常に動作しますが、s3 では動作しません。壁紙を強制的に画面いっぱいに表示するために何かできることはないかと考えていました。壁紙を適用するために使用する現在のコードは次のとおりです。

WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);   
wallpaperManager.setWallpaperOffsets(wallpaperViewer.getApplicationWindowToken(), 0, 0);
wallpaperManager.setBitmap(BitmapFactory.decodeFile(file.getPath()));//file is jpg on sd card
4

4 に答える 4

9

編集: Y オフセット修正を追加しました - @Jason Goff に感謝します!

わかりましたので、s3 のホーム画面の最小幅は 720 ではなく、実際には 1280 であることがわかりました! を呼び出すことで、壁紙の希望の最小幅と高さを見つけることができます。

wallpaperManager.getDesiredMinimumWidth();//returned 1280 on s3
wallpaperManager.getDesiredMinimumHeight();//also returned 1280 on s3

したがって、壁紙を画面の中央に適用するには、1280x1280 の空白のビットマップをその場で作成し、壁紙を空白のビットマップの中央にオーバーレイする必要がありました。ビットマップを作成し、壁紙画像をオーバーレイする方法:

public class BitmapHelper {

public static Bitmap overlayIntoCentre(Bitmap bmp1, Bitmap bmp2) {
    Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());
    Canvas canvas = new Canvas(bmOverlay);
    canvas.drawBitmap(bmp1, new Matrix(), null);//draw background bitmap

    //overlay the second in the centre of the first 
    //(may experience issues if the first bitmap is smaller than the second, but then why would you want to overlay a bigger one over a smaller one?!)
     //EDIT: added Y offest fix - thanks @Jason Goff!
     canvas.drawBitmap(bmp2, (bmp1.getWidth()/2)-(bmp2.getWidth()/2), (bmp1.getHeight()/2)-(bmp2.getHeight/2), null);

    return bmOverlay;
}

public static Bitmap createNewBitmap(int width, int height)
{
            //create a blanks bitmap of the desired width/height
    return Bitmap.createBitmap(width, height, Config.ARGB_8888);
}
}

BitmapHelper を使用した残りのコードは次のとおりです。

private void applyWallpaperFromFile(final File file)
{
    Bitmap wallpaperImage = BitmapFactory.decodeFile(file.getPath());
    try {
        if((wallpaperManager.getDesiredMinimumWidth()>0)&&(wallpaperManager.getDesiredMinimumHeight()>0))
        {
            Bitmap blank = BitmapHelper.createNewBitmap(wallpaperManager.getDesiredMinimumWidth(), wallpaperManager.getDesiredMinimumHeight());
            Bitmap overlay = BitmapHelper.overlayIntoCentre(blank, wallpaperImage);

            wallpaperManager.setBitmap(overlay);

        }
        else
        {
            wallpaperManager.setBitmap(wallpaperImage);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    this.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            Toast.makeText(WallpaperActivity.this,"Wallpaper set to:"+file.getName(), Toast.LENGTH_SHORT).show();

        }
    });

}
于 2012-06-20T15:00:31.740 に答える
3

記事をありがとう。壁紙がデバイス画面の上部に詰め込まれていることがわかったので、overlayIntoCentre メソッドをわずかに変更し、drawBitmap以下の高さの計算を 2 番目の呼び出しで 0 に置き換えました。

public static Bitmap overlayIntoCentre(Bitmap bmp1, Bitmap bmp2) {
    Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());
    Canvas canvas = new Canvas(bmOverlay);
    canvas.drawBitmap(bmp1, new Matrix(), null);//draw background bitmap

    //overlay the second in the centre of the first 
    //(may experience issues if the first bitmap is smaller than the second, but then why would you want to overlay a bigger one over a smaller one?!)
    canvas.drawBitmap(bmp2, (bmp1.getWidth()/2)-(bmp2.getWidth()/2), (bmp1.getHeight()/2)-(bmp2.getHeight/2), null);

return bmOverlay;

}

于 2014-07-24T06:15:36.387 に答える
2

これをもう一度見たいかもしれません: http://developer.android.com/reference/android/app/WallpaperManager.html#suggestDesiredDimensions(int, int)

開発者リファレンスから:

public void suggestDesiredDimensions (int 最小幅、int 最小高さ)

導入されたバージョン: API レベル 5 現在のホーム アプリケーションでのみ使用され、使用する壁紙のサイズを指定します。これにより、そのようなアプリケーションは、ワークスペースのサイズに合わせて、物理画面よりも大きい仮想壁紙を持つことができます。

これを読んでいないように見える開発者に注意してください。これは、ホーム画面が希望する壁紙のサイズを伝えるためのものです。誰もこれを呼ぶべきではありません!確かに、壁紙を変更する他のホーム画面以外のアプリではありません。これらのアプリは、提案されたサイズを取得して、それに一致する壁紙を作成できるようになっています。

于 2012-07-23T16:22:50.683 に答える
-1

あなたはsuggestDesiredDimensions()メソッドを使ってみることができます

于 2012-07-06T23:43:31.830 に答える