Как программно центрировать изображение, сохраняя соотношение сторон, как это делает centerCrop в XML?

Как центрировать изображение, как тот же метод «centerCrop», который используется в xml android? Я не хочу обрезать центр изображения. Я пробовал приведенный ниже код, но он обрезал центральную часть изображения и создавал изображение квадратной формы, я хочу, чтобы та же функция centerCrop использовалась в Canvas на андроиде. Может кто поможет?? Надеюсь, мой вопрос вам ясен.

 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);

person Jack    schedule 02.10.2015    source источник
comment
stackoverflow.com/questions/6908604/   -  person Kaushik    schedule 02.10.2015
comment
вы найдете свои ответы по следующей ссылке stackoverflow.com/ вопросы/6908604/   -  person Hira Aftab    schedule 02.10.2015
comment
Привет, я пробовал тот же код, этот код работает, но изображение имеет квадратную форму. Он обрезает только центральную часть изображения.   -  person Jack    schedule 02.10.2015


Ответы (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));

[...]
person Mou    schedule 02.10.2015