我试图以编程方式将图片加载到图层列表中。我找到了一些解决方案,但不知怎的,它不起作用。这是我做的:
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());
答案 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。您还可以查看PipelineDraweeController和AbstractDraweeController等类,了解如何实现(这就是使用SimpleDraweeView时会发生的情况)。