计算x和y坐标

时间:2019-10-07 20:57:35

标签: android coordinates

我的屏幕上有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()
}

这是屏幕截图

enter image description here

我已经能够通过测试坐标来保持屏幕尺寸上各个点的位置,但我还不确定如何做到。我认为我将不得不对不同分辨率的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
        }
    })

0 个答案:

没有答案