自定义渲染的安卓应用小部件

7
我正在为Android制作一个应用程序小部件,由于由自定义元素(例如图表)组成,因此必须将其呈现为位图。但是,在此过程中遇到了一些问题。
1)是否有任何方法可以找到应用程序小部件的最大可用空间?(或者:是否可能在WVGA(或类似宽屏)情况下正确计算尺寸的最小空间?)
我不知道如何计算应用程序小部件的最大可用空间。对于传统的应用程序小部件,可以使用fill_parent来填充所有空间。然而,当将小部件呈现为位图时,为了避免拉伸,必须计算出正确的尺寸。文档概述了如何计算最小尺寸,但对于像WVGA这样的情况,在横向模式下会有未使用的空间 - 这会导致小部件看起来比自然拉伸的其他小部件短。
float density = getResources().getDisplayMetrics().density;
int cx = ((int)Math.ceil(appWidgetInfo.minWidth / density) + 2) / 74;
int cy = ((int)Math.ceil(appWidgetInfo.minHeight / density) + 2) / 74;
int portraitWidth = (int)Math.round((80.0f * cx - 2.0f) * density);
int portraitHeight = (int)Math.round((100.0f * cy - 2.0f) * density);
int landscapeWidth = (int)Math.round((106.0f * cx - 2.0f) * density);
int landscapeHeight = (int)Math.round((74.0f * cy - 2.0f) * density);

计算cx和cy可以得到水平和垂直单元格的数量。减去计算dpi后的-2(例如74*cy-2)是为了避免像素数四舍五入导致的问题。(例如在Nexus One横向模式下,高度为110,而不是111(74*1.5)。
2)将位图分配给用作RemoteViews一部分以查看图像的ImageView时,有两种方法:
2.1)通过使用setImageViewUri,并将位图保存为PNG文件。然后使用ContentProvider中的openFile()实现来提供图像:
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException
    // Code to set up imageFileName
    File file = new File(getContext().getCacheDir(), imageFileName);
    return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
}

这种方法可行,而且是我目前正在使用的方法。但是,如果将ImageView的scaleType设置为“center”,根据文档应该是“将图像居中显示在视图中,但不执行缩放”,则图像会被错误地缩放。将位图的密度设置为DENSITY_NONE或getResources().getDisplayMetrics().densityDpi在将位图保存为PNG时没有任何区别,当文件由ImageView加载时似乎被忽略。结果是由于某些dpi问题,图像被缩小了。这似乎描述了这种情况:

http://code.google.com/p/android/issues/detail?id=6957&can=1&q=widget%20size&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

由于无法使用scaleType:center,我发现唯一可行的方法是将ImageView的layout_width和layout_height静态设置为特定的dpis,然后将位图渲染到相同的dpi。这需要使用scaleType:fitXY。这种方法虽然可行,但它是一个非常静态的设置,并且对于可调整大小的3.1应用程序小部件不起作用(我还没有测试过,但除非在每次调整大小时调用onUpdate(),否则这是正确的)。 有没有办法将图像加载到未缩放的ImageView中,或者由于框架中的错误而不可能实现? 2.1)通过直接使用setImageViewBitmap。使用此方法并将位图的Bitmap.DENSITY_NONE设置,即可在不正确缩放的情况下显示图像。这种方法的问题是,通过IPC机制设置大型图像的限制:

http://groups.google.com/group/android-developers/browse_thread/thread/e8d84920b999291f/d12eb1d0eaca93ac#01d5c89e5e7b4060

我尝试了一种方法以解决这个问题,通过将小部件分割成图像矩阵,可以在100x100像素块中设置。这确实允许更大的小部件工作,但最终非常沉重并且对于较大的小部件(4x4)失败了。
非常抱歉内容很长。我已经尝试解释使用位图渲染应用程序小部件时遇到的几个不同问题。如果任何人尝试过类似的事情并找到了更多解决方案或有任何有用的评论,这将是非常感激的。
1个回答

0
我们在类似情况下采用的方法是生成一个9-patch png作为我们的图形,将实际的图形部分作为可缩放的中心矩形,并将标题文本和指示图标(我们不希望它们全部拉伸变形)以及边框效果放置在图像的外部矩形上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接