在小部件的配置阶段,我想更新作为图层列表一部分的位图。由于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>
<!-- ... -->
感谢您分享您的想法。
答案 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>