【发布时间】:2014-01-02 06:48:12
【问题描述】:
我有以下LayerDrawable:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/image_source"
android:bottom="6dp"
android:drawable="@drawable/default"
android:left="14dp"
android:right="14dp"
android:top="6dp">
</item>
<item android:drawable="@drawable/metaphor_photo_portrait"/>
</layer-list>
我需要能够从代码中动态替换 @+id/image_source 中的图像。我在 Honeycomb+ 设备上成功使用:
mLayerDrawable.setDrawableByLayerId(R.id.image_source, drawable);
mLayerDrawable.invalidateSelf();
但是,这不适用于 Gingerbread 设备,因为 setDrawableByLayerId 对于 Gingerbread 设备(link 1、link 2)不稳定。建议我从头开始构建LayerDrawable。我开始这样做,目前面临设置第一层的intristicInset的问题。
我尝试过使用
mLayerDrawable.setLayerInset(0, dp14, dp6, dp14, dp6);
dpxx 是我自己计算的常数。但是,这种方法似乎也不适用于 Gingerbread (link 1)。
因此我决定尝试另一种方式 - 设置我在第一层设置的可绘制对象的重新角的边界:
drawable.setBounds(dp14, dp6, dp90 - dp14, dp90 - dp6);
完美,但是LayerDrawable 层上的边界设置似乎被忽略了 (link 1)
现在建议我使用两种图像视图的组合。但是我的LayerDrawable 是LevelListDrawable 的一部分,我认为我不能在其中包含布局。
总而言之,这让我无法在预 Honeycomb 设备上以任何方式修改我的 LayerDrawable 的内容。任何关于我应该如何进行的建议都非常感谢!
【问题讨论】:
-
在
FrameLayout中使用两个ImageView小部件可能更容易实现图层效果。 -
@CommonsWare 感谢您的建议。但是请注意我提到的内容 - 我正在使用
LevelListDrawable作为我的LayerDrawable的容器。我不知道有什么方法可以将FrameLayout包含在LevelListDrawable中... -
抱歉,我错过了。你在哪里使用
LevelListDrawable? -
@CommonsWare 基本上你在这里看到的是我的文件系统最佳缩略图显示解决方案的一部分。我有几个文件类型有
LayerDrawables 作为缩略图 - 例如音乐文件以 cd 的隐喻呈现。我正在使用LevelListDrawable来寻求性能优化。 -
但是为什么你必须在运行时更改图像源?这不像文件会神奇地即时更改文件类型。
标签: android android-layout compatibility android-drawable layerdrawable