在Android中绘画时如何遮盖一个简单的区域?

2024-01-13

下面是一个简化的描述:想象一下,我有一个 View 类,它可以绘制一面墙的图片,并且我想在绘制它时切出一个窗口。假设我扩展该 View 类并重写其dispatchDraw() 方法来执行以下操作。首先绘制背景(如果有的话)可以通过窗户看到。接下来我想以某种方式屏蔽矩形窗口区域,然后调用 super.dispatchDraw()。最后我想去掉面具并画一个人站在窗前,这样他们就可以画在背景和墙上。我怎样才能做到这一点?

这是一些看起来接近我需要的代码:

@Override
protected void dispatchDraw(Canvas into) {
    int w = into.getWidth();
    int h = into.getHeight();
    int w3 = w / 3;
    int h3 = h / 3;
    into.drawLine(0, 0, w, h, mPaint);
    Region protect = new Region(w / 3, h / 3, 2 * w / 3, 2 * h / 3);
    into.clipRegion(protect, Op.INTERSECT);
    into.drawColor(Color.MAGENTA); // or super.dispatchDraw() here.
}

这给了我这个:

这与我想要的有点相反。请注意上面代码中名为“protect”的区域。我希望洋红色填充无处不在except在那个地区。具体来说,我想看到的是:

以窗户为例,我应该能够消除限制并以正常方式绘制与窗户和墙壁重叠的人或物体。

编辑:这是 Rajesh CP 答案的简化工作版本。我还在最后的所有内容上添加了一个红色的“前景”条纹,以表明我可以删除限制并添加它们。谢谢拉杰什!

public class MaskTest extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new ClippView(getApplicationContext()));
    }

    private class ClippView extends View {
        private Paint line_paint = new Paint();
        private Paint strip_paint = new Paint();

        public ClippView(Context context) {
            super(context);
            line_paint.setColor(Color.GRAY);
            line_paint.setStrokeWidth(20);
            strip_paint.setColor(Color.RED);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            int w = canvas.getWidth();
            int h = canvas.getHeight();
            int w3 = w / 3;
            int h3 = h / 3;
            // This line represents some unknown background that we are drawing over.
            canvas.drawLine(0, 0, w, h, line_paint);
            // 'protect' represents some area to not paint over until desired.
            Region protect = new Region(w3, h3, 2 * w / 3, 2 * h / 3);
            canvas.clipRegion(protect, Op.DIFFERENCE);
            // Paint magenta over the entire canvas, avoiding the protected region.
            canvas.drawColor(Color.MAGENTA);
            // Remove the protected region.
            Region all = new Region(0, 0, w, h);
            canvas.clipRegion(all, Op.UNION);
            // Draw a wide foreground strip over the entire canvas.
            canvas.drawRect(w / 2 - w / 20, 0, w / 2 + w / 20, h, strip_paint);
        }
    }
}

public class ClippView extends View{
    private Paint paint= new Paint();

    public ClippView(Context context) {
        super(context);
    }


    private Region protect;
    /*
     * (non-Javadoc)
     * @see android.view.View#onDraw(android.graphics.Canvas)
     * @since Apr 12, 2013
     * @author rajeshcp
     */
    @Override
    protected void onDraw(Canvas canvas) { 
        super.onDraw(canvas);
        // view.buildDrawingCache();      


        int w = canvas.getWidth();
        int h = canvas.getHeight();
        int w3 = w / 3;
        int h3 = h / 3;
        canvas.drawLine(0, 0, w, h, paint);
        protect = (protect == null) ? new Region(w3, h3, 2 * w / 3, 2 * h / 3) : protect;
        canvas.clipRegion(protect, Op.DIFFERENCE);
        canvas.drawColor(Color.MAGENTA);


    }

}

Do this I think this is what you want.enter image description here

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

