带有圆角的 AppWidget 图像

2024-01-14

因此,我通过在应用程序的主布局中向用户显示的各种视图进行动画处理,在应用程序中动态创建图像。

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

这一切都工作得很好,但是......为了尝试为应用程序小部件图像创建圆角,我尝试使用我发现的这两个片段here. https://stackoverflow.com/questions/16161448/how-to-make-layout-with-rounded-corners

我的问题:

是这个方法生成一个可绘制的(如果显示为可绘制的,其圆角看起来很完美),但我需要将这些透明角导出为图像文件。下面 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);
    }
}

and

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://nadavfima.com/android-snippet-inflate-a-layout-draw-to-a-bitmap/
     */
    public static Bitmap drawToBitmap(final View viewToDrawFrom, final int width, final int height) {
        // Create a new bitmap and a new canvas using that bitmap
        final Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        final Canvas canvas = new Canvas(bmp);
        viewToDrawFrom.setDrawingCacheEnabled(true);
        // Supply measurements
        viewToDrawFrom.measure(MeasureSpec.makeMeasureSpec(canvas.getWidth(),     MeasureSpec.EXACTLY),
                MeasureSpec.makeMeasureSpec(canvas.getHeight(), MeasureSpec.EXACTLY));
        // Apply the measures so the layout would resize before drawing.
        viewToDrawFrom.layout(0, 0, viewToDrawFrom.getMeasuredWidth(),    viewToDrawFrom.getMeasuredHeight());
        // and now the bmp object will actually contain the requested layout
        canvas.drawBitmap(viewToDrawFrom.getDrawingCache(), 0, 0, new Paint());
        return bmp;
     }

    private void drawContent() {
        if (getMeasuredWidth() <= 0 || getMeasuredHeight() <= 0)
            return;
        final Bitmap bitmap = drawToBitmap(mMainContainer, getMeasuredWidth(), getMeasuredHeight());
        final RoundedCornersDrawable drawable = new RoundedCornersDrawable(getResources(),     bitmap, 15);
        setImageDrawable(drawable);
    }
}

据我了解,位图不携带图像中具有透明圆角所需的 alpha 信息, 所以我尝试将文件另存为 PNG 像这样;

RCD_test 是一个 RoundedCornersDrawable

Bitmap bitmap = RCD_test.getBitmap();
bitmap.setHasAlpha(true);
OutputStream stream = new          
FileOutputStream(Environment.getExternalStorageDirectory().getPath()+"/test/screenshottest.png");
bitmap.compress(CompressFormat.PNG, 100, stream);
stream.close();

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

我的问题:

我如何获取这个 RoundedCornersDrawable,并将其导出为 PNG 文件,以正确描绘其美丽的透明角?

预先感谢您的帮助,我愿意接受关于解决整个问题的不同方法的任何和所有建议!


遗憾的是,AppWidget 的视图非常有限。您只能使用 Android 支持的视图。

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

因此,解决方案是将应显示的图像刷新到 imageView 或类似的东西。 如果需要准备很多内容,我建议在后台进行。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有圆角的 AppWidget 图像 的相关文章

