motionevent.action_up 可以當做點選事件的觸發條件嗎?
答案是不行。
我許多人為了給自定義view新增點選事件也是想破了腦袋。
如何讓自定義view既允許外部設定onclicklistener,又能保證在自定義view被點選時也執行一些其他的**呢?
首先view裡根本沒有onclick之類的方法可以方便地重寫,於是我很多人就很自然地把視線轉移到了ontouchevent上來:
@override把手拿起來的時候就是點選結束的時候嘛,我真是太機智了。public
boolean
ontouchevent(motionevent event)
return
super
.ontouchevent(event);
}
這段**看起來一點問題都沒有對不對?
對個大頭鬼。
按下按鈕之後你突然發現不能反悔了。就算把手指從按鈕上移開,**還是會跑到 action_up 下面去。
怎麼回事,這跟說好的不一樣啊?不是按下去之後移走就取消操作的麼?我寫了兩個小時文件點叉之後不小心點到不儲存的時候就是這招救了我的命的啊?
不說別的,如果點選事件真這麼容易處理,google程式設計師把
1view.ontouchevent()public
boolean
ontouchevent(motionevent event)
11//
a disabled view that is clickable still consumes the touch
12//
events, it just doesn't respond to them.
13return (((viewflags & clickable) ==clickable
14 || (viewflags & long_clickable) ==long_clickable)
15 || (viewflags & context_clickable) ==context_clickable);16}
1718
if (mtouchdelegate != null
) 22}23
24if (((viewflags & clickable) == clickable ||
25 (viewflags & long_clickable) == long_clickable) ||
26 (viewflags & context_clickable) ==context_clickable)
3738
if(prepressed)
4546
if (!mhasperformedlongpress && !mignorenextupevent)
58if (!post(mperformclick)) 61}
62}6364
if (munsetpressedstate == null
) 67
68if
(prepressed) else
if (!post(munsetpressedstate))
7576
removetapcallback();77}
78 mignorenextupevent = false;79
break;80
81case
motionevent.action_down:
82 mhasperformedlongpress = false;83
84if
(performbuttonactionontouchdown(event))
8788
//walk up the hierarchy to determine if we're inside a scrolling container.
89boolean isinscrollingcontainer =isinscrollingcontainer();
9091
//for views inside a scrolling container, delay the pressed feedback for
92//
a short period in case this is a scroll.
93if
(isinscrollingcontainer)
98 mpendingcheckfortap.x =event.getx();
99 mpendingcheckfortap.y =event.gety();
100postdelayed(mpendingcheckfortap, viewconfiguration.gettaptimeout());
101 } else
106break
;107
108case
motionevent.action_cancel:
109 setpressed(false
);110
removetapcallback();
111removelongpresscallback();
112 mincontextbuttonpress = false
;113 mhasperformedlongpress = false
;114 mignorenextupevent = false
;115
break
;116
117case
motionevent.action_move:
118drawablehotspotchanged(x, y);
119120
//be lenient about moving outside of buttons
121if (!pointinview(x, y, mtouchslop))
130}
131break
;132
}133
134return
true
;135
}136
137return
false
;138 }
寫這麼長是為了好玩嗎。
悟空,回想一下seekbar死前三天的樣子吧。
拖動seekbar的滑塊時手指如果離開了seekbar的範圍會怎麼樣?
滑塊還是會左右動的。
所以單純把離開範圍的所有事件直接扔掉顯然是不可以的。
那麼這個問題怎麼處理呢?
聰(sàng)明(xīn)伶(bìng)俐(kuáng)的爆棧網網友想出了許多波譎雲詭的技巧,比如:
1實在是太有想法了,讓人想上金正恩拍手圖。switch
(event.getaction())
13//
the view was clicked.
14//
todo: do stuff
15return
true;16
default:17
return
true;
但是這個方法太不優雅了,高貴如我怎能用這種庶民級的work-around。
於是我花了一下午時間思考,終於得出了答案。
1……………………………………真tm想扇自己兩巴掌……public customview(context context, attributeset attrs, int
defstyleattr) 56
@override
7public
void setonclicklistener(final
onclicklistener l) 16}
17});18}
1920
@override
21public
void
onclick(view v)
因為你不愛我, 所以你不明白
所以你不明白 我為什麼經常給你發簡訊 不是此刻想起你 而是我一直想著你 只是此刻想你想的最厲害 因為你不愛我 所以你不明白 我為什麼會知道你那麼多的資訊 因為你的一切,哪怕是早點吃了什麼 對於我來說也是有意義的 因為你不愛我 所以你不明白 你和誰在一起幹了什麼 對我來說都是一種糾結 我會亂揣測,亂生...
如果你已經20 25歲了
如果你已經過了20歲但還不到25歲的話,你必須找到除了愛情之外,能夠使你用雙腳堅強站在大地上的東西。你要找到謀生的方式。現在考慮不晚了。我從來不以為學歷有什麼重要,天才都不是科班,但,不是科班,連龍套都跑不了。你必須把那些浮如飄絮的思緒,漸漸轉化為清晰的思路和簡單的文字。華麗和漂浮都不易長久。你要知...
其實你已經在使用Lisp語法了
unix開發人員 以下簡稱ud,unix developer 我再也不會碰lisp了。太可怕了!我 為什麼這麼說?ud 它的語法!那個波蘭式的字首語法看得眼睛都花了,也就只有它在用了。你看看這些個括號!我 好吧,但很多人認為這個可讀性很強,儘管他們也承認是得花點時間才能習慣它。但我覺得你錯了。很多人...