Просмотр изображений внутри ListView и растровое изображение отображаются не полностью

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

Таким образом, я всегда получаю реальную часть исходного изображения в пикселях.