自定义(运行时)android小部件背景9-Patch

时间:2017-09-07 20:10:22

标签: android widget nine-patch

我有一个带有9补丁背景图片的Android小部件。

而不是使用主要布局" android:background"属性我使用RelativeLayout与ImageView设置在其他元素后面。结果还可以。

现在我希望用户能够为小部件设置外观,特别是选择背景颜色(使用颜色选择器)。

我会找到一种在运行时构建新9补丁的方法,但我首先要确保能够更改背景9补丁。

所以我手动构建了一个不同的9补丁PNG,然后我用aapt.exe编译它然后把它放在手机上。 然后我尝试使用RemoteViews.setImageViewUri()更改9补丁。结果是应用了新的PNG,但没有应用9补丁,而是被拉伸。

详情如下:

小部件布局:

<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

  <ImageView
    android:id="@+id/widgetBackground"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="fitXY"
        android:src="@drawable/rounded_black_70"/>

    <LinearLayout
    ...
  </LinearLayout>

</RelativeLayout>

描述9补丁文件和结果的图片: image

我用来设置新9补丁的代码行:

remoteViews.setImageViewUri(R.id.widgetBackground, Uri.parse("/sdcard/DCIM/test.9.png"));

我的问题:您是否有人曾使用远程视图设法应用新的(在运行时生成)9补丁图片?

我已经尝试过了:

  • 我尝试使用drawable和RemoteViews.setImageViewBitmap或setImageViewResource

  • 应用新图像
  • 我阅读了以下帖子,其中说&#34;我需要将其存储为已编译的九个补丁。这样我就可以直接将它分配给ImageView(使用它的URI)。因为它是在RemoteViews&#34;上设置运行时生成九个补丁的唯一方法。看来这家伙知道该怎么做。 Saving run-time generated NinePatch on external memory

  • 所以我学习了编译和未编译的9-patch。

  • 我尝试使用名为&#34; .9.png&#34;的文件或只是&#34; .png&#34;

谢谢

1 个答案:

答案 0 :(得分:0)

让我回答我自己的问题。

  • 我不认为可以通过RemoteViews更改9补丁。我认为有些人试图继承RemoteViews,认为他们可以覆盖显示功能,并且可以访问android中的所有现有UI功能,而不仅仅是RemoteViews中的小设置。 cf&#34;请记住,当您发送更新时,您实际上是在重新绘制应用程序窗口小部件,因此您可以使用布局文件来影响通过RemoteViews上的方法无法完成的更改。&#34;还有&#34;我只是在猜测。您可以尝试扩展RemoteView并覆盖apply函数&#34; (我无法发布链接,但您可以通过Google找到这些网页) - &gt;但是这个解决方案对我没用(应用函数永远不会触发)
  • 我的最终解决方案是:使用白色的9-patch图像,然后使用setColorFilter:remoteview.setInt(R.id.your_background,&#34; setColorFilter&#34;,your_color); 您可以通过setColorFilter很好地控制结果,请参阅http://chiuki.github.io/android-shaders-filters/#/
  • 我认为有一种替代方案,使用形状而不是9-patches