Android修行筆記(六): 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。

 

  路由事件是所有GUI框架的一套基本並且重要的機制,后續我會專門寫一篇文章來談論下

安卓上的路由機制。

 

轉載請表明原文位置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM