【问题标题】:Update Drawable in a layer-list dynamically for a widget为小部件动态更新图层列表中的 Drawable
【发布时间】:2012-12-17 23:46:34
【问题描述】:

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

背景:小部件显示照片以及其他一些信息。即使是方形、横向或纵向的照片,也应该有良好的框架和比例。

层列表:

<?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-patch 位图。

布局中的对应部分:

<!-- ... -->
<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>
<!-- ... -->

感谢您分享您的想法。

【问题讨论】:

  • 而不是层列表如何直接设置图像视图资源(并在代码中处理层列表),即remoteView.setImageViewBitmap(R.id.photo, yourBitmap);或 remoteView.setImageViewResource(R.id.photo, yourResourceID);并使用 AppWidgetManager 更新小部件。
  • 我找到了解决方案,请参阅下面的答案。这就是您所说的“在代码中处理图层列表”的意思吗?或者有没有像我一样渲染位图的替代方法?

标签: android android-widget drawable layer-list


【解决方案1】:

在解决问题时,我发现我可能只需要手动渲染位图并更新 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>
    <action android:name="android.intent.action.MEDIA_MOUNTED"/>
    <data android:scheme="file"></data>
</intent-filter>

【讨论】:

  • 是的,就是这样,伟大的工作。现在,当您 decodeFile 和 createBitmap 时,只需在其中放一些 try { } catch { }...您已经找到了一个解决方案(使用我在之前的评论中提供的面包屑)。
  • 没错,代码是来自一个更大的、未重构的方法的 sn-p,它有一个尝试和一些捕获:) 我刚刚遇到的一个问题:当手机启动时,SD 卡可能不是完全安装。即将更新我的答案以包含该内容。
猜你喜欢
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 2020-11-21
  • 1970-01-01
  • 2018-05-11
相关资源
最近更新 更多