为窗口小部件动态更新图层列表中的Drawable

时间:2012-12-13 23:41:39

标签: android android-widget drawable layer-list

在小部件的配置阶段,我想更新作为图层列表一部分的位图。由于RemoteViews和Widgets的所有限制,我发现自己无法实现这一点。既不手动创建新的LayerDrawable也不检索和更新drawable。你有什么想法吗?

背景:窗口小部件显示照片以及其他一些信息。照片应该是框架和很好的比例,即使它的sqare,风景或肖像。

层名录:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/photo_01"></item>
    <item android:drawable="@drawable/photo_border"></item>
</layer-list>

drawable @ drawable / photo_border是一个9补丁位图。

布局中的相应部分:

<!-- ... -->
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:padding="20dp" >

    <ImageView
        android:id="@+id/photo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:adjustViewBounds="true"
        android:padding="4dp"
        android:scaleType="fitCenter"
        android:src="@drawable/framed_placeholder" />

</RelativeLayout>
<!-- ... -->

感谢您分享您的想法。

1 个答案:

答案 0 :(得分:0)

在解决问题时,我发现,我可能只是手动渲染Bitmap并更新imageView。这是代码。这不好,但完成工作。

这可能仍然可以通过更好地处理密度等来改善。

Bitmap bmp = BitmapFactory.decodeFile(sdCard.getAbsolutePath() + pathName);
Bitmap cBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Config.ARGB_8888);
Canvas c = new Canvas(cBitmap);
c.drawBitmap(bmp, 0, 0, null);
NinePatchDrawable photo_border = (NinePatchDrawable) context.getResources().getDrawable(R.drawable.photo_border);
photo_border.setBounds(0, 0, bmp.getWidth(), bmp.getHeight());
photo_border.draw(c);

views.setImageViewBitmap(id.photo, cBitmap);

有一点需要注意:当手机启动时,如果未安装SD卡,小部件可能会收到更新事件。您应该等到它,或者跳过配置并添加一个intent-filter(这就是我所做的)

<intent-filter>
    <action android:name="android.intent.action.MEDIA_MOUNTED"/>
    <data android:scheme="file"></data>
</intent-filter>