以编程方式截取屏幕截图时,Cardview 会失去其半径

2024-03-07

我在卡片视图中有约束布局。卡片视图在屏幕上看起来不错。仅当截取屏幕截图时,它才会被渲染为位图,即失去角点。我添加了位图视图的图片。约束布局与圆角重叠。我需要边到边的圆度。

下面是正确显示圆角的模拟器的屏幕截图:

这是渲染为位图的视图:

下面是我的示例代码。

public class MainActivity extends AppCompatActivity {

    private CardView cardView;
    private Button button;
    private ConstraintLayout parentLayoutA;
    private ConstraintLayout layoutB;
    private ConstraintLayout childLayout;
    private ConstraintSet innerSet;
    private ConstraintSet outerSet;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        CreateCardViewProgrammatically();
    }


    public void CreateCardViewProgrammatically(){

        cardView = new CardView(this);
        childLayout = new ConstraintLayout(this);
        parentLayoutA = new ConstraintLayout(this);
        layoutB = new ConstraintLayout(this);
        button = new Button(this);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            layoutB.setClipToOutline(true);
        }

        cardView.setRadius(150);

        button.setText("Click!!");
        button.setTextColor(Color.BLACK);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               takeScreenShot();
            }
        });

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            parentLayoutA.setId(View.generateViewId());
            layoutB.setId(View.generateViewId());
            childLayout.setId(View.generateViewId());
            cardView.setId(View.generateViewId());
            button.setId(View.generateViewId());
        }

        innerSet = new ConstraintSet();
        outerSet = new ConstraintSet();

        ConstraintLayout.LayoutParams parentParams = new ConstraintLayout.LayoutParams(
                ConstraintLayout.LayoutParams.MATCH_PARENT,
                ConstraintLayout.LayoutParams.MATCH_PARENT
        );

        layoutB.setLayoutParams(parentParams);
        childLayout.setLayoutParams(parentParams);
        cardView.setCardElevation(0);
        cardView.setPadding(50,50,50,50);

        parentLayoutA.addView(layoutB);
        layoutB.addView(cardView);
        cardView.addView(childLayout);
        childLayout.addView(button);

        innerSet.centerHorizontally(button.getId(), ConstraintSet.PARENT_ID);
        innerSet.centerVertically(button.getId(), ConstraintSet.PARENT_ID);
        innerSet.constrainHeight(button.getId(), 200);

        outerSet.connect(cardView.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END, 200);
        outerSet.connect(cardView.getId(), ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, 200);
        outerSet.centerHorizontally(cardView.getId(), ConstraintSet.PARENT_ID);
        outerSet.centerVertically(cardView.getId(), ConstraintSet.PARENT_ID);
        outerSet.constrainHeight(cardView.getId(), 1500);

        innerSet.applyTo(childLayout);
        outerSet.applyTo(layoutB);

        setContentView(parentLayoutA);

        parentLayoutA.setBackgroundColor(Color.YELLOW);
        layoutB.setBackgroundColor(Color.MAGENTA);
        cardView.setCardBackgroundColor(Color.GREEN);
        childLayout.setBackgroundColor(Color.BLUE);
    }

    public void takeScreenShot() {
        imageFromView(parentLayoutA);
    }

    public Bitmap imageFromView(View view) {

        DisplayMetrics metrics = this.getApplication().getResources().getDisplayMetrics();
        int width = view.getWidth() > 0 ? view.getWidth() : metrics.widthPixels;
        int height = view.getHeight() > 0 ? view.getHeight() : metrics.heightPixels;

        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        view.draw(canvas);

        return bitmap;
    }


从你的代码来看,我不清楚你想要完成什么。但是,如果您更改以下行

cardView.setCardBackgroundColor(Color.GREEN);

to

cardView.setCardBackgroundColor(Color.BLUE);

并删除该行

childLayout.setBackgroundColor(Color.BLUE);

您将看到您的屏幕图像按照我认为您想要的方式捕获。


根本问题是圆角裁剪取决于硬件层,该硬件层为视图显示系统生成的画布启用,但在生成自己的位图和画布时关闭。你可以检查一下画布#isHardwareAccelerated() https://developer.android.com/reference/android/graphics/Canvas.html#isHardwareAccelerated(),

看一眼使用 PixelCopy Api 以编程方式截取屏幕截图 https://medium.com/@shiveshmehta09/taking-screenshot-programmatically-using-pixelcopy-api-83c84643b02a寻找您可能采取的方法。另请参阅像素复制 https://developer.android.com/reference/android/view/PixelCopy.

Here https://github.com/Cheticamp/TakeScreenshot是 GitHub 上的一个小项目,演示如何捕获布局。该演示应用程序仅使用问题中的代码来显示布局,捕获布局并将其重新显示在图像视图. A TextView重新显示时仅显示“已捕获!”

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

以编程方式截取屏幕截图时,Cardview 会失去其半径 的相关文章

