【问题标题】:GridView onTouchGridView onTouch
【发布时间】:2010-05-13 14:32:50
【问题描述】:

我正在尝试设置响应 onTouch 的按钮 GridView。例如,如果我在屏幕上水平、垂直或对角滑动手指,那么我希望选择被触摸的按钮。我尝试为按钮设置 OnTouchListener,但这不起作用,只有拖动事件中的第一个按钮接收到 onTouch 事件。

接下来我尝试为 GridView 创建一个 OnTouchListener,然后使用 X、Y 坐标确定哪些按钮被触摸。这似乎也不起作用,因为如果我在 GridView 的最边缘开始拖动,MOTION_DOWN 事件只会传递给 GridView 的 onTouch()。事实上,如果我在网格上水平拖动手指,除非我在 GridView 的边缘开始拖动,否则根本不会触发 onTouch 事件。有谁知道更好的方法吗?

提前致谢。

gridview.setOnTouchListener(new View.OnTouchListener()
{
 @Override
 public boolean onTouch(@SuppressWarnings("unused") View view, MotionEvent event)
 {
  float X = event.getX();
  float Y = event.getY();

  switch (event.getAction()) { 
  case MotionEvent.ACTION_DOWN:
   System.out.println("Down: " + X + "," + Y);
   break;
  case MotionEvent.ACTION_MOVE:
   System.out.println("Move: " + X + "," + Y);
   break;
  case MotionEvent.ACTION_UP: 
   System.out.println("Up: " + X + "," + Y);
   break; 
  }

  return true;
 }
}

【问题讨论】:

    标签: android


    【解决方案1】:

    如果你有一个适配器实现一个接口来监听你的网格单元上的点击事件,例如:

    public interface OnSaveEditsListener
    {
        public abstract void onSaveEdits();
    }
    
    private OnSaveEditsListener saveEditsListener = null;
    public void setOnSaveEditsListener(OnSaveEditsListener l) {
        saveEditsListener = l;
    }
    

    你应该在你的适配器中实现 getView(..) 方法,特殊的点击监听器:

            holder.gridcell.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    CalendarPosition = position;
                    v.requestFocusFromTouch();
    
                    try{
                        saveEditsListener.onSaveEdits();
                        holder.gridcell.invalidate();
                    }catch(Exception ex){}
    
                }
            });
    

    建议对适配器内的视图元素使用支架。

    最后一部分,从您的 Activity 类中调用:

        adapter.setOnSaveEditsListener(new GridCellAdapter.OnSaveEditsListener() {
    
            @Override
            public void onSaveEdits() {
                /** methods  *//
        });
    }
    

    【讨论】:

      【解决方案2】:

      您可能想尝试使用 GestureDetector 来触发正确的触摸事件。 从那时起,您应该能够确定您做了什么以及具体在哪里。

      GestureDetector 会为您提供几种方法,告诉您您做了什么(SingleTapUp、Fling、Scroll、...)以及在什么位置以及您做了多长时间(例如,如果您滑动,您将获得起始位置、持续时间滑动次数和滑动距离)

      【讨论】:

        【解决方案3】:

        虽然不完整,但可以帮助你

        gridview.setOnTouchListener(new OnTouchListener(){
        @Override
        public boolean onTouch(View v, MotionEvent event) {
        
                    if(event.getAction() == MotionEvent.ACTION_MOVE){
                        gridview.requestFocusFromTouch();
                        gridview.setSelection(gridview.pointToPosition((int)event.getX(),(int)event.getY()));
                        return true;
                    }
                    if(event.getAction() == MotionEvent.ACTION_UP){
                        gridview.clearFocus();
                        return true;
                    }
        
                    return false;
                }
            });
        

        【讨论】:

          【解决方案4】:

          你在正确的轨道上。您只需要使用来自 onTouch 的 X、Y 坐标来使用 gridView 的 pointToPosition 方法获取网格单元的位置。然后,您可以使用位置 (ID) 使用 getChildAt 方法获取单元格中的实际项目。例如,如果您的 gridView 在每个单元格中都有 TextView,则使用此

          int position = gridView.pointToPosition((int) currentXPosition, (int) currentYPosition);
          TextView tv = (TextView) gridView.getChildAt(position);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-06-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多