首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么onTouchEvent和onDraw中的MotionEvent.getx()结果不一样?

onTouchEventonDrawMotionEvent.getX() 结果不一样的原因主要在于它们处理触摸事件的时机和上下文不同。

基础概念

  1. onTouchEvent: 这是一个回调方法,当一个触摸事件(如点击、滑动等)发生时,系统会调用这个方法。它通常用于处理用户的触摸输入,并可以返回一个布尔值来指示是否消费了这个事件。
  2. onDraw: 这是另一个回调方法,用于绘制视图的内容。每当视图需要重绘时(例如,因为布局变化、动画或其他原因),系统会调用这个方法。
  3. MotionEvent.getX(): 这个方法返回触摸事件发生时相对于视图左上角的X坐标。

原因分析

  • 坐标系差异onTouchEvent 中获取的坐标是相对于整个屏幕的,而 onDraw 中获取的坐标是相对于当前视图的。如果视图有父视图或者其他变换(如平移、缩放),这些坐标可能会有所不同。
  • 事件传递机制:触摸事件在Android系统中是通过一系列的回调方法传递的。onTouchEvent 是在事件传递链的早期被调用的,而 onDraw 是在视图需要重绘时被调用的。在这两个时间点,触摸事件的坐标可能已经发生了变化。

解决方法

如果你需要在 onDraw 中使用与 onTouchEvent 相同的坐标,可以通过以下方式转换坐标:

代码语言:txt
复制
@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX(); // 获取相对于视图的X坐标
    // 处理触摸事件...
    return true;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // 假设你需要在onDraw中使用onTouchEvent中获取的x坐标
    // 你可以将屏幕坐标转换为视图坐标
    float xInViewCoordinates = getX() + event.getX(); // event.getX()是从onTouchEvent中获取的
    // 使用转换后的坐标进行绘制...
}

应用场景

  • 自定义视图:在开发自定义视图时,可能需要在 onDraw 中使用触摸事件的坐标来精确地绘制图形或响应用户的操作。
  • 动画和交互:在实现复杂的动画或交互效果时,确保坐标的一致性对于提供流畅的用户体验至关重要。

注意事项

  • 确保在 onTouchEvent 中正确处理并消费事件,以避免事件被传递到其他视图。
  • 在转换坐标时,考虑视图的当前状态(如是否被平移或缩放)。

通过理解这些基础概念和机制,你可以更好地处理触摸事件,并在不同的回调方法中准确地使用坐标信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

你知道du和df的统计结果为什么不一样

我们常常使用du和df来获取目录或文件系统已占用空间的情况。但它们的统计结果是不一致的,大多数时候,它们的结果相差不会很大,但有时候它们的统计结果会相差非常大。...[root@xuexi ~]# du -sh / 2>/dev/null 244G / df中"/"的使用空间是1.7G,但是du的结果却是244G。...1.文件存储和删除的底层过程 这里简单说明下文件系统相关的底层机制,首先说明下文件是怎么存储到文件系统中的。假如要存储a.txt到/tmp目录下。 ?...正常情况下,删除文件会立刻释放相关指针,并将imap和bmap中相关的位图标记为未使用。...而df却将该文件大小统计进去了,因为my.iso占用的data block还未被标记为未使用。 再关掉tail进程,然后df再统计空间,结果将和du一样显示为正常的大小。

1.3K21

du 和 df 的统计结果为什么不一样

作者 | 骏马金龙 来源 | https://www.cnblogs.com/f-ck-need-u/p/8659301.html 今天有个人问我du和df的统计结果为什么会不同。...我们常常使用du和df来获取目录或文件系统已占用空间的情况。但它们的统计结果是不一致的,大多数时候,它们的结果相差不会很大,但有时候它们的统计结果会相差非常大。...1.文件存储和删除的底层过程 这里简单说明下文件系统相关的底层机制 首先说明下文件是怎么存储到文件系统中的。假如要存储a.txt到/tmp目录下。...4.df会统计已删除但却仍有进程引用的文件。 正常情况下,删除文件会立刻释放相关指针,并将imap和bmap中相关的位图标记为未使用。...而df却将该文件大小统计进去了,因为my.iso占用的data block还未被标记为未使用。 再关掉tail进程,然后df再统计空间,结果将和du一样显示为正常的大小。

