【问题标题】:Getting black ImageView using Picasso and Glide使用 Picasso 和 Glide 获取黑色 ImageView
【发布时间】:2015-11-23 04:35:54
【问题描述】:

问题

我正在编写一个应该具有“幻灯片放映”功能的 Android 应用程序。我发现this nice library,基于毕加索,这正是我想要的,而且它在大多数情况下都工作得很好。

问题是,有时我的图片没有加载到幻灯片ImageView...它只显示一个“黑色画布”,如下面的屏幕截图所示。

我正在从我的可绘制对象的本地资源中加载图像。有时它发生在纵向模式下,有时发生在横向模式下。我使用哪个图像并不重要,有时会发生“黑色”。

编辑:

  • 我使用的是 Android 5.0.2 和 4.4.2 - 在 4.4.2 上似乎没有发生。仅在 5.0.2 上。

  • 它发生在装有 android 5.1 的 Moto X 2014 上。

  • 我尝试加载的图像在磁盘上有 45KB,分辨率为 900x445。

  • 我按照建议打开了布局矩形,结果如下:

它在滚动时保持这种状态。

有时,它会变成白色而不是黑色(或者先是白色,然后是黑色)。

我尝试过的其他东西:我的可绘制对象位于 res/drawable 文件夹中,当我将该文件夹中的文件更改为 res/drawable-xxxhdpi 时,滑块在 5.0.2 设备上工作. wtf???

到目前为止我做了什么

我尝试了不同的图像,在幻灯片上加载多个图像,甚至 this pull request 将 Picasso 更改为库上的 Glide。似乎没有任何效果,而且错误似乎是随机的。

一旦我尝试使用来自网络的 URL,而不是本地存储上的实际可绘制对象,它就起作用了。使用完全相同的图像。

这是我加载图像的方式:

Fragment.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);

}

fragment.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>

我正在关注库 wiki page 中的 the tutorial。并且 LogCat 上没有抛出任何错误,这使得解决这个问题变得更加困难。

有什么想法吗?

【问题讨论】:

  • 也许你得到了 OutOfMemoryError。您是否打开了 picasso 或 glide 的调试功能?可绘制对象有多大?
  • 我会尝试在开发人员设置中启用布局矩形的显示,然后去确保实际上有一个黑色的图像视图,因为我猜测视图是宽度和/或高度 == 0。 ..
  • 我在使用完全相同的库时遇到了同样的问题,然后我更改了我的测试设备,它在其他设备上运行良好。之前我在 Moto G 上进行了测试,但后来我在 Nexus 5 和 Note 3 上进行了测试,它运行良好。虽然不知道原因:/ 只是尝试另一个设备。
  • 你的背景默认是黑色的吗?我知道毕加索喜欢对图像进行弱引用,所以这可能是个问题。
  • 在 Glide 中查看相关问题:github.com/bumptech/glide/issues/738 有针对特定设备的修复,但如果有足够的信息,可以添加更多。

标签: android imageview android-drawable picasso android-glide


【解决方案1】:

在该文件夹中创建一个名为 drawable-nodpi 的资源文件夹,放置您的图像而不是不同的文件夹或可绘制文件夹。

【讨论】:

  • 这并不能解决问题。但是将图像放在可绘制文件夹中是错误的,是的。谢谢:)
【解决方案2】:

您是否尝试过使用 ViewPagerImageView 并将图像 URI 数组传递给适配器?我认为如果您自己实现它,您将能够更好地避免/调试。

【讨论】:

  • 这是我的第一个方法,但没有得到我在这个库上可以拥有的功能。
【解决方案3】:

这个库对我来说很好用,我第一次使用它。这是一个非常好的图书馆。

第一

SliderLayout 没有被任何东西引用。这就是魔法发生的地方。制作一个 xml 布局并通过 SliderLayout 引用它。之后不要忘记调用 startAutoScroll() 和 onPause() stopAutoScroll()。

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

上面的链接基本上就是你所需要的。

第二

问题也可能是它在滚动视图中。滚动回调可能行为不端。

制作一个简单的布局,从一个简单的滑块开始,然后逐步进行自定义。

祝你好运。

【讨论】:

  • 其实已经被引用了,我只是把代码做短了。在大多数情况下,它都奏效了。不知道问题是否出在 ScrollView 上。如果是这样,为什么这种情况只发生在少数设备上?
  • 因为嵌套滚动只支持api 21+
  • 无论如何。我建议您更改布局以支持早期的设备。
  • 其实不是。作为support v4 的一部分,它支持设备 API 级别 4 或更高版本。
  • NestedScrollView 是的...但是您正在使用具有滚动机制的 SliderLayout INSIDE a ScrollView...
猜你喜欢
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多