#android #listview #bitmap
#Android #просмотр списка #растровое изображение
Вопрос:
У меня возникли проблемы с ListView, содержащим ImageView, он отлично работает на планшетах, но не на моем телефоне…
Вот ожидаемый результат (на моем планшете):
И вот фактический результат (на моем телефоне):
Я пробовал использовать drawable, он хорошо работает на моем телефоне. Вот как я создаю растровое изображение и привязываю его к представлению :
Bitmap srcBmp = BitmapFactory.decodeResource(rcontext.getResources(), R.drawable.portrait);
Bitmap modBmp = Bitmap.createBitmap(srcBmp,0,0,60,60);
((ImageView) view).setImageBitmap(thebmp);
Мой макет строки :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="60px"
android:layout_height="60px"
android:id="@ id/charIcon"
android:src="@drawable/blason" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@ id/charName"/>
</LinearLayout>
Я действительно не понимаю, почему он это делает…
Я совсем новичок в Android, но это действительно странно
РЕДАКТИРОВАТЬ: blason находится только в моей папке для рисования, и его размер составляет 60×60 пикселей
РЕДАКТИРОВАНИЕ 2: Я использую это растровое изображение.CreateBitmap(srcBmp,0,0,60,60); поскольку мне нужна только эта часть изображения (должна быть показана вся голова). Вот часть portrait.png :
Комментарии:
1. Вы используете px . Попробуйте использовать dp . Это улучшит масштабирование.
2. Если у вас есть изображение в вашей папке для рисования и оно имеет идеальные размеры, то почему бы просто не установить с помощью
imageView.setImageResource(R.drawable.blason);
3. похоже, что dp / px здесь не проблема. На моем планшете отображается вся голова, а не на телефоне, какие бы размеры я ни использовал для просмотра изображений
4. @Shivam_Verma: ресурс blason — это просто изображение по умолчанию на случай, если позже я не смогу найти подходящий символ для отображения
Ответ №1:
Bitmap.CreateBitmap будет использовать источник растрового изображения и предоставит вам его фрагмент. Только то, что вы видите в своих результатах.
Попробуйте вместо этого использовать: createScaled bitmap.
Редактировать: Если вы ничего не сделаете, ImageView масштабирует его за вас. Таким образом, лучшим решением будет просто удаление новой строки растрового изображения:
Bitmap srcBmp = BitmapFactory.decodeResource(rcontext.getResources(), R.drawable.portrait);
//Bitmap modBmp = Bitmap.createBitmap(srcBmp,0,0,60,60);
((ImageView) view).setImageBitmap(thebmp);
И добавьте режим масштабирования в xml, как предложил @blipinsk.
android:scaleType="fitXY"
Правка 2: Попробуйте изменить LinearLayout на wrapContent, родительский файл может быть меньше 60 пикселей
Правка 3: BitmapFactory.decodeResource
будет декодироваться с учетом плотности устройства, если вы не передадите параметр options, который гласит: используйте истинный размер. Вероятно, это то, что вы хотите сделать, поскольку работаете с пикселями.
Комментарии:
1. Это именно моя цель — сократить первые пиксели размером 60×60 :/ У меня есть что-то вроде спрайтов с разными заголовками символов, и мне нужно получить только один из них, поэтому я его вырезал. scaleType не исправляет это, поскольку я ответил на blipinsk
2. @Lectem Итак, что не так с результатом? Для меня это выглядит обрезанным.
3. Разница между планшетом и моим телефоном кажется довольно очевидной, на планшете она вырезана правильно (вы видите всю головку), в то время как на телефоне вы видите только ее часть
4. Я пытался использовать android: layout_width=»wrap_content» android: layout_height =»wrap_content», но это тоже не работает
5. @Lectem, Тогда это может быть только одно. Вы не используете одно и то же изображение
Ответ №2:
Добавить
android:scaleType="fitXY"
в ваш imageview
Ответ №3:
Я наконец нашел ответ! BitmapFactory.decodeResource масштабирует png в соответствии с плотностью пикселей устройства, даже если вы не предоставляете разные версии изображения. Вы можете отключить масштабирование следующим образом
BitmapFactory.Options opt=new BitmapFactory.Options();
opt.inScaled=false;
srcBmp = BitmapFactory.decodeResource(rcontext.getResources(), R.drawable.portrait, opt);
Таким образом, я всегда получаю реальную часть исходного изображения в пикселях.