随机推荐

  • 如何以及是否值得集成 Java Webapp + drools + Guvnor?

    我计划引入 Java 规则 目前正在评估 Drools 以从应用程序中外部化 物理上和逻辑上 业务规则 由于这些业务规则通常由企业制定 因此我希望企业通过 GUI 对规则进行必要的更改 我在 Google 上搜索了关于集成 java web
  • 更改 tvOS 上 SwiftUI 中按钮的颜色

    我正在尝试更改 SwiftUI 的颜色Button在电视操作系统上 修改background几乎可以工作 除了你可以看到底层UIButton实际上是在背景顶部使用圆形半透明图像 这会导致矩形背景位于圆形图像之外的角落处出现不同的颜色 Add
  • 如何在从url加载的ImageView中淡入图片

    我想对 ImageView 应用淡入动画 以创建从 url 加载的图像在下载完成时淡入的效果 我知道如何将图像从 url 下载到 ImageView 例如这个答案 https stackoverflow com questions 2471
  • 如何通过 Reasoning 实现 Apache Jena 中命名空间之间的映射?

    Goal 我不想在本体之间实现基于规则的映射 以完成数据迁移的常见任务 实现目标的方式 为了实现这一点 我开发了一个抽象数据结构 它能够存储任何数据类型的 xml 表示形式提供的所有信息 然后我编写了一个解析器 它根据目标文档类型定义构造了
  • 获取远程日志,而不是提交

    如何在不获取更改 提交的情况下获取远程日志 我只想查看日志 看看自上次以来是否有任何新的更改pull 基本上可以避免stash or commit我的改变先 git 帮助文件有这个例子 它以倒置的形式应该给出我想要的结果 git log m
  • WPF 中带有标题的边框

    有谁知道如何在 WPF 中获得带有标题的边框 即网络浏览器显示 标签的方式 有没有一种简单的方法 比如设置属性 或者我必须制作一个 ControlTemplate 也许是一个GroupBox http msdn microsoft com
  • 使用 JUnit 比较 ArrayList 是否相等的简单方法?

    使用 JUnit 比较 ArrayList 是否相等的简单方法是什么 我需要实现相等接口吗 或者有一个简单的 JUnit 方法可以使它更容易吗 对于列表相等性 您无需执行任何特殊操作 只需使用assertEquals即可 ArrayList
  • Python __enter__ / __exit__ 与 __init__ (或 __new__)/ __del__

    我已经搜索过 但找不到任何使用 python 的充分理由 enter exit 而不是 init or new del 我明白那个 enter exit 旨在与使用with作为上下文管理器的声明 以及with声明很棒 但与之相对应的是 这些
  • 如何循环关闭容器

    我有一个产品列表 我想在产品 Feed 中展示广告 我想要类似的东西 div div Bla div div Bla div div Bla div div div Adsense Stuff div div div Bla div div
  • 如何正确使用温斯顿

    我已阅读使用winston 包登录node js 的文档 我的问题 我是否需要将日志模块添加到需要的每个页面logging 还是温斯顿以某种方式拦截console log and console error 谢谢你的时间 通常 您需要在使用
  • jquery 使用 html5 模式进行验证

    如何使 jQuery 验证 支持 HTML 5 模式 如果不需要在每个字段上指定模式 那就太好了 我知道我可以做到这一点 如下 但是有更好的方法吗 form validate rules password pattern A Za z0 9
  • servicestack with funq - 按照惯例自动装配

    我有一个在其构造函数中采用 IMyDependency 的服务 IMyDependency MyDependency 和服务都位于同一个程序集中 MyDependency 有一个单一的 公共的 无参数的构造函数 令我惊讶的是 这不起作用 c
  • 如何让 github actions 工作流程使用机器人名称将生成的文档推送到同一组织中的其他存储库

    我正在github上开发一个python包 在 github 的一个组织下我有两个存储库myorg package and myorg documentation The packagerepo 包含 python 包以及构建 sphinx
  • glmnet - 变量重要性?

    我正在使用 glmnet 包来执行 LASSO 回归 有没有办法获得所选单个变量的重要性 我考虑对通过 coef 命令获得的系数进行排名 即距零的距离越大 变量越重要 这是一个有效的方法吗 感谢您的帮助 cvfit cv glmnet x
  • 使用loadfunc pig UDF将protobuf格式文件加载到pig脚本中

    我对猪的了解很少 我有 protobuf 格式的数据文件 我需要将此文件加载到 Pig 脚本中 我需要编写一个 LoadFunc UDF 来加载它 说函数是Protobufloader 我的 PIG 脚本是 A LOAD abc proto
  • 如何使用 PHP 和 JQuery 开发基于 Web 的 XMPP 聊天工具?

    我正在寻求开发一个网站 该网站具有网站访问者和网站管理员之间的聊天功能 我知道最好的方法是使用 XMPP 但我没有使用它的经验 我希望使用 PHP 来实现这一点 我已经下载了 XMPPHP 并编辑了一个示例来向 GMail 中的 Googl
  • 数据库中存储的平均操作时间

    我需要计算存储在数据库中的所有操作的平均时间 我存储操作的表如下所示 creation time operation type operation id 2017 01 03 11 14 25 START 1 2017 01 03 11 1
  • 如何使用 Google Sheets 应用程序脚本将 JSON 中的多个字段仅提取到 Google Sheets 中

    function import inventory test e var options method GET headers Content Type application json Prefer code 200 Prefer dyn
  • Jupyter 笔记本中的方程编号

    事实是 在官方文档中Jupyter 激励示例 http jupyter notebook readthedocs io en latest examples Notebook Typesetting 20Equations html Equ
  • 以编程方式截取屏幕截图时,Cardview 会失去其半径

    我在卡片视图中有约束布局 卡片视图在屏幕上看起来不错 仅当截取屏幕截图时 它才会被渲染为位图 即失去角点 我添加了位图视图的图片 约束布局与圆角重叠 我需要边到边的圆度 下面是正确显示圆角的模拟器的屏幕截图 这是渲染为位图的视图 下面是我的