以编程方式将图像加载到图层列表中

时间:2016-07-02 10:47:29

标签: android

我试图以编程方式将图片加载到图层列表中。我找到了一些解决方案,但不知怎的,它不起作用。这是我做的:

layer_list.xml :(设置为RelativeLayout的背景)

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/red" />
    <item
        android:id="@+id/replace"
        android:drawable="@drawable/placeholder" />
    <item
        android:bottom="-250dp"
        android:left="0dp"
        android:right="-250dp"
        android:top="250dp">
        <rotate
            android:fromDegrees="-10"
            android:pivotX="0%"
            android:pivotY="100%">
            <shape android:shape="rectangle">
                <solid android:color="@color/white" />
            </shape>
        </rotate>
    </item>
</layer-list>

将位图加载到图层列表中的代码:

Drawable drawable = new BitmapDrawable(getResources(), bitmap);
LayerDrawable layerDrawable = (LayerDrawable) ResourcesCompat.getDrawable(getResources(), R.drawable.layer_list, null);
layerDrawable.setDrawableByLayerId(R.id.replace, drawable);

但不知何故,占位符图像永远不会被新的位图替换。我在这里做错了什么?

编辑:这是我加载图片的方式:

    private void loadImageIntoLayerList(Context context, String url) {
    // To get image using Fresco
    ImageRequest imageRequest = ImageRequestBuilder
            .newBuilderWithSource(Uri.parse(url))
            .setProgressiveRenderingEnabled(true)
            .build();

    ImagePipeline imagePipeline = Fresco.getImagePipeline();
    DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline
            .fetchDecodedImage(imageRequest, context);

    BaseBitmapDataSubscriber dataSubscriber = new BaseBitmapDataSubscriber() {
        @Override
        public void onNewResultImpl(@Nullable Bitmap bitmap) {
            // You can use the bitmap in only limited ways
            // No need to do any cleanup.
            if (bitmap != null) {
                Drawable drawable = new BitmapDrawable(getResources(), bmp);
                LayerDrawable layerDrawable = (LayerDrawable) ResourcesCompat.getDrawable
                        (getResources(), R.drawable.layer_list, null);
                if (layerDrawable != null) {
                    layerDrawable.setDrawableByLayerId(R.id.cover_image, drawable);
                    header.setBackground(layerDrawable);
                }
            }
        }

        @Override
        public void onFailureImpl(DataSource dataSource) {
            // No cleanup required here.
        }
    };
    dataSource.subscribe(dataSubscriber, CallerThreadExecutor.getInstance());

2 个答案:

答案 0 :(得分:1)

在最后添加以下行:

myRelativeLayout.setBackground(layerDrawable);

看起来你需要在更改drawable后再次设置背景。

以下是工作代码:

public class TestActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);
    final RelativeLayout RL = (RelativeLayout) findViewById(R.id.RL);
    Button btn = (Button) findViewById(R.id.btn);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Drawable drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.image7, null);
            LayerDrawable layerDrawable = (LayerDrawable) ResourcesCompat.getDrawable(getResources(), R.drawable.layer_list, null);
            layerDrawable.setDrawableByLayerId(R.id.replace, drawable);
            RL.setBackground(layerDrawable);

        }
    });
}
}

layer_list.xml与您的相同,只有不同的drawable。 activity_test.xml只是一个RelativeLayout,中间有一个按钮。

答案 1 :(得分:1)

您无法使用BaseBitmapDataSubscriber.onNewResultImpl(Bitmap)中获得的位图。 如果您查看此方法的Javadoc,您会看到Bitmap的内存将很快被释放。

如果您在布局中直接使用SimpleDraweeView会更好。它支持叠加,背景和占位符,因此它可以为您处理所有内容。 您可以在单独的drawable中拆分图层列表,例如背景和叠加层,并将其设置为XML或代码。 然后,您只需draweeView.setImageURI(...)即可加载图片。

您还可以implement a custom view获取drawable(并将其设置为背景,例如,因为您可以根据自定义视图指南使用Drawable drawable = mDraweeHolder.getTopLevelDrawable();获取Drawable本身。)

如果你真的必须直接使用imagepipeline,你还必须正确处理Bitmap的生命周期。您获得位图的CloseableReference,您必须手动释放它。 有关详细信息,请查看http://frescolib.org/docs/using-image-pipeline.html。您还可以查看PipelineDraweeControllerAbstractDraweeController等类,了解如何实现(这就是使用SimpleDraweeView时会发生的情况)。

相关问题