2013-12-05 2 views
-3

Я создаю пользовательский компонент, который расширяет ImageView на Android. Функция компонентов довольно сложна - всегда заполнять высоту своего контейнера путем масштабирования, но обрезать пустое пространство по ширине. Он также автоматически применит преобразование поворота на 90 градусов, если ширина больше высоты, прежде чем применять любое масштабирование.Где вы должны применять преобразования при расширении Android ImageView?

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

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

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    if (!mConversionComplete) { 
     applyTransformations(widthMeasureSpec, heightMeasureSpec); 
    } 
    Drawable imageDrawable = getDrawable(); 
    if (imageDrawable != null) { 
     int height = MeasureSpec.getSize(MeasureSpec.AT_MOST); 
     int width = (int) Math.ceil((float) height * (float)  imageDrawable.getIntrinsicWidth()/(float) imageDrawable.getIntrinsicHeight()); 
     setMeasuredDimension(width, height); 
    } else { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 
} 

В настоящее время я делаю преобразование из onMeasure как мне нужно, чтобы быть (см. ниже). Я записываю ли я обращался преобразования, так что я их только один раз, но я думаю, что, вероятно, «право» место, чтобы сделать это, не является onMeasure

int targetHeight = MeasureSpec.getSize(heightMeasureSpec); 
int targetWidth = MeasureSpec.getSize(widthMeasureSpec); 
+1

Вы читали пользовательский вид [учебник] (http://developer.android.com/training/custom-views/index.html)? –

+0

Эй, да и попытался применить преобразования в onDraw, но не повезло. Учебник - это то, что заставило меня подумать, что «Мое мнение» может быть правильным, но реализация показалась мне взломанной, поэтому я подумал, что проконсультируюсь с некоторыми людьми здесь. –

ответ

2

На основании вашего описания вашей настройки вы РЕКОМЕНДУЕМЫМ ограничьте область видимости для определения размеров ImageView и используйте setImageMatrix. Пусть система андроида сделает трудным для вас.

+0

Спасибо, это была моя первая попытка, но потому, что я пытаюсь выполнить предварительную проверку, а затем postScale (с высотой и шириной теперь эффективно обращается вспять), он умирает, потому что пытается создать растровое изображение. –

+0

Что вы подразумеваете под «dies», после журнала logcat, если применимо. –

+0

Ширина: 1k и высота 500; Я повернулся, и теперь они противоположны; растровое изображение создается с высотой 100 и применяемой матрицей ... Лог-кошка дает ошибку, например, «y + height должно быть> = bounds». Я отправлю точное сообщение и матрицу, когда я буду на моей машине завтра –

Смежные вопросы