绘制到画布 onDraw 有效,绘制 onTouchEvent 无效

2023-12-14

我在 Android SDK 中摆弄 2D 图形,但在一个简单的示例中遇到了麻烦。

我假设我只是误解了一些基本的/基本的东西。

public class DrawView extends View {
    Paint paint = new Paint();
    Canvas canvas = new Canvas();

    public DrawView(Context context) {
        super(context);
        paint.setColor(Color.BLACK);
    }

    @Override
    public void onDraw(Canvas canvas) {
        this.canvas = canvas;
        this.canvas.drawLine(0,0, 500, 500, paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d("DrawView", "onTouchEvent: " + event.getX() + "," + event.getY() );

        canvas.drawLine(0,500, 500, 0, paint);

        return true;
    }
}

上面的代码从0,0 to 500,500当应用程序启动时。这些部件工作得很好。

问题是第二条线没有在触摸事件上绘制。这onTouchEvent肯定会被调用,因为我在日志中看到坐标调试消息。

有人能指出我做错了什么愚蠢的事情吗?


您应该在 onTouchEvent() 末尾调用 invalidate() 来告诉系统更新屏幕。调用invalidate()将会调用onDraw()。

另外,根本上错误的是您在这个类中创建了一个画布。这对你绝对没有任何作用。要绘制的画布是从 onDraw() 方法获取的画布。 onTouchevent 中对 canvas.drawLine() 的调用不会为您做任何事情,也不应该在那里。这是一张空画布,不是要“张贴”的画布。

在 onTouchEvent() 中,您应该只收集触摸事件数据,如果需要的话还可以对其进行一些处理。您不应该在那里调用任何绘图方法。然而,正如我所说,如果你想从 onTouchEvent() 触发绘制,你可以调用 invalidate()。如果您想根据触摸位置绘制线条,则需要创建 X 和 Y 坐标的类变量。您在 onTouchEvent() 中更新这些 X 和 Y 变量,然后在 onDraw() 中使用它们根据这些 X 和 y 变量绘制您需要的任何内容。

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

绘制到画布 onDraw 有效,绘制 onTouchEvent 无效 的相关文章

随机推荐

  • Drools 6.0 在运行时动态加载规则

    我想在运行时加载 drl 文件 我发现的帖子包括这个one适用于 5 0 版本 但我不知道如何为 drools 6 0 版本执行此操作 在 Drools 6 中 您的规则包被部署到 Maven 提供了 KieScanner 您可以将其附加到
  • 为什么我在正则表达式中找不到这个字符串?

    lines total check 0 with pdfplumber open file as pdf pages pdf pages for page in pdf pages text page extract text for li
  • 更改、翻译日期格式

    我的代码中有一个简单的问题 我有一个函数 可以将日期传递为意大利语格式 并且我想将格式更改为英语 我已经尝试过这个 public function changeDateFormat date start old date start old
  • Pandas 根据条件组合连续行

    我的问题与此类似 但答案似乎并不完全有效 根据条件合并行 pandas 数据框 给定以下 pandas 数据框 SECTION TEXT NUMBER OF WORDS ONE lots of text 55 ONE word1 1
  • 使用发布库时,OpenCV imread(filename) 在调试模式下失败

    我有一些C 代码并且一切正常OpenCV除了函数imread file 它正确地找到了文件并加载了名称 但没有加载任何数据 Mat pattImage imread fileName 0 经过在网上的一些研究后 我意识到我处于调试模式 但随
  • Java - 跳过for循环中的值

    我正在尝试使用 for 循环跳过值 就像是 for int i 32 i lt 255 but skip 128 to 159 i char ascii char i System out println ascii 有什么建议么 谢谢 在
  • pandas concat('outer') 不做联合?

    它看起来pandas concat正在执行 左外 连接 而不仅仅是联合索引 对我来说似乎是一个错误 但也许我错过了一些明显的东西 import pandas import pandas util testing as put ts1 put
  • PHP 中的多维数组大小限制

