Получение черного ImageView с помощью Picasso и Glide

Проблема

Я пишу приложение для Android, в котором должна быть функция «Слайд-шоу». Я нашел эту замечательную библиотеку, основанную на Picasso, которая делает именно то, что я хотел, и она работает. просто отлично в большинстве случаев.

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

введите здесь описание изображения

Я загружаю изображение из локального ресурса из моих рисунков. Иногда это происходит в портретном режиме, иногда в ландшафтном. Неважно, какое изображение я использую, иногда возникает эта «чернота».

ИЗМЕНИТЬ:

  • Я использую Android 5.0.2 и 4.4.2. На 4.4.2 этого не происходит. Только в версии 5.0.2.

  • Произошло это на Moto X 2014 года с андроидом 5.1.

  • Изображения, которые я пытаюсь загрузить, имеют размер 45 КБ на диске с разрешением 900x445.

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

Один слайд

И так держать в прокрутке.

введите здесь описание изображения

И иногда он становится белым вместо черного (или белым, а затем черным).

введите здесь описание изображения

Что-то еще, что я пробовал: Мои рисунки были расположены в папке res/drawable, когда я изменил файлы из этой папки на res/drawable-xxxhdpi, ползунок работал на устройстве 5.0.2. что???

Что я уже пробовал

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

Как только я попытался использовать URL-адреса из Интернета вместо реальных рисунков в локальном хранилище, это сработало. С точно такими же изображениями.

Вот как я загружаю изображения:

Фрагмент.java

private SliderLayout slider;
private PagerIndicator indicator;

// ...

private void setupSlider() {

    HashMap<String,Integer> file_maps = new HashMap<>();

    file_maps.put("Blah",R.drawable.banner_1);
    file_maps.put("Bleh",R.drawable.banner_2);
    file_maps.put("Blih",R.drawable.banner_3);
    file_maps.put("Bloh",R.drawable.banner_4);

    for (String name : file_maps.keySet()) {

        DefaultSliderView dsv = new DefaultSliderView(getActivity());

        dsv.description(name)
                .image(file_maps.get(name))
                .error(R.drawable.banner_error)
                .empty(R.drawable.empty)
                .setScaleType(BaseSliderView.ScaleType.Fit)
                .setOnSliderClickListener(this);

        //add your extra information
        dsv.bundle(new Bundle());
        dsv.getBundle()
                .putString("extra",name);

        slider.addSlider(dsv);
    }

    slider.setPresetTransformer(SliderLayout.Transformer.Default);
    slider.setCustomIndicator(indicator);
    slider.setCustomAnimation(new DescriptionAnimation());
    slider.setDuration(4000);
    slider.addOnPageChangeListener(this);

}

фрагмент.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    tools:context="com.example.fragments.Fragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ScrollView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/sv_main">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/rl_main">

            <com.daimajia.slider.library.SliderLayout
                android:id="@+id/slider"
                android:layout_width="match_parent"
                android:layout_height="200dp"
                />
            <com.daimajia.slider.library.Indicators.PagerIndicator
                android:id="@+id/custom_indicator"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:layout_below="@+id/slider"
                custom:shape="oval"
                custom:selected_color="#00BFA5"
                custom:unselected_color="#55333333"
                custom:selected_padding_left="@dimen/spacing_medium"
                custom:selected_padding_right="@dimen/spacing_medium"
                custom:selected_padding_top="3dp"
                custom:selected_padding_bottom="@dimen/spacing_small"
                custom:unselected_padding_left="@dimen/spacing_medium"
                custom:unselected_padding_right="@dimen/spacing_medium"
                custom:unselected_padding_top="@dimen/spacing_small"
                custom:unselected_padding_bottom="4dp"
                custom:selected_width="@dimen/spacing_medium"
                custom:selected_height="@dimen/spacing_medium"
                custom:unselected_width="6dp"
                custom:unselected_height="6dp"
                />

            <LinearLayout
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_below="@+id/custom_indicator"
                android:id="@+id/ll_main_body">

            </LinearLayout>

        </RelativeLayout>

    </ScrollView>

    <!-- Other stuff -->

</RelativeLayout>

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

Любые идеи?