在Android中绘画时如何遮盖一个简单的区域? 的相关文章

  • 将项目升级到Android Studio 1.0(Gradle问题)

    首先 我对 android 开发 android studio gradle 非常陌生 所以如果我问了一个愚蠢的问题 请原谅我 我的团队一直在使用 android studio 的 beta 版本开发一个项目 我刚刚安装了新版本 1 0 并
  • 适用于 IOS 和 Android 的支付网关 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个应用程序 用户必须在澳大利亚餐馆通过应用程序 android ios 付款 有两种付款方式 通过 PayPal 或 Visa
  • Gradle 构建错误:内存不足

    当我使用 gradle 构建时 它失败并显示以下信息 OpenJDK 64 Bit Server VM warning INFO os commit memory 0x0000000788800000 89128960 0 failed e
  • 如何在 ADB 连接期间禁用电池充电?

    问题描述 每次我在电脑和手机之间连接 USB 线时 电池都会自动充电 我想使用 ADB 协议 但我不想在 ADB 连接期间为电池充电 是否可以关闭此充电功能 当然 我该怎么做呢 环境 Android 操作系统 4 及更高版本的手机 我只需要
  • 使用一个 apk 安装两个应用程序

    我有 2 个应用程序 1 内容提供者 2 使用此 ContentProvider 的应用程序 我需要使用单个 apk 文件安装这 2 个应用程序 我想在 Eclipse 中同时推送这两个应用程序 如果我将另一个项目添加到一个应用程序的构建路
  • 让协程等待之前的调用

    我还没有完全掌握 Kotlin 协程 基本上我希望协程在执行之前等待任何先前的调用完成 下面的代码似乎可以工作 但它正在做我认为它正在做的事情吗 private var saveJob Job null fun save saveJob s
  • 从历史堆栈中删除活动

    我的应用程序在用户第一次运行应用程序时显示注册活动 如下所示 活动启动画面 欢迎来到游戏 注册帐户 ActivitySplashScreenSignUp 很好 填写此信息 ActivityGameMain 游戏主屏幕 因此 当用户单击每个屏
  • 导入已经创建的sqlite数据库(xamarin)

    我正在使用 Xamarin 想知道如何导入我已经创建的 sqlite 数据库 到目前为止 我已将其添加到资产文件夹中 但不知道下一步从哪里开始 string localPath Path Combine System Environment
  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • Android Fragment onCreateView 与手势

    我正在尝试在片段中使用手势 我在 FragmentActivity 中有以下内容来处理我的详细信息片段 我试图发生的情况是 当在视图上检测到滑动时 将该视图内的数据替换为上一个或下一个条目 如果有更好的方法来处理这个问题 我完全同意 然而
  • 在选项卡上保存数据

    我有 3 个选项卡 每个选项卡都有一个单独的活动 我想在用户单击任一选项卡上的 保存 时保存数据 有几个选项可供选择 共享首选项 全局变量或将对象保存在上下文中 编辑 我必须保存图像和文本字段 Android 共享首选项 https sta
  • Android:使 Dialog 周围的所有内容都比默认值更暗

    我有一个具有以下样式的自定义对话框 它显示了一个无边框对话框 后面的任何内容都会 稍微 变暗 我的设计师希望背后的一切都比 Android 的默认设置更暗 但不是完全黑色 有这样的设置吗 我能想到的唯一解决方法是使用全屏活动而不是对话框 只
  • Emma 不生成coverage.ec

    我设置了艾玛 它曾经对我有用 然后我们更改了源代码 现在它没有生成coverage ec根本不 它确实生成coverage em 测试临近结束时 出现错误消息 exec INSTRUMENTATION CODE 0 echo Downloa
  • 来自相机的 MediaCodec 视频流方向和颜色错误

    我正在尝试流式传输视频捕获直接从相机适用于 Android 设备 到目前为止 我已经能够从 Android 相机捕获每一帧预览帧 byte data Camera camera 函数 对数据进行编码 然后成功解码数据并显示到表面 我用的是安
  • 适用于 Android 的 Google 云端硬盘\文档 API

    我在几个小时内将 Dropbox 与我的应用程序集成 因为 SDK 描述清晰并且有很好的使用示例 Google Drive 似乎只有一个 一刀切 的 Gdata SDK 它非常重 有很多依赖项 它使我的应用程序的大小增加了三倍 而且不是很直
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • 如何构建自定义摄像机应用程序?

    我正在尝试开发一个自定义摄像机录像机 当我的设备在 Activity 的 beginRecording 中执行 start MediaRecorder 方法时 应用程序崩溃 我不知道出了什么问题 因为我遵循谷歌API指南 http deve
  • 我在 PopupMenu 中使用 ShareActionProvider,但显示两个 PopupMenu?

    我在 PopupMenu 中使用 ShareActionProvider 但是当我单击共享菜单项时 它会在屏幕上显示两个 PopupMenus 一个被另一个覆盖 一个显示应用程序图标和名称 另一个仅显示应用程序名称 除了这个问题之外 它工作
  • 无法使用文件提供程序从内部存储打开 PDF 以便在 Android 8 和 9 上查看

    仅适用于 Android 8 和 9 我这里有一个 PDF 文件管理器 String url file storage emulated 0 Android data com verna poc files Download mypdf p
  • R.java是手动修改的!恢复到生成的版本

    我在布局中添加了一个 xml 文件 之后这个错误就来了 但问题是我还没有接触过 R java 文件 现在 在我的新活动中 我要将其内容视图设置为我新创建的 xml 文件 但是当我执行 R layout 时 新创建的 xml 不会出现在建议中

