Jetpack Compose 雙指拖拽實(shí)現(xiàn)詳解
Modifier.offset
Compose遇到一個(gè)瀏覽圖片的功能,雙指放大和縮小
Modifier的offset可以偏移內(nèi)容。偏移量可以是正的,也可以是非正的。應(yīng)用偏移只會(huì)更改內(nèi)容的位置,而不會(huì)影響其大小測(cè)量。
offset由于用戶交互而發(fā)生變化的偏移。它避免了在偏移量發(fā)生變化時(shí)進(jìn)行重新編譯,還添加了一個(gè)圖形層,以防止在偏移量發(fā)生變化時(shí)對(duì)上下文進(jìn)行不必要的重畫(huà)。
graphicsLayer
使內(nèi)容繪制到繪制層中的元素。繪圖層可以與父層分開(kāi)失效。當(dāng)內(nèi)容獨(dú)立于上面的任何內(nèi)容進(jìn)行更新時(shí),應(yīng)使用graphicsLayer,以最小化無(wú)效內(nèi)容。
graphicsLayer可以用于對(duì)內(nèi)容應(yīng)用各種效果
- 縮放(scaleX、scaleY)
- 旋轉(zhuǎn)(rotationX、rotationY、rotationZ)
- 不透明度(alpha)
- 陰影(shadowElevation、shape)
- 剪裁(clip、shape)
- 以及使用Renderefect更改層的結(jié)果。
官方說(shuō),如果提供非零陰影高程,并且傳遞的形狀為凹面,則陰影將不會(huì)在小于10的Android版本上繪制。
還有小于1.0f的alpha值會(huì)將其內(nèi)容隱式剪裁到其邊界。這是因?yàn)閯?chuàng)建了一個(gè)中間合成層,以便在使用所需的alpha將內(nèi)容繪制到目標(biāo)之前,先將內(nèi)容渲染到first中。該層的大小與配置該修改器的可組合對(duì)象的邊界一致,這些邊界之外的內(nèi)容將被忽略。
Modifier.pointerInput
用于處理修改元素區(qū)域內(nèi)的指針輸入。 PointerInputScope或AwaitPointerEventScope上的擴(kuò)展函數(shù)可以定義為執(zhí)行更高級(jí)別的手勢(shì)檢測(cè)。指針輸入處理塊將被取消,并在指針輸入用不同的鍵1重新組合時(shí)重新啟動(dòng)。
PointerInputScope.detectTransformGestures
可以用于旋轉(zhuǎn)、平移和縮放的手勢(shì)檢測(cè)器。。當(dāng)發(fā)生任何旋轉(zhuǎn)、縮放或平移時(shí),將調(diào)用OnGeture,以度為單位傳遞旋轉(zhuǎn)角度,以像素為單位放大比例因子并以偏移量平移。
邏輯解釋
定義4個(gè)變量
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)聽(tīng)手勢(shì)
接著就是要監(jiān)聽(tīng)手勢(shì),拿到手勢(shì)的滑動(dòng)返回的值讓mutableStateOf告訴graphicsLayer刷新UI
.pointerInput(Unit) {
detectTransformGestures(
onGesture = { _, pan, gestureZoom, gestureRotate ->
angle += gestureRotate
zoom *= gestureZoom
offsetX += pan.x
offsetY += pan.y
}
)
}
圖片的話加個(gè)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 雙指拖拽實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于Jetpack Compose 雙指拖拽的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
android 獲取APP的唯一標(biāo)識(shí)applicationId的實(shí)例
下面小編就為大家分享一篇android 獲取APP的唯一標(biāo)識(shí)applicationId的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
Android CardView+ViewPager實(shí)現(xiàn)ViewPager翻頁(yè)動(dòng)畫(huà)的方法
本篇文章主要介紹了Android CardView+ViewPager實(shí)現(xiàn)ViewPager翻頁(yè)動(dòng)畫(huà)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Android 使用ViewPager實(shí)現(xiàn)輪播圖效果
這篇文章主要介紹了Android 使用ViewPager實(shí)現(xiàn)輪播圖效果,通過(guò)實(shí)例代碼給大家講解了適配器和各個(gè)方法的作用介紹,需要的朋友可以參考下2017-05-05
Android上傳文件到Web服務(wù)器 PHP接收文件
這篇文章主要為大家詳細(xì)介紹了Android上傳文件到Web服務(wù)器,PHP接收文件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Android利用SurfaceView實(shí)現(xiàn)下雨的天氣動(dòng)畫(huà)效果
這篇文章主要介紹了Android利用SurfaceView實(shí)現(xiàn)下雨天氣效果的相關(guān)資料,文中詳細(xì)介紹 SurfaceView 和 View 的區(qū)別,以及一些需要使用到 SurfaceView 的場(chǎng)景。需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-03-03
Android自定義水平進(jìn)度條的圓角進(jìn)度
這篇文章主要為大家詳細(xì)介紹了Android自定義水平進(jìn)度條的圓角進(jìn)度,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
Android開(kāi)發(fā)中優(yōu)秀的app 異常處理機(jī)制
這篇文章主要介紹了Android開(kāi)發(fā)中優(yōu)秀的app 異常處理機(jī)制 的相關(guān)資料,需要的朋友可以參考下2015-12-12
Android添加圖片到ListView或者RecyclerView顯示
這篇文章主要介紹了Android添加圖片到ListView或者RecyclerView顯示的相關(guān)資料,需要的朋友可以參考下2016-08-08
Android 使用 DowanloadManager 實(shí)現(xiàn)下載并獲取下載進(jìn)度實(shí)例代碼
這篇文章主要介紹了Android 使用 DowanloadManager 實(shí)現(xiàn)下載并獲取下載進(jìn)度實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-06-06