64210
  • 【踩坑】PyCharm和Terminal中模型卷积的输出结果不一样

    也就是除了pycharm和terminal,其他所有的条件都是一样的。但是发现,在Pycharm中直接点运行,和在terminal中通过python xxx运行,两者的模型的输出结果竟然有差异。...如果在推理之前强制把输入数据明确指定为float32或者float64,那pycharm和terminal的输出就都一样了。...猜测可能pycharm中pytorch默认读取数据是float32,terminal中默认是float64。也可能是其他原因导致的实际读取精度不一样,比如模型训练时候保存的权重就有精度问题?...3、检查下输入数据和模型的精度。...但是发现改为float()时,pycharm运行能变,而terminal的没变(即还是double时候的结果)。暂不清楚为何terminal的改不了float。

    17500

    特殊案例,为什么a, b = b, a结果跟你想的不一样?

    这个特性,也是很多人介绍Python比其它语言优越的一个案例。 但实际上,这种交换变量的方式,在某些特殊情况下,它的行为可能跟你想要的不一样。我们来看一个案例。...在一些in-place排序算法中,我们会交换一个列表中两个索引对应的内容,例如: ? 这看起来没有什么问题。...你肯定觉得显然是成立的,因为a[1]的值是2,a[1] + 1的值是3,所以上面这段代码看起来相当于把列表下标为1和下标为3的两个数字交换顺序。也就是把元素2和元素3交换顺序。...代码运行结果跟修改之前竟然不一样。 之所以会出现这种情况,是因为这种交换两个值的方式,虽然只有一行代码,但是 Python 在执行的时候,其实是分成两步来走的。...所以最终的结果就变成了[0, 3, 1, 3, 2, 6]。

    40140

    Android自定义View中的onMeasure、onLayout和onDraw方法解析

    在Android开发中,我们经常需要自定义View来实现特定的界面效果。要实现一个自定义View,我们需要了解并掌握onLayout、onMeasure和onDraw这三个关键方法。...在自定义ViewGroup中,我们需要重写这个方法,根据子View的测量宽高来确定它们的位置。 1.3 onDraw(Canvas canvas) onDraw方法用于绘制View的内容。...方法 在CircleView类中,重写onDraw方法,使用Canvas绘制圆形和边框。...在布局文件中使用这个自定义View,就可以看到一个带有边框的蓝色圆形。 通过这个案例,我们可以看到,onMeasure、onLayout和onDraw这三个方法在自定义View中的重要作用。...四、总结 通过本文的介绍,我们了解了onLayout、onMeasure和onDraw这三个方法在自定义View和自定义ViewGroup中的作用和用法。

    29910

    常用的自定义控件四(QuickBarView)

    ---- 在Android日常开发中,我们经常在联系人界面看到一些字母导航栏,点击字母的时候,会根据汉字的首拼音来查找是否存在相应的item,这种效果很常见,几乎所有涉及到通讯的都会用到,包括qq,...,有人可能会问了为什么不在onMeasure里面获取了,其实在onMeasure方法里面获取是可以的,只不过我们还需要调用一下measure方法而已,在onSizeChnage方法里面,我们直接调用...cellWidth = getMeasuredWidth(); 即可获取到我们需要的宽度和高度。...接着我们重写onDraw方法,在onDraw方法我们所做的工作就是绘制 我们需要的26个字母 protected void onDraw(Canvas canvas) { for...item的首字母是不是跟当前的首字母是不是一样的,不一样的话,显示当前item的字母,不过要注意一点,就是position等于0的时候,我们需要做特殊处理,代码如下 String str = null;

    41210

    Android查缺补漏(View篇)--自定义 View 的基本流程

    和 DecorView 建立关联,而 DecorView 就是一个 Activity 的顶级 View,在一个默认的主题中,它分为标题栏,和内容区域,我们所添加的 View 均是添加到了 DecorView...layout:对应 onLayout() 方法,确定view的四个顶点,即确定View在父容器中的位置。 draw:对应 onDraw(),绘制View。...(100, 100, 100, mPaint); } } 运行结果就是一个红色的实心圆,在这个示例中为了使得布局文件中的 wrap_content 正常生效,重写了 onMeasure() 方法...可见,在 onDraw() 方法对padding处理之后,在布局文件中无论怎么设置padding,都能保证圆心在可用区域的中心。...(速度追踪)等等,用起来也都很方便,其实只要你愿意,这些事件也完全可以在 onTouchEvent() 方法中实现,接下来在为上述的圆形 Demo 添加一个缩放的功能,也就是使用 ScaleGestureDetector

    858100

    plink计算的PCA为什么和GCTA计算的不一样?

    今天度过了求知的一天,求知的快乐就是这么朴实无华且枯燥。 今天同事问了我一个问题,为什么plink计算的pca和GCTA计算得不一样?然后就引出的今天的查看说明文档,也证明了世界上就怕认真二字。...我们的发现: 1,GCTA的说明文档中,有bug,公式没有写全: 第一个公式还要除以N。给出的2010 NG上有写,但是软件的说明文档中不完整。...yang的方法 所以,如果如果plink的PCA和GCTA的VanRaden方法相遇时,结果就不一致了。...手动证明(自己编写代码验证) 使用R包的函数证明 有一个包叫AGHmatrix包,里面有个Gmatrix,它构建矩阵时可以选择构建的方法: 结果证明了两者确实不一样。...推荐用Yang的方法构建G矩阵,得到的PCA结果。也就是plink的--pca的结果,同样也是gcta默认的计算PCA的参数,--make-grm-alg 0。 8,为什么要用GCTA计算PCA?

    1.1K20

    Android 自定义 View 独家技巧

    在构造方法中,我们可以完成一些初始化的工作,比如设置画笔颜色、初始化属性等。...初始化工作 } 步骤三:实现onDraw方法 onDraw方法是自定义View中最重要的方法之一。在这个方法中,我们可以使用画笔绘制自己想要的图形。...绘制图形 } 在实现onDraw方法时,我们可以使用以下技巧: 使用局部变量:在onDraw方法中创建对象和变量会增加内存分配和垃圾回收的负担。因此,在onDraw方法中使用局部变量可以提高性能。...使用Scroller:Scroller可以帮助我们实现平滑的滚动效果,比如ListView和ScrollView中的滚动效果。...在测量阶段,我们需要测量自定义View的大小;在布局阶段,我们需要根据测量结果来确定自定义View的位置。

    29320

    sql查询结果和预想的不一样?多半是null在作怪

    不知道兄弟们是否有同感 在写查询语句的时候我们通常不会刻意去考虑表中的”null“值 但有些时候对比查询结果和数据库又发现跟预想的不一样!...如果迟迟找不到原因那很有可能是"null"值搞的鬼 下面就让我们来一探究竟 注:以下情况针对于MYSQL数据库 01null导致sum函数返回null而不是0 如果sum函数指定的字段在数据库中全部为null...我们的表中是存在一条数据的,所以正常的返回结果应该是1, 但由于mark为null,所以就被遗漏了,返回了0。...修改之后的SQL: SELECT COUNT(*) FROM test 返回了期望的查询结果: 03判断null要用"is null",而非"= null" 如果我们的查询条件中涉及null判断,使用...这是显然不正确的,所以我们应该用”is null“这种写法 修改之后的SQL: SELECT * FROM test WHERE mark is null 返回了期望的查询结果: - THE END

    1.2K20

    Android字体渐变效果

    答:因为文字坐标系和屏幕坐标系不一样,文字坐标系是从BaseLine线开始计算的。 先来回顾一下屏幕的坐标系: 图片 再来看看文字的坐标系。...图片 (图片来自于网络) 再来思考一下文字是为什么不显示的: 图片 虚线为BaseLine 如果此时我把字体放大到100,看一看我能不能看到文字。...()和restore()方法可以理解为将当前绘制的东西当作一个新的图层!...从左到右渐变文字 众所周知,在android中是不能够将文字绘制一般的。...先来看看没有优化的效果: 图片 可以看到,在绘制的过程中,因为是两层,那么就绘制了2次。 优化思路 当黑色[上层]从左到右滑动的时候,红色[下层]跟随着从左到右裁剪。

    1.2K10

    ▲ Android 动画望远镜效果

    写字板效果之后,实现望远镜效果,效果如下 【实现】 新建一张空白的位图,这张位图的大小与控件的大小一样,然后对背景图进行拉伸,画在这张空白的为图上。...在mDx mDy 都不是-1的时候,按下手指或者移动手指。将新建的mBitmapBG作为BitmapShader 设置给Paint,然后在手指所在的位置画圈,并把圈内的图片显示出来。...方法 @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction...(event); } 实现onDraw @Override protected void onDraw(Canvas canvas) { super.onDraw(...之所以在onDraw()方法中创建,mbitmapBG,而不在初始化代码中创建,是因为在初始化时,getWidth(),和getHeigh() 是获取不到值的。

    33120

    从0开始学自定义View -1

    在这张图中坐标系和我们数学中的不一样,这里的Y轴下方是正数,X轴右方是正数,其中的View(浅蓝色背景)为我们自定义的View,MotionEvent是手指点击的位置,我们对View进行移动,也是根据MotionEvent...中 get 和 getRaw 的区别 event.getX(); //触摸点相对于其所在组件坐标系的坐标 event.getY(); event.getRawX(); //触摸点相对于屏幕默认坐标系的坐标...结果是使用此画笔绘制绘制 src 将与使用默认画笔绘制绘制 dst 相同(至少从几何角度来说是这样的)。 ?...上面canvas.drawCircle(100, 100, 50, paint)和paint的创建  都是写在onDraw方法里的。...那么我们怎么去监听他的,有方法,那就是onTouchEvent,触摸方法的事件分发机制我们下节讲。

    92730

    2014-10-27Android学习------布局处理(七)------26个字母的布局列表的监听事件处理-----城市列表应用程序

    super.onTouchEvent(event); } 手机屏幕事件的处理方法onTouchEvent。...的getAction()方法来获取Touch事件的类型,包括 ACTION_DOWN(按下触摸屏), ACTION_MOVE(按下触摸屏后移动受力点), ACTION_UP(松开触摸屏)和ACTION_CANCEL...借助对于用户不同操作的判断,结合getRawX()、 getRawY()、getX()和getY()等方法来获取坐标后,我们可以实现诸如拖动某一个按钮,拖动滚动条,显示触摸的内容等等功能。...= null) {//如果当前按下的位置的字母和上一步状态选择的字母不同,并且当前的监听事件处于活跃状态 if (c > 0 && c < b.length) {//索引值合法 listener.onTouchingLetterChanged...从这个输出logcat里面我们可以看到:activity可以去调用dispatchTouchEvent()函数,而且监听事件中是这个函数第一个执行,然后获取监听事件的类型,接下来就去调用onTouchEvent

    48530
    领券