【问题标题】:How to get initial X, Y values (of first touch ACTION_DOWN) in OnTouchListener如何在 OnTouchListener 中获取初始 X、Y 值(第一次触摸 ACTION_DOWN)
【发布时间】:2014-02-26 13:56:05
【问题描述】:

我需要初始 xy 值(从第一次触摸开始移动的点 ACTION_DOWN)以便计算 deltaXdeltaY 如下;

private float mInitialTouchX = Float.NaN;          // # First touch temp var defined globally
...
someView.setOnTouchListener(new OnTouchListener() {         
    @Override public boolean onTouch(View v, MotionEvent event) 
    {
        switch (event.getAction()) 
        {
            case MotionEvent.ACTION_MOVE:
                MoveViewHorizontally(v, event.getX(), mInitialTouchX);                      
                break;
            case MotionEvent.ACTION_DOWN:
                mInitialTouchX = event.getX();    // # Set initial touch point
                break;
            case MotionEvent.ACTION_UP:                     
                mInitialTouchX = Float.NaN;       // # Reset initial touch point
                break;
            default: break;
        }
        return false;
    }           
});

private void MoveViewHorizontally(View v, float x, float initialTouchX)
{
    int deltaX = (int)(x - initialTouchX);      

    ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) v.getLayoutParams();     

    layoutParams.leftMargin += deltaX;
    v.setLayoutParams(layoutParams);
}

有没有办法让我从event 或以某种方式获取初始触摸值 - 在其他地方,避免使用全局变量mInitialTouchX

【问题讨论】:

  • 没有。 MotionEvents 或多或少是 /dev/input* 事件的直接接口。这只是一系列彼此无关的事件。
  • 使用私有变量有什么问题?
  • 关闭记录:将它们声明为易失性。 (:
  • @RGraham 没有它的 访问修饰符。我只是想在ListView 的一行内移动/拖动/滑动一些视图,我对顶部的全局变量不太满意,它完全独立于没有关联的行
  • @3yanlis1bos 为什么volatile 在单线程环境中?据我所知,所有这些事件回调都在 UI 线程 中运行

标签: java android touch-event ontouchlistener


【解决方案1】:

不,没有更好的方法。你做对了。事实上,如果你看一下GestureDetector 的代码,你会发现他们的做法或多或少是相同的。

【讨论】:

  • @SaroTaşciyan 我正在使用您的代码 sn-p 谢谢。我面临的一个问题是,当我在视图上滑动并停止滑动但手指不离开视图时,它开始旋转。相反,它应该停止。
猜你喜欢
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多