带圆角的AppWidget图像

所以,我通过动画我在应用程序主布局中向用户显示的各种视图动态创建我的应用程序中的图像。

目前我在RelativeLayout中生成我的场景,将布局图像作为位图,然后将位图保存到SD,以便appwidget通过uri访问。

这一切都很有效,但是……在为appwidget图像创建圆角的过程中,我尝试使用我在这里找到的这两个片段。

我的问题:

是这个方法生成一个drawable(如果显示为drawable,其圆角看起来很完美),但我需要将这些透明角输出为图像文件。 下面的CustomView中的drawToBitmap方法确实生成了位图图像,但角落是满的和方形的。

/** * shows a bitmap as if it had rounded corners. based on : * http://rahulswackyworld.blogspot.co.il/2013/04/android-drawables-with-rounded_7.html */ public class RoundedCornersDrawable extends BitmapDrawable { private final BitmapShader bitmapShader; private final Paint p; private final RectF rect; private final float borderRadius; public RoundedCornersDrawable(final Resources resources, final Bitmap bitmap, final float borderRadius) { super(resources, bitmap); bitmapShader = new BitmapShader(getBitmap(), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); final Bitmap b = getBitmap(); p = getPaint(); p.setAntiAlias(true); p.setShader(bitmapShader); final int w = b.getWidth(), h = b.getHeight(); rect = new RectF(0, 0, w, h); this.borderRadius = borderRadius < 0 ? 0.15f * Math.min(w, h) : borderRadius; } @Override public void draw(final Canvas canvas) { canvas.drawRoundRect(rect, borderRadius, borderRadius, p); } } 

 public class CustomView extends ImageView { private FrameLayout mMainContainer; private boolean mIsDirty=false; // TODO for each change of views/content, set mIsDirty to true and call invalidate @Override protected void onDraw(final Canvas canvas) { if (mIsDirty) { mIsDirty = false; drawContent(); return; } super.onDraw(canvas); } /** * draws the view's content to a bitmap. code based on : * http://sofzh.miximages.com/java/screenshottest.png"); bitmap.compress(CompressFormat.PNG, 100, stream); stream.close(); 

但无济于事。 整个方法可能看起来很复杂,但这是我想出来解决AppWidget的RemoteViews的限制。

我的问题:

我怎样才能获得这个RoundedCornersDrawable,并将其导出为PNG文件,正确描绘它漂亮的透明角落?

在此先感谢您的帮助,我对所有关于问题的不同方法的建议持开放态度!

可悲的是,AppWidgets在视图方面非常有限。 您只能使用Android支持的视图。

原因是视图的代码需要在AppWidget的容器​​上运行,这是一个安全风险,因为您可以瞥见显示它的应用程序的私有数据。 所以Google所做的就是你需要准备要显示的内容,当你完成后,告诉受限制的API如何显示AppWidget。

所以解决方案是将应该显示的图像刷新到imageView或类似的东西。 如果有很多准备工作,我建议在后台进行。

这一切都取决于您的需求。

除了这个问题:

“事实certificate,我的AppWidget的大小一直在削减图像。 剪裁它只是为了去除圆角,并且几乎没有明显被剪掉。 所以对于遇到这个问题的人来说……所有这些方法都是为了这个目的而工作的(只是不要忘记让你的AppWidget足够大以查看结果)。

回答:

我发现在将RoundedCornersDrawable导出到PNG文件之前,通过CustomView.drawToBitMap()方法传递RoundedCornersDrawable也很关键。

我希望有一天这一切都能帮助有人走下去!