随机推荐

  • 在 Visual Basic 中寻找权威的 ISO 周计算器(在 Visual Studio Express 2010 中)

    我正在寻找一个明确的标准 即经过认证是正确的或经过相当彻底的测试 用于在 Visual Basic 中计算某个日期的 ISO 周 即在 Visual Studio Express 2010 Visual Basic 项目中运行 不成功 到目
  • adb shell 命令:mkdir(用于创建目录)

    我正在尝试通过 adb shell 创建目录 我必须在 etc 文件夹中创建一个目录 但没有成功 我设法弄清楚它是链接到的 system etc并尝试创建 system etc 但在这两种情况下我都得到 只读文件系统 如何使其可读可写 我尝
  • if语句与if-else语句,哪个更快?

    前几天我和一个朋友争论了这两个片段 哪个更快 为什么 value 5 if condition value 6 and if condition value 6 else value 5 What if value是一个矩阵 注 我知道va
  • 如何在 Objective C 中编写正则表达式(NSRegularExpression)?

    当我在 PHP 中测试这个正则表达式时 它可以工作 但它在 Objective C 中不起作用 www a zA Z0 9 2 63
  • gnome 终端控制键上的 emacs

    I m running emacs on a terminal mode no window system emacs nw I ve few global keys defined in emacs like C C x C C etc
  • Three.js:如何将场景的 2D 快照制作为 JPG 图像?

    我有一个如下所示的 Three js 场景 var scene new THREE Scene var camera new THREE PerspectiveCamera 75 window innerWidth window inner
  • 符号|查看 Flask 教程

    我正在为 Flask 框架编写一个教程 网址为http blog miguelgrinberg com post the flask mega tutorial part iii web forms http blog miguelgrin
  • Android 6.0 权限变更回调

    我想知道当用户在 Android 6 0 上更改应用程序设置中的权限时是否有某种方式可以收到通知 我一直在寻找这个答案 但没有运气 您知道广播接收器和某些特定意图是否可能吗 或者也许有一些黑客可以实现这一目标 根据这个答案 https st
  • 在开发、登台和生产之间同步 Drupal 站点

    通常在 Drupal 6 x 站点启动后 我会让人们开始注册并输入他们自己的内容 每当需要升级时 生产中的数据库都会复制到开发版 然后在开发版上完成开发 然后推送到登台以供客户批准 当网站最终准备上线时 出现了一个问题 生产服务器具有最新的
  • 为什么 ng-scope 添加到我的部分视图的 javascript 内联中并使警报不起作用?

    我正在使用 AngularJs 和模板系统 我想向每个模板添加特定的内联 javascript 脚本 添加与所选选项卡相关的警报框 主页 列表 设置 Html 渲染 但是添加了 ng scope 并且当您更改选项卡时没有任何警报 我在这里提
  • jQuery datepicker altFormat 不显示

    我有一个 jQuery 日期选择器 它根据卖家的语言偏好进行本地化 每个日期选择器自定义都有不同的日期格式 但我希望提交表单时的输入采用特定的格式进行解析 我尝试在日期选择器上使用 altFormat 将其设置为 mm dd yy 但我不希
  • 角度 ui-router 维护选项卡之间的状态

    想知道保留选项卡之间状态的最佳方法 我使用引导选项卡和角度用户界面路由器 我在其中一个选项卡中有一个谷歌地图 并且不想在用户选择该选项卡时重新加载地图 请指教 Thanks 我认为本期讨论了您正在寻找的内容 https github com
  • php mysql asc/desc 顺序

    TABLE timeslot id timeslot times 1 09 00 2 09 30 3 10 00 4 10 30 5 11 00 bookslot id id timeslot date b ref 1 2 2010 02
  • 如何让Android模拟器启动更快

    我目前一直坚持使用 Atom CPU 桌面来开发 Android 应用程序 有哪些方法可以改善其启动时间 运行模拟器时 我可以看到模拟器使用的核心数量只有一个 我从 Eclipse ADT 插件中运行模拟器 如何让模拟器使用两个核心而不是一
  • 只需单击标签即可双击

    我有一个标签 并且单击它时正在运行一些功能 但是 当单击事件发生时 双击事件完成 然后我的函数运行两次 你可以看一个简单的例子here http jsfiddle net vgWGT 2 HTML
  • iOS 7 master有导航栏提示时的细节布局

    我在 iOS 7 中遇到布局问题 要重现 请创建一个简单的主从应用程序并将此行插入MasterViewController m self navigationItem prompt Master 这在DetailViewController
  • 正则表达式允许非 ASCII 和外文字母吗?

    是否可以创建一个正则表达式来允许非ascii字母与拉丁字母一起使用 例如中文或希腊符号 例如允许A汉语AbN汉语 我目前有以下内容 w d w d s 只允许使用拉丁字母 In NET p L d p L d s 相当于你的正则表达式 另外
  • Angular2 5 分钟安装错误 - 未定义需求

    我正在做Angular2 5 分钟快速入门 https angular io docs ts latest quickstart html 现在教程已经进行了大约一半 我已经正确设置了以下文件 索引 html 应用程序组件 ts 应用程序
  • 实现观察者模式时出现的问题:“成员引用基类型 ________ 不是结构或联合”

    我一直在实现一个准系统观察者模式 但遇到了一个有点神秘的错误 成员引用基类型 Observer 不是结构或联合 我认为这与我使用模板有关 但我仍然对模板感到相当不舒服 这是有问题的代码 为了简化事情而删除了大多数 cons 析构函数 主题界
  • 在Android中绘画时如何遮盖一个简单的区域?

    下面是一个简化的描述 想象一下 我有一个 View 类 它可以绘制一面墙的图片 并且我想在绘制它时切出一个窗口 假设我扩展该 View 类并重写其dispatchDraw 方法来执行以下操作 首先绘制背景 如果有的话 可以通过窗户看到 接下