【问题标题】:Differentiate Single click and double click of a imageView in android区分android中imageView的单击和双击
【发布时间】:2018-10-05 13:23:11
【问题描述】:

我尝试了以下代码来区分单击和双击。单击一下就可以了。当我双击图像视图时,单击和双击部分内的代码都会执行。

private static final long DOUBLE_PRESS_INTERVAL = 250; // in millis
    private long lastPressTime;
    boolean mHasDoubleClicked;

img_feat_orgn_item.setOnClickListener(new OnClickListener() {
 @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    findDoubleClick();
    }
    });

private boolean findDoubleClick() {
        // Get current time in nano seconds.
    long pressTime = System.currentTimeMillis();
        // If double click...
        if (pressTime - lastPressTime <= DOUBLE_PRESS_INTERVAL) {
            mHasDoubleClicked = true;           
            startActivity(new Intent(
                    Wv_HomePage.this,
                    NewDonation.class));
            // double click event....
        } else { // If not double click....
            mHasDoubleClicked = false;
            Handler myHandler = new Handler() {
                public void handleMessage(Message m) {
                    boolean mHasDoubleClicked = false;
                    if (!mHasDoubleClicked) {
                        // single click event
                        feature_class_val = listData_Feature_Organization
                                .get(j);
                        Intent intent = new Intent(
                                Wv_HomePage.this,
                                OrganizationDetails.class);
                        Bundle b = new Bundle();
                        b.putString("orgn_name",
                                feature_class_val.name);
                        intent.putExtras(b);
                        startActivity(intent);

                    }
                }
            };
            Message m = new Message();
            myHandler.sendMessageDelayed(m, DOUBLE_PRESS_INTERVAL);
        }
        lastPressTime = pressTime;
        return mHasDoubleClicked;
    }

【问题讨论】:

    标签: android onclick


    【解决方案1】:

    按照惯例,Android 应用没有双击功能。

    也许您更愿意使用onLongClick

    不过,如果你真的想双击查看GestureDetector.OnDoubleTapListener

    【讨论】:

      【解决方案2】:

      只需稍作改动,我的代码就可以正常工作。我将 mHasDoubleClicked 布尔值放置在处理程序中,这很麻烦。下面的代码有效。

      img_feat_orgn_item.setOnClickListener(new OnClickListener() {
           @Override
              public void onClick(View v) {
              // TODO Auto-generated method stub
              findDoubleClick();
          if (mHasDoubleClicked) {
                              Log.v("double click","double click");
          startActivity(new Intent(
                              Wv_HomePage.this,
                              NewDonation.class));
                          }
              }
              });
      
          private boolean findDoubleClick() {
                  // Get current time in nano seconds.
              long pressTime = System.currentTimeMillis();
                  // If double click...
                  if (pressTime - lastPressTime <= DOUBLE_PRESS_INTERVAL) {
                      mHasDoubleClicked = true;           
      
                      // double click event....
                  } else { // If not double click....
                      mHasDoubleClicked = false;
                      Handler myHandler = new Handler() {
                          public void handleMessage(Message m) {
      
                              if (!mHasDoubleClicked) {
                                  // single click event
                                  feature_class_val = listData_Feature_Organization
                                          .get(j);
                                  Intent intent = new Intent(
                                          Wv_HomePage.this,
                                          OrganizationDetails.class);
                                  Bundle b = new Bundle();
                                  b.putString("orgn_name",
                                          feature_class_val.name);
                                  intent.putExtras(b);
                                  startActivity(intent);
      
                              }
                          }
                      };
                      Message m = new Message();
                      myHandler.sendMessageDelayed(m, DOUBLE_PRESS_INTERVAL);
                  }
                  lastPressTime = pressTime;
                  return mHasDoubleClicked;
              }
      

      【讨论】:

        【解决方案3】:

        这是我的代码,它似乎有效。

        import android.content.Context;
        import android.util.AttributeSet;
        import android.view.GestureDetector;
        import android.view.MotionEvent;
        import android.widget.ImageView;
        
        public class MultiTapImageView extends ImageView{
        
            private GestureDetector gestureDetector;
            private MultiTapImageViewListener mListener;
        
            public interface MultiTapImageViewListener {
        
                void onDoubleTap();
                void onSingleTap();
        
            }
        
            public MultiTapImageView(Context context, AttributeSet attrs) {
                super(context, attrs);
                gestureDetector = new GestureDetector(context, new GestureListener());
        
            }
        
            public void setDoubleTapListener(MultiTapImageViewListener listener){
                mListener = listener;
            }
        
        
            @Override
            public boolean onTouchEvent(MotionEvent e) {
                return gestureDetector.onTouchEvent(e);
            }
        
        
            private class GestureListener extends GestureDetector.SimpleOnGestureListener {
        
        
                @Override
                public boolean onDown(MotionEvent e) {
                    return true;
                }
                // event when double tap occurs
                @Override
                public boolean onDoubleTap(MotionEvent e) {
                    float x = e.getX();
                    float y = e.getY();
        
                    if(mListener != null){
                        mListener.onDoubleTap();
                    }
        
                    return true;
                }
        
        
                @Override
                public boolean onSingleTapConfirmed(MotionEvent e) {
                    if(mListener != null){
                        mListener.onSingleTap();
                    }
        
                    return true;
                }
            }
        }
        

        【讨论】:

          【解决方案4】:

          试试这个。

             btn.setOnClickListener(new View.OnClickListener() {
          
                  volatile int i = 0;
          
                  @Override
                  public void onClick(View v) {
          
                      i++;
                      Handler handler = new Handler();
          
                      Runnable r = new Runnable() {
                          @Override
                          public void run() {
                              if (i == 1) {
                                  //single click logic
                              }
                          }
                      };
          
                      if (i == 1) {
                          handler.postDelayed(r, 150);
                      } else if (i == 2) {
                          handler.removeCallbacks(r);
                          i = 0;
                          //Double click logic
                      }
                  }
              }
              );
          

          或者您可以从以下 URL 中查看 DOUBLE-TAP 示例。 在 listView 中使用。希望对你有用。

          https://nodeload.github.com/NikolaDespotoski/DoubleTapListView/zip/master

          【讨论】:

          • 在你的代码中我可以放单次点击和双击的代码吗?
          • 我使用了你的代码,当我双击时,单击里面的代码也会执行
          • 再次检查我的答案。
          • @Manikandan 你是对的。非常遗憾。我编辑我的答案并在手机上查看。现在检查。现在可以了。
          【解决方案5】:
          btn.setOnClickListener(new View.OnClickListener() {
          
                                         volatile int i = 0;
          
                                         @Override
                                         public void onClick(View v) {
          
                                             i++;
                                             Handler handler = new Handler();
          
                                             Runnable r = new Runnable() {
                                                 @Override
                                                 public void run() {
                                                     if (i == 1) {
                                                         //single click logic
          
                                                         i = 0; //set to zero 
                                                     }
                                                 }
                                             };
          
                                             if (i == 1) {
                                                 handler.postDelayed(r, 300);
                                             } else if (i == 2) {
                                                 handler.removeCallbacks(r);
                                                 i = 0;
                                                 //Double click logic
          
                                             }
                                         }
                                     }
              );
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-29
            • 2015-04-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多