Android修行筆記(六): GridView點擊空白地方事件擴充,androidgridview
我們通常在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架構的一套基本並且重要的機制,後續我會專門寫一篇文章來談論下
安卓上的路由機制。
轉載請表明原文位置