Compose 手势事件:防止重复点击,双击,长按,全局触摸隐藏键盘
前言
JetPack Compose (后續(xù)簡稱compose) release版已經(jīng)出來了三四個月了,雖然沒正式版之前也學(xué)過幾次,但一直沒有機會用,在加上api的變更,導(dǎo)致之前學(xué)的都忘完了,現(xiàn)在終于有機會寫一點(將原有項目的簡單頁面用compose重寫),發(fā)現(xiàn)了一些compose的優(yōu)勢和劣勢:
優(yōu)勢:
1.超容易封裝和組合,相對于原生自定義組合view,compose組合一個view簡直不要太簡單,只需要一個方法就能搞定,封裝也更簡便好用(組合vs繼承)
2.跨平臺,目前kotlin的跨平臺,compose ui是其中重大的一步,雖然目前跨平臺還不是正式版,平臺支持的也不全,但未來可期
3.響應(yīng)式ui,響應(yīng)式是未來的ui范式,如果吃透的話不管是開發(fā)效率還是bug出現(xiàn)幾率都可以大幅減少
4.互操作性,compose和kotlin一樣,都保持了優(yōu)良的互操作性,這樣不管是推廣還是項目過度都能更平滑,這樣不僅新項目可以用,老項目也可以在某個頁面或某個布局位置使用compose,這么菜大佬的文章很好的講了這一點:?Jetpack Compose和View的互操作性 - 圣騎士wind - 博客園 (cnblogs.com)
5.代碼即時預(yù)覽,雖然目前不是很完善,只支持String之類的修改即時預(yù)覽,但是未來應(yīng)該會有長足的進步.(即時預(yù)覽:不止是在Preview處,另一個地方是如果你跑在設(shè)備上,你在代碼處修改,設(shè)備上也會即時修改)
6.動態(tài)內(nèi)容,比如你可以在compose中使用 if 或者 for 等進行流程控制,這在xml view體系中基本是不可能的
7.理論性能更好,因為compose使用了部分內(nèi)容重組和并行執(zhí)行,并且沒有xml加載和解析,所以性能理論上會更好,但目前大部分還是不如原生,但現(xiàn)在才1.0.1,有很多優(yōu)化空間
8.如果你使用flutter可以很輕松的學(xué)會,并且比flutter更簡潔,語言更好用
劣勢:
1.學(xué)習(xí)成本高,學(xué)習(xí)曲線稍微陡峭,需要顛覆之前的view體系的view,動畫,手勢和三方庫之類的,需要一定勇氣
2.代碼要求較高,需要以函數(shù)式的要求來寫compose代碼,要求compose代碼冪等,無副作用,保持方法快速
3.嵌套地獄,可以通過抽方法解決(當然比flutter好點)
4.目前view組件比較基礎(chǔ),很多需要自行封裝
5.現(xiàn)存資料較少,不過以后應(yīng)該會慢慢多起來
正文
我就懶得寫各種api怎么用了,網(wǎng)上很多,官網(wǎng)也有,只寫一些可能需要自定義的東西
1.防止重復(fù)點擊
compose實現(xiàn)點擊事件很簡單,如下
Text(text = "", modifier = Modifier.clickable {//點擊回調(diào)})但是實現(xiàn)防止重復(fù)點擊可能會麻煩些,如下:
const val VIEW_CLICK_INTERVAL_TIME = 800//View的click方法的兩次點擊間隔時間/*** 防止重復(fù)點擊(有的人可能會手抖連點兩次,造成奇怪的bug)*/ @Composable inline fun Modifier.click(time: Int = VIEW_CLICK_INTERVAL_TIME,enabled: Boolean = true,//中間這三個是clickable自帶的參數(shù)onClickLabel: String? = null,role: Role? = null,crossinline onClick: () -> Unit ): Modifier {var lastClickTime = remember { 0L }//使用remember函數(shù)記錄上次點擊的時間return clickable(enabled, onClickLabel, role) {val currentTimeMillis = System.currentTimeMillis()if (currentTimeMillis - time >= lastClickTime) {//判斷點擊間隔,如果在間隔內(nèi)則不回調(diào)onClick()lastClickTime = currentTimeMillis}} }//使用如下,api基本沒有區(qū)別:Text(text = "", modifier = Modifier.click {//點擊回調(diào)})2.Button的防止重復(fù)點擊
Button的點擊事件如下:
Button(onClick = {//點擊回調(diào)}) {}可以看出onClick參數(shù)是一個()->Unit,所以我們只需要返回一個可以過濾重復(fù)點擊的()->Unit即可,如下所示:
/*** 防止重復(fù)點擊,比如用在Button時直接傳入onClick函數(shù)*/ @Composable inline fun composeClick(time: Int = VIEW_CLICK_INTERVAL_TIME,crossinline onClick: () -> Unit ): () -> Unit {var lastClickTime = remember { 0L }//使用remember函數(shù)記錄上次點擊的時間return {val currentTimeMillis = System.currentTimeMillis()if (currentTimeMillis - time >= lastClickTime) {//判斷點擊間隔,如果在間隔內(nèi)則不回調(diào)onClick()lastClickTime = currentTimeMillis}} }使用如下:Button(onClick = composeClick {//點擊回調(diào)}) {}3.雙擊
雙擊可以使用compose的基礎(chǔ)觸摸api:
/*** 雙擊事件*/ fun Modifier.doubleClick(onDoubleClick: (Offset) -> Unit): Modifier =//處理手勢反饋pointerInput(this) {//處理基礎(chǔ)手勢反饋detectTapGestures(onDoubleTap = onDoubleClick//雙擊時回調(diào) // onPress = {}//按下時回調(diào) // onLongPress = {}//長按時回調(diào) // onTap = {}//輕觸時回調(diào)(按下并抬起))})}使用方式:Text(text = "", modifier = Modifier.doubleClick {//雙擊回調(diào)})4.長按
長按也可以使用compose的基礎(chǔ)觸摸api:
/*** 長按事件*/ fun Modifier.longClick(onLongClick: (Offset) -> Unit): Modifier =pointerInput(this) {detectTapGestures(onLongPress = onLongClick)}使用如下:Text(text = "", modifier = Modifier.longClick {//雙擊回調(diào)})5.全局觸摸隱藏鍵盤
全局觸摸自動隱藏鍵盤也是用到了基礎(chǔ)觸摸api,并使用我們常用的鍵盤工具類(可自行搜索),代碼如下:
/*** 在有鍵盤的頁面,設(shè)置在root compose上,點擊別處可以自動隱藏鍵盤*/ fun Modifier.autoCloseKeyboard(view: View): Modifier =pointerInput(this) {detectTapGestures(onPress = {KeyBoardUtil.hideKeyboard(view)//調(diào)用鍵盤工具類來隱藏鍵盤})}使用如下:Text(text = "", modifier = Modifier.autoCloseKeyboard(getRootViewGroup()))結(jié)語
以后有好用的新東西在寫這個系列吧,畢竟目前用的不多
官方自定義view教學(xué)的視頻:?2021 Google 開發(fā)者大會,加入我們 Develop as One!
end
總結(jié)
以上是生活随笔為你收集整理的Compose 手势事件:防止重复点击,双击,长按,全局触摸隐藏键盘的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: KMM 搭建环境,并运行安卓和ios
- 下一篇: 超简单-用协程简化你的网络请求吧,兼容你