zoukankan      html  css  js  c++  java
  • GridView点击空白地方事件扩展

    我们通常在ListView或者GridView响应点击Item事件,但很多时候我们同样也

    希望监听到点击空白区域的事件来做更多的处理。本文以GridView为例给出一个实现

    的方法,扩展GridView并可作为通用控件使用。ListView的实现应该也大同小异

    好吧,原来之前写过另外一篇,不过监控的是ACTION_UP事件,但这篇更加通用 

    代码比较简单,先贴代码再做下解释

    public class MyGridView extends GridView {
      public interface OnTouchInvalidPositionListener {
        /**
         * motionEvent 可使用 MotionEvent.ACTION_DOWN 或者 MotionEvent.ACTION_UP等来按需要进行判断
         * @return 是否要终止事件的路由
         */
        boolean onTouchInvalidPosition(int motionEvent);
      }
      /**
       * 点击空白区域时的响应和处理接口
       */
      public void setOnTouchInvalidPositionListener(OnTouchInvalidPositionListener listener) {
        mTouchInvalidPosListener = listener;
      }
      @Override
      public boolean onTouchEvent(MotionEvent event) {
        if(mTouchInvalidPosListener == null) {
          return super.onTouchEvent(event);
        }
        if (!isEnabled()) {
          // A disabled view that is clickable still consumes the touch
          // events, it just doesn't respond to them.
          return isClickable() || isLongClickable();
        }
        final int motionPosition = pointToPosition((int)event.getX(), (int)event.getY());
        if( motionPosition == INVALID_POSITION ) {
          super.onTouchEvent(event);
          return mTouchInvalidPosListener.onTouchInvalidPosition(event.getActionMasked());
        }
        return super.onTouchEvent(event);
      }
    }	
    

    主要是重载了触摸处理函数,并利用api pointToPosition取得当前点击的item,当你点击空白区域的时候,

    会返回INVALID_POSITION,由此便可判断点击了空白区域。

    使用的话如下代码所示。在onTouchInvalidPosition事件中你可以做自己的响应操作,

    通常用得比较多的是“点击空白地方取消当前操作”。这里我是用来实现点击空白地方让父容器

    显示触摸变色效果。 注意return返回值的意义,当返回false的时候代表交由父级控件处理,这里的

    效果通常会让外层的Layout显示被点击效果。当return true的时候表示你已经处理了该事件并不

    让该事件再往上传递。

    mGridView.setOnTouchInvalidPositionListener(new OnTouchInvalidPositionListener() {
                @Override
                public boolean onTouchInvalidPosition(int motionEvent) {
                    return false; //不终止路由事件让父级控件处理事件
                }
            });    

    效果图如下,点击红色圈的地方整个Layout会变色,当然变色这个你的Layout得先设置对应的drawable。

  • 相关阅读:
    VS2008编写MFC程序--使用opencv2.4()
    November 02nd, 2017 Week 44th Thursday
    November 01st, 2017 Week 44th Wednesday
    October 31st, 2017 Week 44th Tuesday
    October 30th, 2017 Week 44th Monday
    October 29th, 2017 Week 44th Sunday
    October 28th, 2017 Week 43rd Saturday
    October 27th, 2017 Week 43rd Friday
    October 26th, 2017 Week 43rd Thursday
    October 25th, 2017 Week 43rd Wednesday
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4638089.html
Copyright © 2011-2022 走看看