μΈλ‘/κ°λ‘ μ΄λ―Έμ§λ₯Ό νμνκΈ° μν΄ ZoomLayoutμ μ¬μ©νκ³ μμ΅λλ€. Zoom & OverScrollμ λΉνμ±ννμ΅λλ€. CenterCropμμλ§ μν λ° μμ§ ν¬μ μ¬μ©νκ³ μμ΅λλ€. μμλλ‘ ν λ²μ ν λ°©ν₯ ν¬λ§ μνν μ μμ΅λλ€(μ€μ΄ λΉνμ±νλμ΄ μκΈ° λλ¬Έμ). μ΄λ₯Ό ν΅ν΄ μ΄λ―Έμ§μ μΌλΆλ₯Ό νμνκ³ λ€λ₯Έ λΆλΆμ Panμ μ¬μ©νμ¬ λ³Ό μ μμ΅λλ€.
λ΄κ° μ΄ν΄ν λλ‘ centercropμ containerHeight
μ childHeight
λλ containerWidth
μμ childWidth
λ‘ μ λ ¬νμ¬ μλν©λλ€. μ€λ₯Έμͺ½? κ°λ‘/μΈλ‘ μ΄λ―Έμ§λ₯Ό μ μ¬κ°ν ImageViewμ λ‘λνλ κ²μ μμν΄ λ³΄μμμ€. κ°λ‘ μ΄λ―Έμ§μ κ²½μ° childHeight
κ° containerHeight
μ μ λ ¬λμ΄ κ°μ΄λ° μλ₯΄κΈ°λ₯Ό μννκ³ μ΄μ ν¬μ κ°λ‘λ‘ μνν μ μμ΅λλ€. λ§μ°¬κ°μ§λ‘ μΈλ‘ μ΄λ―Έμ§μ κ²½μ° ν¬μ μΈλ‘λ‘ μνν μ μμ΅λλ€.
μ΄κ²μ μ μλν©λλ€.
νμ§λ§ μ΄λ κ² ZoomLayoutμ λλΉ/λμ΄λ₯Ό λ³κ²½νλ©΄ μμ λ·°μλ λ³νμ΄ μ μ©λμ§ μμ΅λλ€.
val layoutParams = zoomLayout.layoutParams
layoutParams.width = layoutParams.width + changedWidth
layoutParams.height = layoutParams.height + changedHeight
zoomLayout.layoutParams = layoutParams
λ°λͺ¨ μ±μμ λμμ μ¬ννλ λ¨κ³:
컨ν μ΄λ λμ΄κ° λ³κ²½λλ©΄ CenterCropμ μ μ§νκΈ° μν΄ μμ λ³νμ΄ μ μ©λ©λλ€.
init {
setHorizontalPanEnabled(true)
setVerticalPanEnabled(true)
setOverScrollHorizontal(false)
setOverScrollVertical(false)
setAlignment(Alignment.TOP or Alignment.LEFT)
setHasClickableChildren(true)
setTransformation(
ZoomApi.TRANSFORMATION_CENTER_CROP,
ZoomApi.TRANSFORMATION_GRAVITY_AUTO
)
setZoomEnabled(false)
}
μΆμ
I/ZoomLayout: setHasClickableChildren: old: false new: false
I/ZoomLayout: setHasClickableChildren: old: false new: true
μμμ κ°λ‘ λ°°κ²½ λλ‘μ΄λΈμ λ‘λν©λλ€.
W/ZoomEngine: onMatrixSizeChanged: firstTime: true oldZoom: NaN transformation: 1 transformationZoom: 0.0
I/ZoomEngine: computeTransformationZoom centerCrop scaleX: 1.0042135 scaleY: 5.860656
I/ZoomEngine: onMatrixSizeChanged: newTransformationZoom: 5.860656 newRealZoom: 5.8606563 newZoom: 1.0000001
μμ μ½λλ₯Ό μ¬μ©νμ¬ ZoomLayout λμ΄λ₯Ό λμ΄μμμ€.
W/ZoomEngine: onMatrixSizeChanged: firstTime: false oldZoom: 5.8606563 transformation: 1 transformationZoom: 5.860656
I/ZoomEngine: computeTransformationZoom centerCrop scaleX: 1.0042135 scaleY: 6.2704916
I/ZoomEngine: onMatrixSizeChanged: newTransformationZoom: 6.2704916 newRealZoom: 5.8606563 newZoom: 0.93464065
μμμ centercrop κΈ°λ₯μ μ μ§νκΈ° μν΄ λ³νλμ§ μμ΅λλ€.
νμν κ²½μ° μ 곡νμ§λ§ μ¬μμ° λ¨κ³λ₯Ό μ¬μ©νκΈ°κ° λ§€μ° μ½μ΅λλ€.
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μλ μ½λλ₯Ό μ¬μ©νμ΅λλ€.
val layoutParams = zoomLayout.layoutParams
layoutParams.width = layoutParams.width + changedWidth
layoutParams.height = layoutParams.height + changedHeight
zoomLayout.layoutParams = layoutParams
zoomLayout.engine.setContainerSize(
layoutParams.width.toFloat(),
layoutParams.height.toFloat(),
applyTransformation = false // not applying transformation
)
κ·Έλ¦¬κ³ ZoomLayoutμ onGlobalLayout()
μ λ λ€λ₯Έ λ³κ²½ μ¬ν
engine.setContentSize(
child.width.toFloat(),
child.height.toFloat(),
applyTransformation = true // <-- this change
)
μ΄λ κ² νλ©΄ λμμ΄ λ©λλ€. μ€μ μλ₯΄κΈ° κΈ°λ₯μ μ μ§νκΈ° μν΄ μμμ΄ λΆλͺ¨μ μ¬λ°λ₯΄κ² μ λ ¬λ©λλ€. κ·Έλ¬λ μ΄ μ½λλ #185 λ¬Έμ λ₯Ό λ°μμν΅λλ€. μ΄μ Panμ΄ μ¬μ€μ λλ μ΄μ (hint#global-layout)λ₯Ό νμ€ν μμμ΅λλ€.
λ°λΌμ 컨ν μ΄λ λλΉ/λμ΄κ° λ³κ²½λ λ μμμ λ³νμ μ μ©νλλ‘ ZoomLayoutμ μ§μνλ λ°©λ²μ μ¬μ ν μ°Ύκ³ μμ΅λλ€. ν΄νΉμ κ³μ μλνλ©΄ λ²κ·Έκ° λ λ§μ΄ μκΈΈ κ²μ λλ€. λΉμ μ μ΄κ²μ λν΄ μΌνκ³ , λΉμ μ λλ³΄λ€ λ μ μκ³ μμ΅λλ€. μλ΄ν΄ μ£ΌμΈμ.
μμΈν λ³΄κ³ μ κ°μ¬ν©λλ€.
μ΄κ²μ 컨ν
μ΄λμ ν¬κΈ°λ₯Ό λ³κ²½ν λ μμ§ μ μλ λμμ΄ μλ ZoomLayoutμ μΌλ°μ μΈ λ¬Έμ λΌκ³ μκ°ν©λλ€. 컨ν
μ΄λκ° ν¬κΈ°λ₯Ό μ μ§ν κ²μΌλ‘ μμνκΈ° λλ¬Έμ @natario1μ΄ μλͺ»λ κ²½μ° μμ ν΄ μ£ΌμΈμ. κ·Έλμ μ κ° μκΈ°λ‘λ μ΄κ²μ λ²κ·ΈλΌκΈ°λ³΄λ€ κΈ°λ₯ μμ²μ κ°κΉμ΅λλ€.
μ΄λ₯Ό μ§μνλ €λ©΄ μμλλ λμμ΄ μ΄λ»κ² 보μ¬μΌ νλμ§, κ°λ°μκ° μ΄λ₯Ό μ΄λ»κ² λ²μ΄λ μ μλμ§μ λν λ Όμκ° νμνλ€κ³ μκ°ν©λλ€.
μ§κΈ μλνλ λ°©μμ΄ λ§μμ λλλ€. 컨ν μ΄λ ν¬κΈ°λ μ¬λ¬ κ°μ§ μ΄μ λ‘ λ³κ²½λ μ μμΌλ©° μ½ν μΈ κ° μ΄λ―Έ νλ/μΆμ/μ΄λλ κ²½μ° λ³νμ λ€μ μ μ©ν΄μΌ νλ€κ³ μκ°νμ§ μμ΅λλ€. λ€μκ³Ό κ°μ΄ μνλ κ²μ μ»μ μ μμ΄μΌ ν©λλ€.
zoomLayout.layoutParams = layoutParams
zoomLayout.engine.setContainerSize(layoutParams.width, layoutParams.height, true)
μλλ©΄ μ΄λ κ²
zoomLayout.layoutParams = layoutParams
zoomLayout.post {
zoomLayout.engine.setContainerSize(layoutParams.width, layoutParams.height, true)
}
syncTransformation() ν¨μ λλ μ΄μ μ μ¬ν κ²μΌλ‘ μ΄κ²μ λ μ½κ² λ§λ€ μ μμ΅λλ€.
@markusressel μκ² μ΅λλ€. λν μ΄ λΌμ΄λΈλ¬λ¦¬μ μ μ¬λ ₯μ 25%λ§ νμ©νκ³ μΆλ€λ μκ°μ΄ λλλ€. λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ§ μλλ‘ μ€μ νλ κ²μ μ€μ λ‘ λΌμ΄λΈλ¬λ¦¬μ λ°λνκ³ μλνκΈ°λ₯Ό κΈ°λνλ κ²κ³Ό κ°μ΅λλ€. λ΄κ° νμν κ²μ ν¬κ³Ό νλ§μΌλ‘ μ€μ μλ₯΄κΈ°μ λλ€. μ μν μ¬νμ΄ μμΌλ©΄ νμμμ€. κ°μ¬ ν΄μ.
컨ν μ΄λ ν¬κΈ°λ μ¬λ¬ κ°μ§ μ΄μ λ‘ λ³κ²½λ μ μμΌλ©° μ½ν μΈ κ° μ΄λ―Έ νλ/μΆμ/μ΄λλ κ²½μ° λ³νμ λ€μ μ μ©ν΄μΌ νλ€κ³ μκ°νμ§ μμ΅λλ€.
@natario1 μ΄κ²μ΄ μμ/νμν κ²½μ° μ΄ λμμ λν μ΅νΈμΈ νλκ·Έκ° μμ΄μΌ ν©λλ€. λμκ² κ·Έκ²μ κΈ°λ³Έ κΈ°λμ λ°νλ κ²μ²λΌ λκ»΄μ§λλ€. μΌν° ν¬λ‘μ μ μ©νκ³ μ©κΈ° ν¬κΈ°λ₯Ό λ³κ²½νλ κ²½μ° μΌν° ν¬λ‘μ μ μ§ν΄μΌ ν©λλ€. ZoomLayoutμμ ν¬κΈ° λ³κ²½μ μ§μνμ§ μλλΌλ μ΄κ²μ μ€μνμ§ μμ΅λλ€.
λν νμμΌλΆν° λΌμ΄λΈλ¬λ¦¬ μ½λμ μ°Έμ¬νκ³ μμ΅λλ€. νλ ¬, λ²‘ν° λλ μ °μ΄λκ° μλνλ λ°©μμ λν΄ ~λ§μ΄~ μ무κ²λ λͺ¨λ¦ λλ€. λ°°μ°κΈ° μν΄ μ½κ³ μμ νλ €κ³ λ Έλ ₯ν©λλ€. νμ§λ§ λ¬Έμ λ₯Ό λ³΄κ³ νκΈ° μ μ κ·νμ μ μμ μ΄λ―Έ μλνμ΅λλ€. κ²°κ³Όμ μΌλ‘ Panμ μν λ° μμ§ λ°©ν₯ λͺ¨λμ λν΄ νμ±νλ©λλ€. κ·Έλ¦¬κ³ μ½ν μΈ /νμκ° νλλ κ²μ²λΌ 보μ΄κΈ° λλ¬Έμ μ€μ μλ₯΄κΈ°λ λ μ΄μ μ¬μ©ν μ μμ΅λλ€.
λμμ£Όμ μ κ°μ¬ν©λλ€. λ΅λ³νλ λ° μκ°μ΄ ν¨μ¬ μ€λ κ±Έλ Έμ΅λλ€.
@rupinderjeet μμ λ₯Ό μ¬ννλ €κ³ μλνμ§λ§ μμ λ LayoutParams
λ₯Ό ZoomLayout
μΈμ€ν΄μ€μ μ μ©νλ©΄ μ체 μ€λ₯ λ©μμ§κ° λνλ©λλ€.
java.lang.RuntimeException: ZoomLayout must be used with fixed dimensions (e.g. match_parent)
λ΄κ° λκ°λ₯Ό λμΉκ³ μμ΅λκΉ?
κ°μ₯ μ μ©ν λκΈ
μ§κΈ μλνλ λ°©μμ΄ λ§μμ λλλ€. 컨ν μ΄λ ν¬κΈ°λ μ¬λ¬ κ°μ§ μ΄μ λ‘ λ³κ²½λ μ μμΌλ©° μ½ν μΈ κ° μ΄λ―Έ νλ/μΆμ/μ΄λλ κ²½μ° λ³νμ λ€μ μ μ©ν΄μΌ νλ€κ³ μκ°νμ§ μμ΅λλ€. λ€μκ³Ό κ°μ΄ μνλ κ²μ μ»μ μ μμ΄μΌ ν©λλ€.
μλλ©΄ μ΄λ κ²
syncTransformation() ν¨μ λλ μ΄μ μ μ¬ν κ²μΌλ‘ μ΄κ²μ λ μ½κ² λ§λ€ μ μμ΅λλ€.