在“动态壁纸”中将“位图”缩放到屏幕

时间:2013-12-27 14:54:43

标签: android live-wallpaper

我是Android编程的新手我正在尝试制作幻灯片动画动态壁纸,一切正常,但问题是当我设置壁纸时,图像的比例被拉伸到屏幕我希望它可以扩展到所有手机屏幕当刷壁纸得到正确的图像部分我想建议这个问题。 我的代码是:

public class CustomWallpaper extends WallpaperService {

@Override
public Engine onCreateEngine() {
    return new WallpaperEngine();
}

class WallpaperEngine extends Engine {
    //Duration between slides in milliseconds
    private final int SLIDE_DURATION = 8;

    private int[] mImagesArray;
    private int mImagesArrayIndex = 0;
    private Thread mDrawWallpaper;
    private String mImageScale = "Fit to screen";
    private CustomWallpaperHelper customWallpaperHelper;

    public WallpaperEngine() {
        customWallpaperHelper = new CustomWallpaperHelper(getApplicationContext(), getResources());
        mImagesArray = new int[] {R.drawable.image_1,R.drawable.image_2,R.drawable.image_3,R.drawable.image_4,R.drawable.image_5,R.drawable.image_6,R.drawable.image_7,R.drawable.image_8,R.drawable.image_9,R.drawable.image_10,R.drawable.image_11,R.drawable.image_12,R.drawable.image_13,R.drawable.image_14,R.drawable.image_15,R.drawable.image_16,R.drawable.image_17,R.drawable.image_18,R.drawable.image_19,R.drawable.image_20,R.drawable.image_21,R.drawable.image_22,R.drawable.image_23,R.drawable.image_24,R.drawable.image_25,R.drawable.image_26,R.drawable.image_27,R.drawable.image_28,R.drawable.image_29,R.drawable.image_30,R.drawable.image_31,R.drawable.image_32,R.drawable.image_33,R.drawable.image_34,R.drawable.image_35,R.drawable.image_36,R.drawable.image_37,R.drawable.image_38,R.drawable.image_39,R.drawable.image_40,R.drawable.image_41};

        mDrawWallpaper = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    while (true) {
                        drawFrame();
                        incrementCounter();
                        Thread.sleep(SLIDE_DURATION);
                    }
                } catch (Exception e) {
                    //
                }
            }
        });

        mDrawWallpaper.start();
    }

    private void incrementCounter() {
        mImagesArrayIndex++;

        if (mImagesArrayIndex >= mImagesArray.length) {
            mImagesArrayIndex = 0;
        }
    }

    private void drawFrame() {
        final SurfaceHolder holder = getSurfaceHolder();

        Canvas canvas = null;

        try {
            canvas = holder.lockCanvas();

            if (canvas != null) {
                drawImage(canvas);
            }
        } finally {
            if (canvas != null) {
                holder.unlockCanvasAndPost(canvas);
            }
        }
    }

    private void drawImage(Canvas canvas) {
        //Get the image and resize it
        Bitmap image = BitmapFactory.decodeResource(getResources(),
                mImagesArray[mImagesArrayIndex]);



        //Draw background
        customWallpaperHelper.setBackground(canvas);

        //Scale the canvas
        PointF mScale = customWallpaperHelper.getCanvasScale(mImageScale, image.getWidth(), image.getHeight());
        canvas.scale(mScale.x, mScale.y);

        //Draw the image on screen
        Point mPos = customWallpaperHelper.getImagePos(mScale, image.getWidth(), image.getHeight());
        canvas.drawBitmap(image, mPos.x, mPos.y, null);


    }
}

}

,另一个类是:

