2013-05-09 4 views
1

У меня есть изображение на линейной линии.Как масштабировать изображение/растровое изображение и пиксели против провалов

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

public static void sharedUtilScaleImage(ImageView view) 
    { 
     Drawable drawing = view.getDrawable(); 
     //-- 
     Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap(); 
     int bitmapWidth = bitmap.getWidth(); 
     int bitmapHeight = bitmap.getHeight(); 
     int widthParent = view.getWidth();  
     int heightParent = view.getHeight();  
     //-- 
     float density = 1; 
     if (true) { 
     density = MicApp.getContext().getResources().getDisplayMetrics().density; 
     } 
     //-- 
     float xScale = ((float) widthParent * density)/bitmapWidth; 
     float yScale = ((float) heightParent * density)/bitmapHeight; 
     float minScale = Math.min(xScale, yScale); 
     //-- 
     Matrix matrix = new Matrix(); 
     matrix.postScale(minScale, minScale); 
     //-- 
     Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight, matrix, true); 
     BitmapDrawable result = new BitmapDrawable(scaledBitmap); 
     view.setImageDrawable(result);  
    } 

Для справки, я нашел некоторые из выше кода здесь: htttp: //stackoverflow.com/questions/8114085/how-to-create-white-border-around-bitmap

Однако, Я нахожу это немного озадачивающим.

  • хранить все свои растровые изображения в растяжимой-ИПЧР
  • Растровое .getHeight/.getWidth возвращает фактические пиксели (а не плотность пикселей) измененные
  • Однако вид .getHeight/.getWidth возвращает пиксели, меньше, чем их фактическое использование пикселей на телефоне. Мне нужно умножить их на плотность, чтобы получить фактические пиксели.

Почему разница в значениях возвращена?

Мне нравится, что мои растровые изображения возвращают фактический размер пикселей. Но я читал в другом месте, что требовало бы, чтобы их помещали в «res/drawable-nodpi», так что это похоже на дополнительную несогласованность?

Для справки код, который помещает растровое изображение в ImageView и ImageView внутри линейной компоновки выглядит следующим образом:

imageView.setImageResource(picIDs[position]);      
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);   
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);   
imageView.setLayoutParams(lp);     
//-- 
linearLayoutInner.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL); 
linearLayoutInner.addView(imageView);  
+0

Есть ли причина, по которой вы не просто используете 'CENTER_INSIDE' на' ImageView'? http://developer.android.com/reference/android/widget/ImageView.ScaleType.html – CommonsWare

+0

Это не масштабировало изображение внутри, а только центрировало его. Я также добавил этот код, так что вы можете его увидеть :) – Tom

+0

Но даже если CENER_INSIDE решит мою проблему (что в моих тестах это не так), мне все еще интересно узнать о моих вопросах, так как я хочу понять Android столько же, сколько возможно :) – Tom

ответ

2

Похоже, вы хотите установить ImageView для автоматической настройки границ: http://developer.android.com/reference/android/widget/ImageView.html#setAdjustViewBounds(boolean) и тип шкалы для FIT_CENTER

Bitmap имеет getScaledWidth & getScaledHeight, который даст вам уточненные размеры (пропуск в метриках отображения из ваших ресурсов) A View в GetWidth & GetHeight должен дать значение пикселей размера, но если родитель имеет любое дополнение, MATCH_PARENT/FILL_PARENT будет соответствовать размеру родителя минус заполнение (или марж в).

+0

Спасибо за ссылка на ** setAdjustViewBounds **. Казалось бы, это могло бы сработать. (Для справки, однако, представление не дает ничего близкого к правильному размеру пикселя. Мне нужно умножить их с плотностью, чтобы получить правильный размер.) – Tom

+0

Вы используете приложение на планшете с режимом совместимости с экраном? – FunkTheMonk

+0

Я запускаю его на Samsung Galaxy II (думаю, 4,3 дюйма) – Tom

1

Есть несколько способов, вы можете сделать это:

  1. Использование Rendering Script- это даст вам довольно быстрый выход, если изображения огромные
  2. Использование кода Java - вы можете сделать это прямо через потоки в масштабе 2
  3. Чтобы получить его пикселей идеально подходит вместо точек на дюйм - использовать DisplayMetric и получить взаимосвязанность преобразование между пикселями и точек на дюйм, а затем применить его к опорному Bitmap для масштабирования
+0

Код, который у меня есть сейчас. Я смущен, почему он работает. Мой вопрос: почему битмап .getHeight/.getWidth возвращает фактический размер пикселя (и не изменяет плотность пикселей), но view .getHeight/.getWidth возвращает пиксели, * * намного меньше, чем их фактическое использование пикселей на телефоне , (т. е. мне нужно умножить их на плотность, чтобы получить фактические пиксели.) – Tom

+1

Таким образом, существуют также сопутствующие методы getScaledWidth и getScaledHeight http://developer.android.com/reference/android/graphics/Bitmap.html –

1

Для ваших растровых изображений, которые вы хотите в оригинальном размере, просто создайте папку «drawable» и поместите их туда.

Ваш код для масштабирования изображения кажется правильным, у меня есть одно предупреждение о том, что ваш вид по-прежнему будет того же размера, что и до масштабирования. Из-за этого вы можете иметь некоторые визуальные побочные эффекты, такие как пустое пространство вокруг изображения, или Android по-прежнему будет масштабировать изображение, если вы определили некоторый тип шкалы. Вы можете избежать этого, если вы установите размер вашего вида на основе масштабированного растрового изображения.

bitmap = Bitmap.createScaledBitmap(bitmap, (int)(bitmap.getWidth() * scaleFactor), (int)(bitmap.getHeight() * scaleFactor), true); 
image.setImageBitmap(bitmap); 
LayoutParams params = (LayoutParams) image.getLayoutParams();    
params.width = bitmap.getWidth(); 
params.height = bitmap.getHeight(); 
image.setLayoutParams(params); 

Надеюсь, что это поможет и вам понравится.

+0

Спасибо за подсказку. Я вижу, как это может быть полезно. К сожалению, последний вызов setLayoutParams, похоже, игнорируется. (Не меняет ширину/высоту изображения, содержащего растровое изображение.) На данный момент я установил прозрачный цвет вместо этого, но было бы неплохо иметь изменение размера изображения, так как тогда я мог бы начать добавлять границу/фон или аналогичную – Tom

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