Расчет координат x и y - PullRequest
       4

Расчет координат x и y

0 голосов
/ 07 октября 2019

У меня есть экран с изображением 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 х 60. Оба из них должны заканчиваться значением x 133 и значением y 164 для положения центра кнопки, поэтому при настройке параметров макета я предполагаю, что я бы установил его на 103, 134. Это относительно 800 x 800image.

Не уверен, имеет ли это смысл. В настоящее время у меня есть этот беспорядок, чтобы попытаться выяснить правильные позиции. Это не правильный способ сделать это, но мне трудно понять, как добиться результата.

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
        }
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...