为什么当光标在的onTouchEvent并不总是被炒鱿鱼吗?(Why OnTouchEvent is

2019-09-28 13:30发布

以前我用OnLongClickListenersetOnClickListener我开发的应用程序。 有时,它是给一些反应问题。 我检查使用Log.d消息( logcat在事件的头)。

根据来自#1一些报道,我决定来模拟一切都只是与onTouchListener事件。

这是我真正的代码。

var otl  = OnTouchListener { v, event ->
  val actual = SystemClock.elapsedRealtime()
  when (event.action) {
    MotionEvent.ACTION_DOWN -> {
      editX = event.x;  editY = event.y
      downClick = atual  // Down touch time 
      vPrev = v.id       // widget in down touch 
      Log.d("myMess", "Down $atual milis")
    } // down
    MotionEvent.ACTION_UP -> {   

      val tag = v.tag as CalcTag      // Se below comments
      val localCheck = tag.name.name == "DISPLAY"  
      var ok =(v.id==vPrev)    // same widget?
          // "Fake" Double click, I'm using just in one situation
      eDoubleClick = (actual - upClick) < doubleClickTime
      upClick = atual   // up touch time
      if (localCheck && ok)  // same 
         ok =  abs(event.x - editX) <=20.0   // "Near" position
               &&  abs(event.x - editX) <=20.0
      if (ok) {    // same widget and position?
        Log.d("myMess", "Up $actual milis: ${event.x} e ${event.y}")
        if ((actual - downClick) > longClickTime)
          clickL(v)  // long click
        else
          clickS(v)  // single click (double click inside!)
      } else
        Log.d("myMess", 
         "Wrong Up $actual milis: ${event.x} e ${event.y}")
     } // up
 //  else-> Log.d("myMess", "Event ${event.action}")
  } // when
  false
} // On Touch

在这里,我为所有的插件的触摸事件。 这只是一个程序。

...
bt.setOnTouchListener(otl)  // bt is related to all widgets 

变量editXeditY (保存位置), downClickupClick (保存倍)电子vPrev (在向下触摸事件以前控件ID)是全局变量。

关于大约在高于评论val tag = v.tag as CalcTagCalcTag是存储在插件的结构tag字段,其中名称字段存储一个enum与小部件的类型。

在这种情况下, DISPLAY的是唯一的插件型(事实上,只有1插件具有这种类型的),其具有大尺寸和触摸的位置是相关的,因为这是将光标定位。

我已经注意到了?

当光标在窗口小部件DISPLAY关闭( isCursorVisible=false ),我widgted点击作品以同样的方式,它与我的老工作OnLongClickListenersetOnClickListener事件。

而且,像以前一样,当我打开光标( isCursorVisible=false )有时,特别是当我点击快,控件不触发事件触摸。

总结有以下几点:

一)我的程序进行这个讨论没有问题的其余部分,因为这个问题是所有包含的自我。
B)我和我的小部件关联的唯一事件是触摸事件。
三)一切我写到这里我从总结logcat触摸事件的头,无需调试,并通过可视化的结果在我的应用程序,这是缺乏响应未检测到触摸时当然。
d)外的唯一事件DOWNUP上触摸发生的是2( MOVE ),这是不相关的我的问题。 他们指的是手指的轻微移动提起它。
E)和关闭光标似乎是我的问题的关键,因为Android系统会自动更新光标位置。
F)我已经停用,相关光标除了自己的光标的所有功能( 禁用的EditText上下文菜单 )

我能做什么?

需要我更换鼠标的光标sofware,要强调光标下的人物? 有什么是我不明白?

我乞求帮助。 我在绝望!

Answer 1:

It's unbelievable. I feel tired. Before, I've returned false because touch event prepared the click event. However, it's not anymore like that. The touch event is the end of the trail. So just to change the last line for true has solved the problem fully.

The complete code becomes:

var otl  = OnTouchListener { v, event ->
  val actual = SystemClock.elapsedRealtime()
  when (event.action) {
    MotionEvent.ACTION_DOWN -> {
      editX = event.x;  editY = event.y
      downClick = atual  // Down touch time 
      vPrev = v.id       // widget in down touch 
      Log.d("myMess", "Down $atual milis")
    } // down
    MotionEvent.ACTION_UP -> {   

      val tag = v.tag as CalcTag      // Se below comments
      val localCheck = tag.name.name == "DISPLAY"  
      var ok =(v.id==vPrev)    // same widget?
          // "Fake" Double click, I'm using just in one situation
      eDoubleClick = (actual - upClick) < doubleClickTime
      upClick = atual   // up touch time
      if (localCheck && ok)  // same 
         ok =  abs(event.x - editX) <=20.0   // "Near" position
               &&  abs(event.x - editX) <=20.0
      if (ok) {    // same widget and position?
        Log.d("myMess", "Up $actual milis: ${event.x} e ${event.y}")
        if ((actual - downClick) > longClickTime)
          clickL(v)  // long click
        else
          clickS(v)  // single click (double click inside!)
      } else
        Log.d("myMess", 
         "Wrong Up $actual milis: ${event.x} e ${event.y}")
     } // up
 //  else-> Log.d("myMess", "Event ${event.action}")
  } // when
  true  // That's all, folks
} // On Touch

The strange thing about this story is that it worked perfectly with false, it was only intermitent when the cursor of one of the widgets was on. I find it very unclear how the error manifests itself. He should lock everything and do nothing and not work almost always!



文章来源: Why OnTouchEvent is not always fired when cursor is on?