Android Bitmap图片缩放优化,用canvas替代Matrix进行缩放,解决一些错我

前面用Matrix来缩放Bitmap,发现有些情况下会抛出错误,导致图片空白。

    /**
     * 缩放
     *
     * @param bm
     * @param newWidth
     * @param newHeight
     * @return
     */
//    public synchronized static Bitmap scaleImage(boolean isApplyRadio,Bitmap bm, int newWidth, int newHeight) {
//
//        //应用图标缩放
//        if(isApplyRadio&&iconScaleRadio!=1f){
//            newWidth= (int) (newWidth*iconScaleRadio);
//            newHeight= (int) (newHeight*iconScaleRadio);
//        }
//
//        if (bm == null) {
//            return null;
//        }
//        int width = bm.getWidth();
//        int height = bm.getHeight();
//        float scaleWidth = ((float) newWidth) / width;
//        float scaleHeight = ((float) newHeight) / height;
//        Matrix matrix = new Matrix();
//        matrix.postScale(scaleWidth, scaleHeight);
//        Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
//        if (bm != null & !bm.isRecycled()) {
//            bm.recycle();
//            bm = null;
//        }
//        return newbm;
//    }



下面采用Cavans来缩放图片,就不会有问题了。

 private  static PaintFlagsDrawFilter pfd = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
    public synchronized static Bitmap scaleImageCavans(boolean isApplyRadio,Bitmap bm, int newWidth, int newHeight) {
        //应用图标缩放
        if(isApplyRadio&&iconScaleRadio!=1f){
            newWidth= (int) (newWidth*iconScaleRadio);
            newHeight= (int) (newHeight*iconScaleRadio);
        }
        if (bm == null) {
            return null;
        }
        int width = bm.getWidth();
        int height = bm.getHeight();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        Bitmap newbm = Bitmap.createBitmap(newWidth, newWidth,
                Bitmap.Config.ARGB_8888);
        mCanvas.setBitmap(newbm);
        mPaint.setXfermode(null);
        mPaint.setAntiAlias(true);
        mCanvas.save();
        mCanvas.scale(scaleWidth, scaleHeight);
        //保证图标不失真
        mCanvas.setDrawFilter(pfd);
        mCanvas.drawBitmap(bm,0,0,null);
        mCanvas.restore();
        if (bm != null & !bm.isRecycled()) {
            bm.recycle();
            bm = null;
        }
        return newbm;
    }



你可能感兴趣的:(Launcher,android)