public class CustomWallpaperHelper {
    public final static String IMAGE_SCALE_STRETCH_TO_SCREEN = "Stretch to   screen";

public final static String IMAGE_SCALE_FIT_TO_SCREEN = "Fit to screen";

private Context mContext;
private Resources mResources;

private Point screenSize = new Point();

private Bitmap bgImageScaled;
private Point bgImagePos = new Point(0, 0);

public CustomWallpaperHelper(Context mContext, Resources mResources) {
    this.mContext = mContext;
    this.mResources = mResources;

    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();

    screenSize.x = display.getWidth();
    screenSize.y = display.getHeight();

    ;
}

private void scaleBackground() {
    String imageScale = "Stretch to screen";
    Bitmap bgImage = null;

    if (imageScale.equals(IMAGE_SCALE_STRETCH_TO_SCREEN)) {
        bgImagePos = new Point(0, 0);
        bgImageScaled = Bitmap.createScaledBitmap(bgImage, screenSize.x, screenSize.y, true);
    }
}

public void setBackground(Canvas canvas) {
    if (bgImageScaled != null) {
        canvas.drawBitmap(bgImageScaled, bgImagePos.x, bgImagePos.y, null);
    } else {
        canvas.drawColor(0xff000000);
    }
}

public int getScreenWidth() {
    return screenSize.x;
}

public int getScreenHeight() {
    return screenSize.y;
}

public Point getImagePos(PointF canvasScale, int imageWidth, int imageHeight) {
    Point imagePos = new Point();

    imagePos.x = (int) (screenSize.x - (imageWidth * canvasScale.x)) / 2;
    imagePos.y = (int) (screenSize.y - (imageHeight * canvasScale.y)) / 2;

    return imagePos;
}

public PointF getCanvasScale(String imageScale, int imageWidth, int imageHeight) {
    PointF canvasScale = new PointF(1f, 1f);

    if (imageScale.equals(IMAGE_SCALE_STRETCH_TO_SCREEN)) {
        canvasScale.x = getScreenWidth() / (1f * imageWidth);
        canvasScale.y = getScreenHeight() / (1f * imageHeight);
    } else {
        boolean tooWide = false;
        boolean tooTall = false;

        if (getScreenWidth() < imageWidth) {
            tooWide = true;
        }

        if (getScreenHeight() < imageHeight) {
            tooTall = true;
        }

        if (tooWide && tooTall) {
            int x = imageWidth / getScreenWidth();
            int y = imageHeight / getScreenHeight();

            if (x > y) {
                canvasScale.x = getScreenWidth() / (1f * imageWidth);
                canvasScale.y = 1;
            } else {
                canvasScale.x = 1;
                canvasScale.y = getScreenHeight() / (1f * imageHeight);
            }
        } else if (tooWide) {
            canvasScale.x = getScreenWidth() / (1f * imageWidth);
            canvasScale.y = 1;
        } else if (tooTall) {
            canvasScale.x = 1;
            canvasScale.y = getScreenHeight() / (1f * imageHeight);
        }
    }

    return canvasScale;
}
}

我想要解决这个问题。 感谢。

2 个答案:

答案 0 :(得分:1)

无需做任何事情只需将我的代码替换为以下方法。

private void drawImage(Canvas canvas)
     {

            Bitmap image = BitmapFactory.decodeResource(getResources(),
                    mImagesArray[mImagesArrayIndex]);
            Bitmap b=Bitmap.createScaledBitmap(image, canvas.getWidth(), canvas.getHeight(), true);
            canvas.drawBitmap(b, 0,0, null);
        }

答案 1 :(得分:0)

我建议您裁剪图像而不是调整图像大小。类似的东西:

Rect r = new Rect(left, top, right, bottom);
Bitmap croppedImage = null;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD_MR1){
    InputStream in = mContentResolver.openInputStream(mSaveUri);
    BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(in, false);
    croppedImage = decoder.decodeRegion(r, null);
} else {
    final int width = r.width();
    final int height = r.height();
    croppedImage = Bitmap.createBitmap(mBitmap, r.left, r.top, width, height);
croppedImage.setDensity(croppedImage.getDensity() * mOutputX / width);
}
return croppedImage;

希望这会有所帮助......