既然你已經不愛我了,那我們還是不要聯絡了

2022-05-06 17:57:07 字數 4235 閱讀 4490

motionevent.action_up 可以當做點選事件的觸發條件嗎?

答案是不行。

我許多人為了給自定義view新增點選事件也是想破了腦袋。

如何讓自定義view既允許外部設定onclicklistener,又能保證在自定義view被點選時也執行一些其他的**呢?

首先view裡根本沒有onclick之類的方法可以方便地重寫,於是我很多人就很自然地把視線轉移到了ontouchevent上來:

@override

public

boolean

ontouchevent(motionevent event)

return

super

.ontouchevent(event);

}

把手拿起來的時候就是點選結束的時候嘛,我真是太機智了。

這段**看起來一點問題都沒有對不對?

對個大頭鬼。

按下按鈕之後你突然發現不能反悔了。就算把手指從按鈕上移開,**還是會跑到 action_up 下面去。

怎麼回事,這跟說好的不一樣啊?不是按下去之後移走就取消操作的麼?我寫了兩個小時文件點叉之後不小心點到不儲存的時候就是這招救了我的命的啊?

不說別的,如果點選事件真這麼容易處理,google程式設計師把

1

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 }

view.ontouchevent()

寫這麼長是為了好玩嗎。

悟空,回想一下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

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)

……………………………………真tm想扇自己兩巴掌……

因為你不愛我, 所以你不明白

所以你不明白 我為什麼經常給你發簡訊 不是此刻想起你 而是我一直想著你 只是此刻想你想的最厲害 因為你不愛我 所以你不明白 我為什麼會知道你那麼多的資訊 因為你的一切,哪怕是早點吃了什麼 對於我來說也是有意義的 因為你不愛我 所以你不明白 你和誰在一起幹了什麼 對我來說都是一種糾結 我會亂揣測,亂生...

如果你已經20 25歲了

如果你已經過了20歲但還不到25歲的話,你必須找到除了愛情之外,能夠使你用雙腳堅強站在大地上的東西。你要找到謀生的方式。現在考慮不晚了。我從來不以為學歷有什麼重要,天才都不是科班,但,不是科班,連龍套都跑不了。你必須把那些浮如飄絮的思緒,漸漸轉化為清晰的思路和簡單的文字。華麗和漂浮都不易長久。你要知...

其實你已經在使用Lisp語法了

unix開發人員 以下簡稱ud,unix developer 我再也不會碰lisp了。太可怕了!我 為什麼這麼說?ud 它的語法!那個波蘭式的字首語法看得眼睛都花了,也就只有它在用了。你看看這些個括號!我 好吧,但很多人認為這個可讀性很強,儘管他們也承認是得花點時間才能習慣它。但我覺得你錯了。很多人...