随机推荐

  • Python 深度嵌套工厂函数

    在 学习Python 中遇到了工厂函数 本教科书示例有效 def maker N def action X return X N return action gt gt gt maker 2
  • 将字符串中的数字范围替换为单个数字

    有没有办法将字符串中的数字范围替换为单个数字 数字的范围可以是 n n 最有可能是 1 15 也可以是 4 10 范围可以用 a 表示 a lt I would like to buy 1 3 cats 或与单词 b 一起使用 例如 to
  • 跨两个数据源的事务管理(ChainedTransactionManager)-SpringBoot

    为什么 Spring ChainedTransactionManager 被弃用 spring 是否提供任何替代库来支持多个事务管理器 我的用例 我们正在构建一个连接到两个数据源 db1 和 db2 的 Spring Boot 应用程序 它
  • 正确停止 Tika 服务器

    为了启动可以从 localhost 以外的主机访问的 Tika 服务器 我们知道要走的路是 假设我有版本 1 7 并且想要在端口 9998 上运行 java jar tika server 1 7 SNAPSHOT jar host 0 0
  • 未捕获的类型错误:$(...).owlCarousel 不是函数

    我已将 owlCarousel 添加到我的页面 但我收到这个错误 并坚持了几个小时 HTML code custom js 中的函数 owl hero owlCarousel navigation true Show next and pr
  • 如何从 Twitter API 和趋势线获取关注者数量

    我正在为 Twitter 编写一些关于随时间推移的关注者数量的报告 但是经过大量搜索和反复试验后 我无法获得随时间推移的关注者数量 特别是过去的关注者数量 我知道有一个 API 可以获取关注者的个人 userId 但这对于我的需要来说有点过
  • Jenkins Subversion 签出失败 - “E175002:CRLF 预计在块末尾:-1/-1”

    我有一个 Jenkins v2 107 2 实例 作为 Windows 服务运行 它正在通过 Subversion 从 Visual SVN 服务器 在单独的 Windows PC 上 检查多个项目 其中一个项目 最大的 2 7GB 偶尔会
  • 如何使用 jquery 在 iframe 中选择标签?

    我试图弄清楚如何选择然后修改 HTMLiframe我生成 iframe 显示各种媒体 图像 pdf 等 为了显示不同的项目 我最初使用如下方式创建它 mydiv html 然后 根据需要 使用如下内容更新其内容 myiframe attr
  • 用于在 HTML 表中查找行索引的 jQuery 语法

    1 如何查找 HTML 表格中的行号 索引 生成的表没有任何行 ID 例如 我生成了一个纯 HTML 表格 其中有 10 行 我正在向该表动态添加行 在现有行之间 由于我要添加新行 现有的行索引将会更改 现在我需要在添加新行之前找到每行的索
  • 如何避免在 Windows 中过度填充 PATH 环境变量?

    我想知道您使用什么方法来管理系统中的可执行文件 例如 我几乎可以通过命令行访问所有内容 但现在我遇到了路径字符串的限制 因此我无法添加更多目录 那么你有什么推荐呢 很久以前 我尝试在属于该路径的目录中使用可执行文件的软链接 但这种方法不起作
  • 是否可以对两个转换字符组合使用格式修饰符?

    我知道如何使用 log4j 输出类名和方法名 这两个字段都可以单独对齐和填充 例如这个模式 d ISO8601 5p 10C 1 10M m n 产生类似的东西 2012 09 20 08 25 12 111 WARN Class meth
  • Windows 无法在本地计算机上启动 Apache CouchDB 服务

    我已在 Windows 计算机上安装了 CouchDB 但在启动 CouchDB 服务时 我收到如下消息 Windows 无法在本地计算机上启动 Apache CouchDB 服务 该服务没有返回错误 这可能是 Windows 内部错误或内
  • 使用bundle运行gitlab服务器:命令未找到错误

    我不知道发生了什么 sudo 服务 gitlab 启动 Starting both the GitLab Unicorn and Sidekiqscript web line 21 bundle command not found 查看我的
  • 如何在 cygwin 上安装 cURL?

    我尝试在 cygwin 上启用curl 但它说bash curl command not found 如何在 cygwin 上安装curl 我刚刚遇到这个 1 从以下位置找到cygwin setup exe文件http cygwin com
  • 使文本高度为 div 的 100%?

    我正在尝试使文本的高度为 100 div但它不起作用 它只是变成了100 body font size 有什么办法让它跟随div高度吗 The div高度是整个页面的 4 当您调整大小 更改分辨率时 我不希望文本跟随它 为了获得我想要的结果
  • 是否可以在打字稿中创建动态 getter/setter?

    我是 TypeScript 新手 我正在尝试将我们的应用程序从 es2016 重写为 TypeScript 我的任务是拥有一个具有数据属性的类 并使数据对象中的每个元素可用作类属性 我被这段 JavaScript 代码困住了 for let
  • Django:关闭http响应消息的控制台输出

    所以我们用 django 制作了一个应用程序 每次收到请求时它都会在控制台上打印所有这些 http 响应消息 Date String GET urlpath blah blah 200 216 Date String DELETE anot
  • jQuery 数据表问题

    当使用jQuery 数据表插件 http datatables net 为什么我会收到此错误 k 未定义 style typeof e saved aaSorting 未定义 我发布这个答案是为了记录一些东西以供自己将来参考 我希望它能对其
  • EqualityComparer.Default 不够聪明

    我正在阅读源代码EqualityComparer
  • 带有圆角的 AppWidget 图像

    因此 我通过在应用程序的主布局中向用户显示的各种视图进行动画处理 在应用程序中动态创建图像 目前 我正在相对布局中生成场景 将布局图像作为位图 然后将位图保存到 SD 以便 appwidget 通过 uri 访问 这一切都工作得很好 但是