    我正在开发一个函数 最终会向数组添加大量维度 我想知道是否有可能达到可以添加的维度的限制 如果是这样 PHP 中的限制是什么 不 我不认为访问深度有限制 除了你有多少内存 不过 每一层都至少添加一个指针间接 因此随着层数的加深 检索元素的速
  • stdClass 类的对象无法转换为字符串

    我不知道为什么 但我收到此错误 可捕获的致命错误 类 stdClass 的对象无法转换为字符串 对于这段代码 sql SELECT FROM player ORDER BY score DESC LIMIT begin arr array
  • InvalidOperationException - 对象当前正在其他地方使用

    我已经经历过这个问题但这没有帮助 这里的情况有所不同 我正在使用后台工作者 第一个后台工作者开始对用户的图像输入进行操作 并在firstbackgroundworker runworkercompleted 内部进行操作 我正在调用另外3个
  • 如何在区域地图上赋予不透明度

    我遇到了 html 不透明度问题 目前我已经使用 css 应用了不透明度 但它不起作用 我的 html 和 css 代码如下 area class transbox href test1 htm target blank area opac
  • Swift 索引 0 超出表视图中空数组的范围

    我正在尝试使用 PFTableViewCell 连接到主电视控制器的 2 个标签进行解析来填充 tableview 当我添加 TableView 的节数 numberOfRowsInSection 时 应用程序崩溃 但是当我删除它时 它可以
  • MVC3中相同类型实体之间的多对多关系

    我有一个 ASP NET MVC3 应用程序 其中使用 Entity Framework 4 3 Code First 和迁移 我一直在尝试在相同类型的实体之间创建多对多关系 但是当我使用迁移搭建迁移支架时 它会生成一对一关系 这个想法是一
  • 为什么 ColumnTransformer 中的 SimpleImputer 创建额外的列?

    我正在关注 Aurelion Geron 的机器学习书籍 我正在尝试ColumnTransformer班级 当我包括SimplerImputer 创建了一个附加列 我明白那个SimplerImputer用于填充列中缺失的值total bed
  • 使用 Ajax 动态显示数据

    在此代码中 单击 like 按钮后 数据已添加到数据库中 我现在想做的是添加数据后 我将查询所选项目的总赞数并在不加载页面的情况下显示它 这是我现在的代码 我的看法 p i class fa fa thumbs up i span span
  • 调用存储过程,当过程名称在mysql的变量中时

    我有 mysql 存储过程 我想在变量中调用它和过程名称 我使用了准备好的语句 但它给了我一个错误 我不是 mysql 专家 这是准备好的声明 gt PREPARE stmt1 FROM CALL SET q sys search SET
  • 如何避免在Windows上使用Git Bash时每次都需要输入解密私钥的密码?

    我有一个自动构建服务 可以从 git 私人存储库下载 问题是 当它尝试克隆存储库时 它需要提供密码 因为它不被记住 因此 由于没有人为交互 它会永远等待密码 我如何强制它记住 id rsa pub 对于 Windows 用户 请注意 这是我
  • 获取当前目录下所有子目录的列表

    有没有办法在Python中返回当前目录中所有子目录的列表 我知道您可以使用文件来执行此操作 但我需要获取目录列表 您的意思是直接子目录 还是树下的每个目录 无论哪种方式 你都可以使用os walk去做这个 os walk directory
  • 强制应用程序在启动时启动

    我正在为我的孩子们创建一个类似信息亭的环境 我的应用程序扫描并杀死了很多游戏进程 因为它们无法玩 M 或以上评级的游戏 因为它们还很年轻 禁用任务管理器 因为它们不需要或不使用它 但我需要一种可以运行该应用程序一次的方法 并且它会复制 添加
  • 绘制到画布 onDraw 有效,绘制 onTouchEvent 无效

    我在 Android SDK 中摆弄 2D 图形 但在一个简单的示例中遇到了麻烦 我假设我只是误解了一些基本的 基本的东西 public class DrawView extends View Paint paint new Paint C