绘制矩形并填充外部边界

2023-11-29

我正在绘制一个矩形,并在矩形外部填充。我尝试了其中一些。但无法得到我所期望的完美的。

这正是我所期望的。

Viewfinder

我试过

    Point pTopLeft = new Point();
    Point pBotRight = new Point();
    pTopLeft.x = 100;
    pTopLeft.y = 100;
    pBotRight.x = canvas.getWidth() - 100;
    pBotRight.y = canvas.getHeight() - 100;
    Rect above = new Rect(0, 0, canvas.getWidth(), pTopLeft.y);
    paint.setColor(Color.parseColor("#77000000"));
    canvas.drawRect(above, paint);
    Rect left = new Rect(0, pTopLeft.y, pTopLeft.x, pBotRight.y);
    paint.setColor(Color.parseColor("#77000000"));

    canvas.drawRect(left, paint);
    Rect right = new Rect(pBotRight.x, pTopLeft.y, canvas.getWidth(),
            pBotRight.y);
    paint.setColor(Color.parseColor("#77000000"));
    canvas.drawRect(right, paint);
    Rect bottom = new Rect(0, pBotRight.y, canvas.getWidth(),
            canvas.getHeight());

    paint.setColor(Color.parseColor("#77000000"));
    Paint paint_text = new Paint();
    paint_text.setColor(Color.WHITE);
    paint_text.setTextSize(50);
    paint_text.setTextAlign(Align.CENTER);

    canvas.drawText("Position Card in this Frame", canvas.getWidth() / 2,
            canvas.getHeight() - 30, paint_text);
    canvas.drawRect(bottom, paint);

并得到这样的

enter image description here

但我想绘制矩形并填充边界之外以实现圆角边框。我该怎么做?

EDIT当我尝试一对一绘制矩形时。布局是这样的..

enter image description here

我不能给予Color.TRANSPARENT对于完全透明第二个矩形的中心矩形..


我仍然不完全确定你想要完成什么。您显示的形状可以绘制如下:

// set up some constants
int w = canvas.getWidth();
int h = canvas.getHeight();
RectF rect = new RectF(100, 100, w - 100, h - 100);
float radius = 10.0f; // should be retrieved from resources and defined as dp
float borderWidth = 2.0f; // ditto
int innerRectFillColor = 0x33000000; // or whatever shade it should be

// first fill the interior
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(innerRectFillColor);
paint.setStyle(Paint.Style.FILL);
canvas.drawRoundRect(rect, radius, radius, paint);
// then draw the border
paint.setColor(Color.WHITE);
paint.setStrokeWidth(borderWidth);
paint.setStyle(Paint.Style.STROKE);
canvas.drawRoundRect(rect, radius, radius, paint);

相反,如果您想在孔周围绘制(以便背景显示出来),则绘制周围矩形的技巧将不起作用,因为圆角(边框也使其变得更加复杂)。相反,您可以创建一个单独的Bitmap有一个透明的孔,然后绘制它。您需要使用 Porter-Duff 传输模式CLEAR在位图中打孔:

// same constants as above except innerRectFillColor is not used. Instead:
int outerFillColor = 0x77000000;

// first create an off-screen bitmap and its canvas
Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas auxCanvas = new Canvas(bitmap);

// then fill the bitmap with the desired outside color
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(outerFillColor);
paint.setStyle(Paint.Style.FILL);
auxCanvas.drawPaint(paint);

// then punch a transparent hole in the shape of the rect
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
auxCanvas.drawRoundRect(rect, radius, radius, paint);

// then draw the white rect border (being sure to get rid of the xfer mode!)
paint.setXfermode(null);
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.STROKE);
auxCanvas.drawRoundRect(rect, radius, radius, paint);

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

绘制矩形并填充外部边界 的相关文章

