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。

  • 相关阅读:
    前端页面适配的rem换算
    Win10远程桌面 出现 身份验证错误,要求的函数不受支持,这可能是由于CredSSP加密Oracle修正 解决方法
    ES5, ES6, ES2016, ES.Next: What's going on with JavaScript versioning?
    国内的Android SDK镜像
    虚拟串口VSPD破解版 亲测win10 64可用
    Mybatis : "less than" issue in Select annotations
    如何在MyBatis中优雅的使用枚举
    Adding a custom jar as a maven dependency
    Error: Invalid or corrupt jarfile
    使用Json让Java和C#沟通的方法
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4638089.html
Copyright © 2011-2022 走看看