【问题标题】:Scale the Bitmap to screen in Live wallpaper在动态壁纸中将位图缩放到屏幕
【发布时间】:2014-10-29 16:12:15
【问题描述】:

我是 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;
}
}

我想要针对这个问题的建议。 谢谢。

【问题讨论】:

    标签: android live-wallpaper


    【解决方案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);
            }
    

    【讨论】:

      【解决方案2】:

      我建议您裁剪图像而不是调整它们的大小。比如:

      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;
      

      希望这会有所帮助...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多