Android LayerDrawable.setDrawableByLayerId不能用于HTC Sensation(以及其他?)

时间:2013-03-12 13:07:50

标签: android drawable

我正在使用LayerDrawable在底层图像(索引0)上构建一系列热点(索引1+)。热点是基于用户界面交互添加的,它们的位置是动态的,所以我以编程方式而不是使用XML来完成所有这些。作为进一步(可能不相关)的细节,我使用Fragment来保存LayerDrawable,因为这是在FragmentStatePagerAdapter和ViewPager的上下文中。

问题在于,当我尝试通过调用SetDrawableByLayerId更改LayerDrawable中的Drawable来更新图像时,图像不会更改(尽管方法返回true,表明它找到了图层)。

我怎样才能让它发挥作用?

3 个答案:

答案 0 :(得分:4)

在这里回答我自己的问题,希望对那里的人有用。我能用HTC Sensation工作的唯一方法是从头开始重新创建LayerDrawable,加上改变:

LayerDrawable oldLayerDrawable = (LayerDrawable) imageView.getDrawable();
Drawable[] layers = new Drawable[2];
layers[0] = oldLayerDrawable.getDrawable(0);
layers[1] = getResources().getDrawable(R.drawable.hotspot_dot);
LayerDrawable layerDrawable = new LayerDrawable(layers);
imageView.setImageDrawable(layerDrawable);

它不漂亮,但似乎这可能是一个已知的问题。

答案 1 :(得分:1)

newdrawable.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 :(得分:0)

事情是"索引"和" id"是不同的属性。 默认情况下,任何图层的layerId始终等于-1。但您可以通过调用setId(index, id)明确设置,然后调用setDrawableByLayerId(id, Drawable)