如何以编程方式通过像XML中的centerCrop那样保持纵横比?

时间:2015-10-02 10:28:55

标签: android android-canvas android-bitmap

如何像xcl android中的“centerCrop”一样在centerCrop图像?我不想裁剪图像的中心。我已经尝试了下面的代码,但它正在裁剪图像的中心部分,它产生一个方形图像,我想在画布中使用相同的centerCrop函数在android.Can任何人帮助?希望我的问题很清楚。

 Bitmap bitmap=BitmapFactory.decodeResource(res, (R.drawable.ice));
        Bitmap cropBmp;
        if (bitmap.getWidth() >= bitmap.getHeight()){

            cropBmp = Bitmap.createBitmap(
                    bitmap,
                    bitmap.getWidth()/2 - bitmap.getHeight()/2,
                    0,
                    bitmap.getHeight(),
                    bitmap.getHeight()
            );

        }else{

            cropBmp = Bitmap.createBitmap(
                    bitmap,
                    0,
                    bitmap.getHeight()/2 - bitmap.getWidth()/2,
                    bitmap.getWidth(),
                    bitmap.getWidth()
            );
        }

        dstRectForRender.set(50,20 ,500 ,360 );
        canvas2.drawBitmap(cropBmp, null, dstRectForRender, paint);

1 个答案:

答案 0 :(得分:1)

如果你想做同样的效果(完全相同的效果),你可以在这里观看Android的做法:https://github.com/android/platform_frameworks_base/blob/3f453164ec884d26a556477027b430cb22a9b7e3/core/java/android/widget/ImageView.java

有关CENTER_CROP的有趣代码部分:

[...]
mDrawMatrix = mMatrix;

float scale;
float dx = 0, dy = 0;

if (dwidth * vheight > vwidth * dheight) {
    scale = (float) vheight / (float) dheight; 
    dx = (vwidth - dwidth * scale) * 0.5f;
} else {
    scale = (float) vwidth / (float) dwidth;
    dy = (vheight - dheight * scale) * 0.5f;
}

mDrawMatrix.setScale(scale, scale);
mDrawMatrix.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f));

[...]