Jetpack?Compose實現(xiàn)點擊事件click的多種方法
Compose中添加click有多種方法,本文做一個簡單總結
Modifier.clickable
這是最常見也是最簡單的方式,如下所示
Box(
modifier = Modifier.clickable {
// 處理點擊事件
}
)當點擊發(fā)生時,除了可以相應事假處理,也會觸發(fā)水波紋(Ripple)等主題效果。
需要注意,對于 Button 類的 Composable ,不推薦使用 Modifier.clickable,應該使用其自帶的 onClick 參數(shù),雖然其內部在調用 Modifier.clickable 之外還有一些額外處理
Button (
onClick = {
// 處理點擊事件
}) {
//...
}Modifier.combinedClickable
在單擊事件之外,同時可以處理雙擊,長按等點擊事件
Box(
modifier = Modifier
.combinedClickable(
onClick = {
// 單擊
},
onDoubleClick = {
// 雙擊
},
onLongClick = {
// 長按
}
)
)與 Modifier.clickable 一樣, 點擊會觸發(fā)水波紋效果。
Modifier.pointerInput
pointerInput 是 Compose 中處理所有手勢事件的入口,類似傳統(tǒng)視圖的 onTouch 。在這里可以識別 click 手勢,而且相應優(yōu)先級高于 clickable,但是不會觸發(fā)水波紋之類的效果
Box(
modifier = Modifier
.pointerInput(Unit) {
detectTapGestures(
onDoubleTap = {
},
onLongPress = {
},
onPress = {
},
onTap = {
}
)
},
)如上,detectTapGestures 內可以處理點擊各種事件。類似的還有 detectDragGestures 可以處理拖動事件。
detectTapGestures 中除了相應事件,還能通過 offset 獲知當前點擊位置,如下:
detectTapGestures(
onTap = {
val x = it.x
val y = it.y
},
)此外,當發(fā)生 onPress 事件時,還可以獲取手指離開時的回調
var pressing by remember { mutableStateOf(false) }
Box(
modifier = Modifier
.pointerInput(Unit) {
detectTapGestures(
onPress = {
// 按下
pressing = true
val isCanceled = tryAwaitRelease()
// 離開
pressing = false
},
)
},
)OnPress 期間,調用 tryAwaitRelease 會掛起當前函數(shù),當手指離開時,繼續(xù)執(zhí)行。
tryAwaitRelease 返回一個 bool 值:true 表示手指在當前區(qū)域內抬起,false 表示手指移出了當前區(qū)域。類似于傳統(tǒng)視圖的 UP 和 CANCEL 事件。
可見,pointerInput 對事件可以更精細的管理。
ViewConfiguration
如果想對事件進一步精細化控制,比如設置點擊最小間隔、長按超時等,可以使用 ViewConfiguration 進行配置,目前可以設置的項目如下:

可見,ViewConfiguration 的配置主要影響 combinedClickable 和 pointerInput。
通過 LocalViewConfiguration 可以獲得全局默認的 ViewConfiguration。我們可以通過繼承和重寫的方式,在默認配置基礎上實現(xiàn)自定義的 ViewConfiguration 。然后同樣借助 CompositionLocal 實現(xiàn)其內部局部 UI 的自定義配置。
下面的例子展示如何自定義長按超時時間:
// 自定義 ViewConfiguration
class CustomViewConfiguration(
private val defaultViewConfiguration: ViewConfiguration //傳入默認配置
) : ViewConfiguration by defaultViewConfiguration {
// 自定義長按超時3000ms
override val longPressTimeoutMillis: Long = 3000
}
@Composable
fun Sample() {
// 獲取全局默認 ViewConfiguration
val defaultViewConfiguration = LocalViewConfiguration.current
// 基于默認配置創(chuàng)建自定義 CustomViewConfiguration
val viewConfiguration = remember {
CustomViewConfiguration(defaultViewConfiguration)
}
CompositionLocalProvider(
LocalViewConfiguration provides viewConfiguration
) {
// 內部的事件配置都受到 CustomViewConfiguration 影響
Box(
modifier = Modifier
.combinedClickable(
onLongClick = {
// ...
},
)
)
}
}值得一提的是 ViewConfiguration.minimumTouchTargetSize 用來設置手勢可響應區(qū)域的最小尺寸。這個挺實用,可以解決界面上一些小尺寸控件比艱難點觸的問題。 因此,通過設置,有可能 Composable 中 pointerInput 可以相應事件的區(qū)域大于其實際渲染的區(qū)域。此時取得的 offset 值可能是負數(shù),亦可能超過 Compose 的 size。
minimumTouchTargetSize 默認值是 48.dp,所以如果我們開發(fā)中獲取了負數(shù) offset 值也不驚奇。
class CustomViewConfiguration(
private val defaultViewConfiguration: ViewConfiguration
) : ViewConfiguration by defaultViewConfiguration {
override val minimumTouchTargetSize: DpSize = DpSize(0.dp, 0.dp)
}可以做個實驗,如果將其設置為 0.dp,則永遠不會獲得負數(shù)的 offset 。當然我們不推薦這么做,會造成難點觸的情況出現(xiàn)。
到此這篇關于Jetpack Compose實現(xiàn)點擊事件click的多種方法的文章就介紹到這了,更多相關Jetpack Compose click內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android開發(fā)之滑動數(shù)值選擇器NumberPicker用法示例
這篇文章主要介紹了Android開發(fā)之滑動數(shù)值選擇器NumberPicker用法,結合實例形式分析了Android滑動數(shù)值選擇器NumberPicker的功能、相關函數(shù)、事件監(jiān)聽、界面布局等操作技巧,需要的朋友可以參考下2019-03-03
如何正確實現(xiàn)Android啟動屏畫面的方法(避免白屏)
本篇文章主要介紹了如何正確實現(xiàn)Android啟動屏畫面的方法(避免白屏),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02
Android中l(wèi)istview和imageview實現(xiàn)條目單選效果
這篇文章主要為大家詳細介紹了Android中l(wèi)istview和imageview實現(xiàn)條目單選效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02
Android自定義View實現(xiàn)拖動自動吸邊效果
這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)拖動自動吸邊效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06
Android 倒計時控件 CountDownView的實例代碼詳解
這篇文章主要介紹了Android 倒計時控件 CountDownView的實例代碼,代碼簡單易懂,非常不錯,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
Android 實現(xiàn)永久保存數(shù)據(jù)的方法詳解
本篇文章是對Android實現(xiàn)永久保存數(shù)據(jù)的方法進行了詳細的分析介紹,需要的朋友參考下2013-06-06