person Mauker    schedule 23.11.2015    source источник
comment
возможно вы получаете ошибку OutOfMemoryError. Вы включили отладку для picasso или glide? Насколько велика возможность рисования?   -  person Jared Rummler    schedule 27.11.2015
comment
я бы попробовал включить отображение прямоугольников макета в настройках разработчика, а затем пойти и убедиться, что на самом деле есть черное изображение, потому что я предполагаю, что представление имеет ширину и/или высоту == 0...   -  person David Medenjak    schedule 27.11.2015
comment
У меня была такая же проблема, когда я использовал точно такую ​​же библиотеку, затем я сменил тестовое устройство, и оно отлично работало на других устройствах. Раньше я тестировал Moto G, но он не работал, затем я тестировал Nexus 5 и Note 3, все работало нормально. Хотя не знаю причину :/ просто попробуйте другое устройство.   -  person rusted brain    schedule 30.11.2015
comment
Еще одна вещь, я был на Stock 5.1, когда он не работал на Moto G, через некоторое время я прошил другой ROM и не понял, что он отлично работает на другом ROM. Я только что проверил его и понял, что он отлично работает на другом ПЗУ.   -  person rusted brain    schedule 30.11.2015
comment
Я изменил библиотеку Picasso на Fresco, и теперь она работает. Но почему на Земле это происходит? Проблема также возникает с Glide ...   -  person Mauker    schedule 30.11.2015
comment
Ваш фон по умолчанию черный? Я знаю, что Пикассо предпочитает слабые ссылки на изображения, поэтому, возможно, это может быть проблемой.   -  person Lars Celie    schedule 03.12.2015
comment
В библиотеке есть вариант-заполнитель, который является другим изображением (оно появляется ненадолго, а затем я получил черное изображение). И то же самое произошло с Glide (черное изображение), так что, я думаю, это не исключительная проблема Пикассо.   -  person Mauker    schedule 03.12.2015
comment
Просто из любопытства, вы пробовали использовать силу двух изображений? т. е. 512x512, 1024x1024 и т. д.   -  person Steve C.    schedule 04.12.2015
comment
Я этого не пробовал. Странно то, что изображение, которое будет черным, случайное.   -  person Mauker    schedule 04.12.2015
comment
пожалуйста выложите файл изображения   -  person Trey Cai    schedule 22.01.2016
comment
См. соответствующую проблему в Glide: github.com/bumptech/glide/issues/738 есть исправление для конкретного устройства, но можно добавить больше, если информации достаточно.   -  person TWiStErRob    schedule 03.02.2016
comment
Происходит ли это постоянно для всех изображений или это происходит только для некоторых изображений?   -  person Lorne Laliberte    schedule 15.03.2016
comment
Это может быть любое изображение в любое время. Это как-то случайно.   -  person Mauker    schedule 15.03.2016
comment
Я видел нечто подобное при использовании псевдонимов... Picasso и Glide, похоже, не разрешают ссылки при загрузке из ресурса. Замена идентификатора псевдонима идентификатором объекта рисования, который он представляет, заставляет его работать. Однако это происходит не периодически... использование псевдонима никогда не работает (а не только в некоторых случаях).   -  person Lorne Laliberte    schedule 15.03.2016


Ответы (3)


Создайте папку ресурсов с именем drawable-nodpi в этой папке, поместите свои изображения вместо других папок или папок с возможностью рисования.

person Praveen    schedule 22.02.2016
comment
Это не решает проблему. Но было ошибкой помещать изображения в папку drawable, да. Спасибо :) - person Mauker; 23.03.2016

Пробовали ли вы использовать ViewPager с ImageView и передавать адаптеру массив URI изображений? Я думаю, вы могли бы избежать/отладить намного лучше, если бы реализовали это самостоятельно.

person esoxjem    schedule 04.12.2015
comment
Это был мой первый подход, но он не был так хорош, как функции, которые я могу иметь в этой библиотеке. - person Mauker; 05.12.2015

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

Первый

SliderLayout ни на что не ссылается. Вот где происходит волшебство. Создайте макет xml и обратитесь к нему с помощью SliderLayout. После этого не забудьте вызвать startAutoScroll() и в onPause() остановитьAutoScroll().

https://github.com/daimajia/AndroidImageSlider/wiki/Start-Using

Ссылка выше в основном все, что вам нужно.

Второй

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

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

Удачи.

person Arnold Balliu    schedule 01.01.2016
comment
На самом деле на это ссылались, я просто сделал код коротким. И это работало, в большинстве случаев. Не знаю, связана ли проблема с ScrollView. Если да, то почему это происходит только на нескольких устройствах? - person Mauker; 01.01.2016
comment
Поскольку вложенная прокрутка поддерживается только API 21+ - person Arnold Balliu; 01.01.2016
comment
Так или иначе. Я бы предложил изменить макет для поддержки более ранних устройств. - person Arnold Balliu; 01.01.2016
comment
На самом деле это не так. В рамках поддержки v4 он поддерживает устройства уровня API 4 или выше. - person Mauker; 02.01.2016
comment
NestedScrollView да... Но вы используете SliderLayout с механизмом прокрутки ВНУТРИ ScrollView... - person Arnold Balliu; 02.01.2016
comment
Ага. Но прокрутка никогда не была проблемой, и любая из этих прокруток прекрасно работала с ползунком. И у обоих была одна и та же проблема с изображением. - person Mauker; 02.01.2016
comment
Ну, это может быть потому, что эта библиотека может быть определена для работы только с некоторыми конкретными макетами. Я сказал это не просто так, потому что я сталкивался с подобными вещами раньше, когда вы используете библиотеку и ожидаете, что она будет работать при любых обстоятельствах. Вот почему я сказал начать с простого макета. Если это все еще не работает, значит, вы делаете что-то не так с реализацией. Если это работает, то вы получаете черные изображения, вероятно, потому, что они плохо работают с макетом... - person Arnold Balliu; 02.01.2016