Jetpack Compose 雙指拖拽實現(xiàn)詳解
Modifier.offset
Compose遇到一個瀏覽圖片的功能,雙指放大和縮小
Modifier的offset可以偏移內(nèi)容。偏移量可以是正的,也可以是非正的。應(yīng)用偏移只會更改內(nèi)容的位置,而不會影響其大小測量。
offset由于用戶交互而發(fā)生變化的偏移。它避免了在偏移量發(fā)生變化時進行重新編譯,還添加了一個圖形層,以防止在偏移量發(fā)生變化時對上下文進行不必要的重畫。
graphicsLayer
使內(nèi)容繪制到繪制層中的元素。繪圖層可以與父層分開失效。當(dāng)內(nèi)容獨立于上面的任何內(nèi)容進行更新時,應(yīng)使用graphicsLayer,以最小化無效內(nèi)容。
graphicsLayer可以用于對內(nèi)容應(yīng)用各種效果
- 縮放(scaleX、scaleY)
- 旋轉(zhuǎn)(rotationX、rotationY、rotationZ)
- 不透明度(alpha)
- 陰影(shadowElevation、shape)
- 剪裁(clip、shape)
- 以及使用Renderefect更改層的結(jié)果。
官方說,如果提供非零陰影高程,并且傳遞的形狀為凹面,則陰影將不會在小于10的Android版本上繪制。
還有小于1.0f的alpha值會將其內(nèi)容隱式剪裁到其邊界。這是因為創(chuàng)建了一個中間合成層,以便在使用所需的alpha將內(nèi)容繪制到目標(biāo)之前,先將內(nèi)容渲染到first中。該層的大小與配置該修改器的可組合對象的邊界一致,這些邊界之外的內(nèi)容將被忽略。
Modifier.pointerInput
用于處理修改元素區(qū)域內(nèi)的指針輸入。 PointerInputScope或AwaitPointerEventScope上的擴展函數(shù)可以定義為執(zhí)行更高級別的手勢檢測。指針輸入處理塊將被取消,并在指針輸入用不同的鍵1重新組合時重新啟動。
PointerInputScope.detectTransformGestures
可以用于旋轉(zhuǎn)、平移和縮放的手勢檢測器。。當(dāng)發(fā)生任何旋轉(zhuǎn)、縮放或平移時,將調(diào)用OnGeture,以度為單位傳遞旋轉(zhuǎn)角度,以像素為單位放大比例因子并以偏移量平移。
邏輯解釋
定義4個變量
var angle by remember { mutableStateOf(0f) }//旋轉(zhuǎn)的角度 var zoom by remember { mutableStateOf(1f) }//縮放 var offsetX by remember { mutableStateOf(0f) }//X軸偏移量 var offsetY by remember { mutableStateOf(0f) }//X軸偏移量
offset
Modifier .offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }
傳入graphicsLayer里面
.graphicsLayer( scaleX = zoom, scaleY = zoom, rotationZ = angle )
監(jiān)聽手勢
接著就是要監(jiān)聽手勢,拿到手勢的滑動返回的值讓mutableStateOf告訴graphicsLayer刷新UI
.pointerInput(Unit) { detectTransformGestures( onGesture = { _, pan, gestureZoom, gestureRotate -> angle += gestureRotate zoom *= gestureZoom offsetX += pan.x offsetY += pan.y } ) }
圖片的話加個Image就可以了,我在這里用背景色代替
background(Color.Cyan)
完整代碼
@Composable private fun TransformGestures() { var angle by remember { mutableStateOf(0f) } var zoom by remember { mutableStateOf(1f) } var offsetX by remember { mutableStateOf(0f) } var offsetY by remember { mutableStateOf(0f) } Box( Modifier .offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) } .graphicsLayer( scaleX = zoom, scaleY = zoom, rotationZ = angle ) .background(Color.Cyan) .pointerInput(Unit) { detectTransformGestures( onGesture = { _, pan, gestureZoom, gestureRotate -> angle += gestureRotate zoom *= gestureZoom offsetX += pan.x offsetY += pan.y } ) } .fillMaxSize() ) }
效果圖
以上就是Jetpack Compose 雙指拖拽實現(xiàn)詳解的詳細內(nèi)容,更多關(guān)于Jetpack Compose 雙指拖拽的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Native.js獲取監(jiān)聽開關(guān)等操作Android藍牙設(shè)備實例代碼
本文為大家分享了Native.js對Android藍牙設(shè)備的操作實例代碼包括:監(jiān)聽藍牙開關(guān)狀態(tài),開啟關(guān)閉藍牙,獲取藍牙設(shè)備列表,藍牙連接票據(jù)打印機2018-09-09Android巧用ViewPager實現(xiàn)左右循環(huán)滑動圖片
這篇文章主要為大家詳細介紹了Android巧用ViewPager實現(xiàn)左右循環(huán)滑動圖片的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-05-05Android7.0指紋服務(wù)FingerprintService實例介紹
這篇文章主要介紹了Android7.0指紋服務(wù)FingerprintService介紹,需要的朋友可以參考下2018-01-01詳解 android 光線傳感器 light sensor的使用
這篇文章主要介紹了詳解 android 光線傳感器 light sensor的使用的相關(guān)資料,需要的朋友可以參考下2017-06-06android編程實現(xiàn)類似于支付寶余額快速閃動效果的方法
這篇文章主要介紹了android編程實現(xiàn)類似于支付寶余額快速閃動效果的方法,涉及Android時間函數(shù)的相關(guān)使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11Android編程實現(xiàn)獲得手機屏幕真實寬高的方法
這篇文章主要介紹了Android編程實現(xiàn)獲得手機屏幕真實寬高的方法,以兩個實例形式分析了獲取手機屏幕信息的相關(guān)技巧,需要的朋友可以參考下2015-10-10Android之聯(lián)系人PinnedHeaderListView使用介紹
Android聯(lián)系人中的ListView是做得比較獨特的,這幾天,我把他提取出來了,寫成一個簡單的例子,留著備用,感興趣的朋友可以參考下哈2013-06-06