我的屏幕上有800 x 800的图像。当用户触摸布局时,它上面还有一个容器布局,它在该位置向布局添加了一个按钮。
我遇到的问题是我将它们全部放在缩放布局容器中,以便用户可以放大和缩小图像。
我有类似
的值设备1(720 x 1480)
actionbarhght 112
zoom 1.0
realzoom 0.9
X coordinate 132
Y coordinate 483
Pan X 0
Pan Y 187
ScaledPan X 0 (the panx value multiplied by the realzoom)
ScaledPan Y 168 (the pany value multiplied by the realzoom)
Viewcoords X 0 (this is from getLocationOnScreen())
Viewcoords Y 367 (this is from getLocationOnScreen())
设备2(1440 x 2560)
actionbarhght 196
zoom 1.0
realzoom 1.8
X coordinate 239
Y coordinate 781
Pan X 0
Pan Y 105
ScaledPan X 0 (the panx value multiplied by the realzoom)
ScaledPan Y 189 (the pany value multiplied by the realzoom)
Viewcoords X 0 (this is from getLocationOnScreen())
Viewcoords Y 541 (this is from getLocationOnScreen())
这两个都是因为按下图像上的同一点。图像上的点是图像上的(x:133,y:164),因此我一直在尝试在不同的屏幕/平板电脑上实现该值
按钮的尺寸为60 x 60。对于按钮的中心位置,这两个都应以x值133和y值164结束,因此在设置布局参数时,我假设我会将其设置为103、134。这是相对于800 x 800而言的图片。
不确定这是否有意义。我目前有这样的混乱,试图找出正确的位置。这不是正确的方法,但是我在理解如何获得结果方面遇到了一些困难。
fun getCoordinatePostions(damagePoint: DamagePoints) {
var xPos = 0f
var yPos = 0f
if (damagePoint.zoom == 1f && damagePoint.realZoom > 1f) {
Log.d(TAG, " 1")
xPos = ((damagePoint.xPosition - damagePoint.panX) * (1 / damagePoint.realZoom)) - 30
yPos = ((((damagePoint.yPosition - damagePoint.panY) * (1 / damagePoint.realZoom)) - damagePoint.actionbarHeight ) * (damagePoint.realZoom/1.8)).toFloat()
} else if (damagePoint.zoom == 1f && damagePoint.realZoom < 1f) {
Log.d(TAG, " 2")
xPos = ((damagePoint.xPosition * (1 / damagePoint.realZoom)) - damagePoint.viewCoords[0]) - 30
yPos = (damagePoint.yPosition - damagePoint.viewCoords[1]) * (1/damagePoint.realZoom)
} else if (damagePoint.zoom == 1f && damagePoint.realZoom == 1f) {
Log.d(TAG, " 3")
xPos = ((damagePoint.xPosition) * (1 / damagePoint.realZoom) - damagePoint.viewCoords[0]) - 30
yPos = ((damagePoint.yPosition) * (1 / damagePoint.realZoom) - damagePoint.viewCoords[1])
} else if (damagePoint.zoom < damagePoint.realZoom && damagePoint.realZoom > 1f) {
Log.d(TAG, " 4")
xPos = ((damagePoint.xPosition - damagePoint.panX) * (1 / damagePoint.realZoom)) - 30
yPos = ((damagePoint.yPosition - damagePoint.panY + damagePoint.actionbarHeight - damagePoint.viewCoords[1] - 30) * (1 / damagePoint.realZoom))
} else if (damagePoint.zoom > damagePoint.realZoom && damagePoint.realZoom > 1f) {
Log.d(TAG, " 5")
if (context.resources.getBoolean(R.bool.isTablet)) {
xPos = ((damagePoint.xPosition - damagePoint.panX) * (1 / damagePoint.realZoom)) - 30
yPos = (damagePoint.yPosition - damagePoint.panY - damagePoint.viewCoords[1] - damagePoint.actionbarHeight + 30) * (1/damagePoint.realZoom)
} else {
xPos = ((damagePoint.xPosition - damagePoint.panX) * (1 / damagePoint.realZoom)) - 30
yPos = (damagePoint.yPosition - damagePoint.panY - damagePoint.viewCoords[1] + damagePoint.actionbarHeight + 30) * (1/damagePoint.realZoom)
}
} else if (damagePoint.zoom > damagePoint.realZoom && damagePoint.realZoom < 1f) {
Log.d(TAG, " 6")
xPos = ((damagePoint.xPosition - damagePoint.panX) * (1 / damagePoint.realZoom)) - 30
yPos = ((damagePoint.yPosition - damagePoint.panY) * (1 / damagePoint.realZoom) - damagePoint.viewCoords[1]) - damagePoint.actionbarHeight
} else if (damagePoint.zoom > damagePoint.realZoom && damagePoint.realZoom < 1f) {
Log.d(TAG, " 7")
xPos = ((damagePoint.xPosition - damagePoint.panX) * (1 / damagePoint.realZoom)) - 30
yPos = ((damagePoint.yPosition - damagePoint.panY) * (1 / damagePoint.realZoom)) - damagePoint.actionbarHeight
} else if (damagePoint.realZoom < 1f) {
Log.d(TAG, " 8")
xPos = ((damagePoint.xPosition - damagePoint.panX) * (1 / damagePoint.realZoom))
yPos = (damagePoint.yPosition - (damagePoint.panY * 1 / damagePoint.realZoom)) - damagePoint.actionbarHeight
} else {
Log.d(TAG, " 9")
xPos = (damagePoint.xPosition - damagePoint.viewCoords[0]).toFloat()
yPos = (damagePoint.yPosition - damagePoint.viewCoords[1]).toFloat()
}
damagePoint.xPosition = xPos.toInt()
damagePoint.yPosition = yPos.toInt()
}
这是屏幕截图
我已经能够通过测试坐标来保持屏幕尺寸上各个点的位置,但我还不确定如何做到。我认为我将不得不对不同分辨率的x和y值进行一些转换。是将它们添加到addOnPreDrawListener中的原因吗?
vto.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
mSheetImgView!!.getViewTreeObserver().removeOnPreDrawListener(this)
verticalDim = mSheetImgView!!.getMeasuredHeight()
horizontalDim = mSheetImgView!!.getMeasuredWidth()
val parms = FrameLayout.LayoutParams(horizontalDim, verticalDim)
parms.gravity = Gravity.CENTER
mSheetImgView!!.setLayoutParams(parms)
mTouchView!!.setLayoutParams(parms)
mTouchView!!.removeAllViews()
mSheetImgView?.getLocationOnScreen(viewCoords)
testPoints.forEach { controller?.addDamageButton(damagePoint = it) }
return true
}
})