首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从非UI线程获取触摸坐标的任何方法

从非UI线程获取触摸坐标的任何方法
EN

Stack Overflow用户
提问于 2015-02-21 23:31:04
回答 1查看 74关注 0票数 0

如果我有一个有2个线程的openGL应用程序(不是由我创建的,这些是标准的‘提供’线程)。即:

  • GLRendering螺纹
  • 主/ UI线程

让我们说,在我的渲染线程中,我画了一个像这样的精灵:(显示的方法是我自己的方法)

代码语言:javascript
复制
sprite.draw(); //This will draw the sprite at it's own internal X and Y coordinates

现在,在UI线程上,我捕获当前的手指位置:(以下发生在onTouchEvent(MotionEvent事件)中).

代码语言:javascript
复制
case MotionEvent.ACTION_MOVE: {

    sprite.setX(event.getX());
    sprite.setY(event.setY());

}

所以,我的精灵画在手指允许用户在屏幕上拖动它的地方。

但是,很明显,这两个线程不能保证像这样“交替”运行:

UI线程:捕获手指位置和设置(X:10,Y:10) 渲染线程:在10,10绘制 UI线程:捕获手指位置和设置(X:22,Y:31) 渲染器螺纹绘图在22,31等.

上面的内容很好,但是当发生这种情况时会发生什么:

UI线程:捕获手指位置和设置(X:10,Y:10) 渲染线程:在10,10绘制 Renderer Thread:10,10 <<再次在同一位置绘制,即使手指物理上移动到不同的位置,导致屏幕上物体的屏幕位置和手指在屏幕上的物理位置之间的偏移。 UI线程:捕获手指位置和设置(X:22,Y:31) 渲染器螺纹绘图在22,31等.

这似乎会使物体的绘画“波澜壮阔”。

所以,我要问的是,有没有办法强迫呈现线程在绘制之前以某种方式检索当前向下指针/手指的实际物理位置?或者其他解决问题的方法?(简单地说,问题是呈现线程应该始终访问当前位置,而不是前一个位置)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-22 00:18:16

简单的回答是不!

您所遇到的问题并不是由于两个线程并行运行造成的。相反,这是因为

  • 你的帧率太低了
  • 你的动作如此之快以至于波涛汹涌变得可见。

第一个问题的解决方案是分析你的应用程序并减少延迟时间--尝试达到60 app的名义帧率。

然而,第二个问题的解决办法只是一个小把戏。没有调整sprite的位置以使其精确地成为您的触点,而是使其移动到触点

粗略的实现是这样的:

代码语言:javascript
复制
case MotionEvent.ACTION_MOVE: {

    sprite.setNewX(event.getX());
    sprite.setNewY(event.setY());

}

在您的Sprite类中添加以下内容:

代码语言:javascript
复制
private int mNewX, mNewY;

public void setNewX(int x){
   mNewX = x;
}
public void setNewY(int y){
   mNewY = y;
}

将这两行添加到Sprite类的绘图方法中:

代码语言:javascript
复制
public void draw(){

    this.x = this.x + (int)(0.5 * (this.newX-this.x));
    this.y = this.y + (int)(0.5 * (this.newY-this.y));
// of course, you can get rid of the "this" keywords above. I just put them there for the sake of clarity.

// drawing stuff

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28652665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档