随机推荐

  • Java 线程中的“阻塞计数”和“等待计数”是什么意思?

    我使用 JConsole 来观看线程 它显示 name Thread 6 state BLOCKED sun misc Launcher AppClassLoader 19821f owner Thread 3 blocked Count
  • 由于“拒绝连接”,我无法使用 MySQL

    我正在尝试在 Windows XP 上运行 MySQL 的免安装版本 位于C mysql 在我的机器上 当我尝试连接到 MySQL 时 我在 PHP 文件中收到错误消息 无法连接 无法连接 因为目标机器主动拒绝 我已经编辑了配置文件my i
  • 未定义的属性: Illuminate\Database\Eloquent\Collection:: Laravel 5.2

    我试图让物联网显示订单中的商品 但我不断收到此错误 这些是我的模型 class westcoorder extends Model protected table westcoorders protected with westcoorde
  • 如何将线程函数的地址作为回调传递给winapi?

    我有一个简单的线程 在执行过程中我尝试使用线程中定义的函数之一的地址调用 EnumWindows 所以我试图这样做 EnumWindows cbEnumWindowsClickOK 0 其中 cbEnumWindowsClickOK 是在线
  • iOS 如何重新启动应用程序以更改语言 Swift 4

    我使用多语言应用程序 我想在配置文件用户中手动更改语言 我已经有 Localization string 如果我更改设备语言 应用程序中的语言将更改为 但我想从用户配置文件示例中手动更改语言 为此 我使用下一个代码 private func
  • 函数返回不可变引用,但借用检查器认为不然

    在这里 我将一些可变引用传递到函数中以对这些引用执行某些操作 然后 我通过将这些可变引用转变为不可变引用来删除它们 然而 Rust 借用检查器似乎仍然认为它们是可变的 这是代码 src lib rs fn append 1 to all s
  • XNA 中非常简单的菜单 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我和其他一些人正在创建一个游戏 我想添加一个非常简单的菜单 只有 开始 和 退出游戏 现在我已经下载了游戏状态管理示例 但这是一个非常长且复杂的代码
  • Py2exe ImportError:没有名为 shell 的模块

    我的代码是 from win32com shell import shellcon from win32com shell shell import ShellExecuteEx 它在 IDLE 中工作正常 但在我生成 exe 后出现错误
  • pip 配置了需要 TLS/SSL 的位置,但是 Python 中的 ssl 模块不可用

    我正在使用Python 3 6 当我尝试使用安装 模块 时pip3 我面临这个问题 pip is configured with locations that require TLS SSL however the ssl module i
  • 如何制作动画信使

    我想创建一个信使组件 当调用该函数时 它将创建一条消息 并且在按下或通过计时器时 首先使其透明 gt 之后 平滑地降低包装器的高度 gt 并且过渡结束后 删除对象 我怎样才能做到这一点 我的代码无法正常工作
  • Rest WebService 错误处理

    我使用 RestWebservice 进行一些基本操作 例如创建 搜索 请求 xml 看起来像这样
  • 矩阵中的最小成本路径

    问题 给定一个充满非负数的 m x n 网格 找到一条从左上角到右下角的路径 该路径最小化沿其路径的所有数字的总和 注意 在任何时间点您只能向下或向右移动 我知道这是一个常见问题 大多数人都知道这个问题及其动态规划 我在这里尝试递归代码 但
  • CSS 在移动浏览器中不起作用

    http mpkosis28 com 28cup 从笔记本电脑或台式机上查看时 该网站看起来很完美 但是当我尝试通过手机访问它时 它无法识别网站中的 css 文件 只加载 html 部分 阅读其他类似的问题 但他们似乎没有和我遇到同样的问题
  • Java String 上哈希码溢出的后果

    我最近在这里阅读了一些有关 Java String 类的哈希码的信息 但我一直无法找到此信息 当字符串的长度高于 32 时会发生什么 我知道会发生溢出 但作为哈希键 会发生什么 例如 我需要对长度在 20 到 120 个字符之间的字符串进行
  • .htaccess 中的 CodeIgniter 查询字符串重写

    当我第一次启动我的网站时 URL 采用以下格式 project php projectID 1 pageID 2 几年前 我修改了 htaccess 以重写它们以使用段 如下所示 project 1 2 我更新了所有内部链接以使用分段格式
  • 删除 Vuetify 中默认的 v-input-file 图标

    v file input是 Vuetify v2 中出现的新组件
  • 以编程方式切换键盘配置文件

    有什么方法可以让我们以编程方式切换已安装的键盘 无需手动进入设置部分 我的要求是向用户展示手机上安装的所有键盘 并获得一个选择器对话框以切换到想要的键盘 基本上我们想减少把他转移到设置页面的步骤 这段代码将满足您的要求 InputMetho
  • 为什么 Heroku 的 heroku-18 堆栈仅与 Puma 版本 3.7.x 兼容?

    通过反复试验 我确定从 Heroku 升级heroku 16堆叠到heroku 18stack 需要我在 Rails 应用程序中更新 Puma 下面是为 puma gem 构建本机扩展的失败 您能解释一下为什么 v3 7 之前的 puma
  • 将 tar/gzip 添加到 Windows 命令行

    正如标题所说 有人知道将 tar gzip 添加到 Windows 命令行的方法吗 我已经安装了 Cygwin 但不知道是否必须在 PATH 环境变量中添加一些内容才能将 tar 作为 cmd 选项 我用来解决这个问题的方法是安装 Cygw
  • 绘制矩形并填充外部边界

    我正在绘制一个矩形 并在矩形外部填充 我尝试了其中一些 但无法得到我所期望的完美的 这正是我所期望的 我试过 Point pTopLeft new Point Point pBotRight new Point pTopLeft x 100