У меня есть экран с изображением 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()
}
Это скриншот
Мне удалось сохранить положение точек по размерам экрана с помощью тестовых координат, я не совсем уверен, как. Я подумал, что мне придется сделать некоторые преобразования значений 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
}
})