網站首頁 編程語言 正文
Modifier.offset
Compose遇到一個瀏覽圖片的功能,雙指放大和縮小
Modifier的offset可以偏移內容。偏移量可以是正的,也可以是非正的。應用偏移只會更改內容的位置,而不會影響其大小測量。
offset由于用戶交互而發生變化的偏移。它避免了在偏移量發生變化時進行重新編譯,還添加了一個圖形層,以防止在偏移量發生變化時對上下文進行不必要的重畫。
graphicsLayer
使內容繪制到繪制層中的元素。繪圖層可以與父層分開失效。當內容獨立于上面的任何內容進行更新時,應使用graphicsLayer,以最小化無效內容。
graphicsLayer可以用于對內容應用各種效果
- 縮放(scaleX、scaleY)
- 旋轉(rotationX、rotationY、rotationZ)
- 不透明度(alpha)
- 陰影(shadowElevation、shape)
- 剪裁(clip、shape)
- 以及使用Renderefect更改層的結果。
官方說,如果提供非零陰影高程,并且傳遞的形狀為凹面,則陰影將不會在小于10的Android版本上繪制。
還有小于1.0f的alpha值會將其內容隱式剪裁到其邊界。這是因為創建了一個中間合成層,以便在使用所需的alpha將內容繪制到目標之前,先將內容渲染到first中。該層的大小與配置該修改器的可組合對象的邊界一致,這些邊界之外的內容將被忽略。
Modifier.pointerInput
用于處理修改元素區域內的指針輸入。 PointerInputScope或AwaitPointerEventScope上的擴展函數可以定義為執行更高級別的手勢檢測。指針輸入處理塊將被取消,并在指針輸入用不同的鍵1重新組合時重新啟動。
PointerInputScope.detectTransformGestures
可以用于旋轉、平移和縮放的手勢檢測器。。當發生任何旋轉、縮放或平移時,將調用OnGeture,以度為單位傳遞旋轉角度,以像素為單位放大比例因子并以偏移量平移。
邏輯解釋
定義4個變量
var angle by remember { mutableStateOf(0f) }//旋轉的角度
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
)
監聽手勢
接著就是要監聽手勢,拿到手勢的滑動返回的值讓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()
)
}
效果圖
原文鏈接:https://juejin.cn/post/7061958970788806692
相關推薦
- 2023-01-30 uniapp語音識別(訊飛語音)轉文字_其它相關
- 2022-09-26 css外邊距問題和顯示模式
- 2024-03-09 基于 Redis 的 JWT令牌失效方案
- 2022-03-11 UE4 添加自己項目的AutomationProject,解決報錯Failed to find co
- 2021-12-07 基于Kubernetes實現前后端應用的金絲雀發布(兩種方案)_C#教程
- 2022-10-29 C++ 模板的顯式具體化
- 2022-05-15 C++11:搞清楚萬能引用和右值引用
- 2023-01-15 React?18中的state概念與使用、注意問題解決_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支