在 Android 2.3 .X (Gingerbread) 及更低版本上修改 LayerDrawable 层

Posted

技术标签:

【中文标题】在 Android 2.3 .X (Gingerbread) 及更低版本上修改 LayerDrawable 层【英文标题】:Modifying LayerDrawable layer on Android 2.3 .X (Gingerbread) and lower 【发布时间】: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)

现在建议我使用两种图像视图的组合。但是我的LayerDrawableLevelListDrawable 的一部分,我认为我不能在其中包含布局。

总而言之,这让我无法在预 Honeycomb 设备上以任何方式修改我的 LayerDrawable 的内容。任何关于我应该如何进行的建议都非常感谢!

【问题讨论】:

FrameLayout 中使用两个ImageView 小部件可能更容易实现图层效果。 @CommonsWare 感谢您的建议。但是请注意我提到的内容 - 我正在使用 LevelListDrawable 作为我的 LayerDrawable 的容器。我不知道有什么方法可以将FrameLayout 包含在LevelListDrawable 中... 抱歉,我错过了。你在哪里使用LevelListDrawable @CommonsWare 基本上你在这里看到的是我的文件系统最佳缩略图显示解决方案的一部分。我有几个文件类型有LayerDrawables 作为缩略图 - 例如音乐文件以 cd 的隐喻呈现。我正在使用LevelListDrawable 来寻求性能优化。 但是为什么你必须在运行时更改图像源?这不像文件会神奇地即时更改文件类型。 【参考方案1】:
drawable.setBounds(mLayerDrawable.findDrawableByLayerId(R.id.image_source).getBounds());
mLayerDrawable.setDrawableByLayerId(R.id.image_source, drawable);        
mLayerDrawable.invalidateSelf();

参考: https://github.com/ytRino/LayerDrawableSample/blob/master/src/net/nessness/android/sample/layerdrawable/LayerDrawableSampleActivity.java

【讨论】:

你在这里找到了不错的技巧。作为魅力为我工作。谢谢;)【参考方案2】:

最后我们用一种非常奇怪的方式把它炒起来了:

LayerDrawable layerDrawable = (LayerDrawable) getResources().getDrawable(layerDrawableResourceId);
layerDrawable.setDrawableByLayerId(R.id.image_source, drawable);
Drawable[] layers = 
   layerDrawable ;
LayerDrawable layerDrawableNew = new LayerDrawable(layers);

我的一位同事发现,如果我们创建新的LayerDrawable,将其设置为 not-working 方法,然后将这个LayerDrawable 包装在另一个中,可视化是正确的(图像已更改,并且保留了填充)。相当多的调整和很多“不要碰这个它很神奇”,但这是我们可以解决的最佳解决方案。

【讨论】:

以上是关于在 Android 2.3 .X (Gingerbread) 及更低版本上修改 LayerDrawable 层的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio2.2.3配置OpenCV3.1.0且不安装OpenCV Manager运行

Google Play 服务在 Android 2.3 Vision API 上崩溃

android studio 2.3 cmake ndk开发第一个项目运行

android studio 2.3 cmake ndk开发第一个项目运行

Android 版本 > 2.3 上的 FileNotFoundException

在 android 2.3 上使用 jcifs 库时出现 NoClassDefFound 异常