Размеры растрового изображения ImageView - PullRequest
2 голосов
/ 17 февраля 2011

У меня есть Bitmap, который больше, чем ImageView, в который я его помещаю. У меня ScaleType установлен center_inside. Как получить размеры уменьшенного изображения?

Ответы [ 3 ]

10 голосов
/ 18 февраля 2011

Хорошо.Я, вероятно, должен был быть более ясным.Мне нужно было, чтобы высота и ширина масштабированного растрового изображения еще не отображались на экране, чтобы я мог рисовать некоторые наложения в правильном положении.Я знал положение наложений в исходном растровом изображении, но не масштабировал.Я вычислил несколько простых формул, чтобы вычислить, куда они должны перейти на растровом растровом изображении.

Я объясню, что я сделал, если кому-то еще может понадобиться однажды.ширина и высота растрового изображения.Высота и ширина ImageView жестко запрограммированы в xml-файле на 335.

int bitmap_width = bmp.getWidth();
int bitmap_height = bmp.getHeight();

Я определил, какой из них был больше, чтобы я мог правильно определить, на каком из них основывать вычисления.Для моего текущего примера ширина больше.Поскольку ширина была уменьшена до ширины ImageView, я должен найти уменьшенную высоту.Я просто умножил отношение ширины ImageView к ширине растрового изображения на высоту растрового изображения.Деление выполняется последним, потому что первое целочисленное деление привело бы к ответу 0.

int scaled_height = image_view_width * bitmap_height / bitmap_width;

С масштабированной высотой я могу определить количество пустого пространства по обе стороны от масштабированного битового массива, используя:

int blank_space_buffer = (image_view_height - scaled_height) / 2;

Чтобы определить координаты x и y места наложения на масштабированном растровом изображении, я должен использовать исходные координаты и эти рассчитанные числа.Координата x в этом примере проста.Поскольку масштабированная ширина - это ширина ImageView, мне просто нужно умножить отношение ширины ImageView к ширине растрового изображения с исходной координатой x.

int new_x_coord = image_view_width * start_x / bitmap_width;

Координата y немного сложнее.Возьмите отношение масштабированной высоты растрового изображения к исходной высоте растрового изображения.Умножьте это значение на исходную координату y.Затем добавьте буфер пустой области.

int new_y_coord = scaled_height * start_y / bitmap_height + blank_space_buffer;

Это работает для того, что мне нужно.Если высота больше ширины, просто поменяйте местами переменные width и height.

2 голосов
/ 17 февраля 2011

Вот как я это делаю:

ImageView iv = (ImageView)findViewById(R.id.imageview);
Rect bounds = iv.getDrawable().getBounds();
int scaledHeight = bounds.height();
int scaledWidth = bounds.width();

Вы можете использовать метод Drawable getIntrinsicWidth() или высоту, если хотите получить оригинальный размер.

РЕДАКТИРОВАТЬ: Хорошо, если вы пытаетесь получить доступ к этим границам во время выполнения onCreate, вам придется ждать и получать их до окончания макета. Хотя я не знаю, что это лучший способ, я смог это сделать. По сути, добавьте слушателя в ImageView и получите ваши размеры непосредственно перед его отображением на экране. Если вам нужно внести какие-либо изменения в макет из полученных вами измерений, вы должны сделать это в onPreDraw ().

ImageView iv = (ImageView)findViewById(R.id.imageview);
int scaledHeight, scaledWidth;
iv.getViewTreeObserver().addOnPreDrawListener(
    new ViewTreeObserver.OnPreDrawListener() {
    @Override
    public boolean onPreDraw() {
        Rect rect = iv.getDrawable().getBounds();
        scaledHeight = rect.height();
        scaledWidth = rect.width();
        iv.getViewTreeObserver().removeOnPreDrawListener(this);
        return true;
    }
});
0 голосов
/ 18 февраля 2011

Попробуйте этот код:

final ImageView iv = (ImageView) findViewById(R.id.myImageView); 
ViewTreeObserver vto = iv.getViewTreeObserver();  
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {  
    @Override  
    public void onGlobalLayout() {  
        Toast.makeText(MyActivity.this, iv.getWidth() + " x " + iv.getHeight(), Toast.LENGTH_LONG).show(); 
        iv.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
    }  
});  

В противном случае вы можете использовать onSizeChange(), сделав этот вид пользовательским.

...