Android - определить заданные c координаты x и y на виде при использовании ImageView scaleType = "centerCrop" в соответствии с исходным изображением - PullRequest
0 голосов
/ 10 апреля 2020

есть проблема, и вам нужна помощь! В моем приложении необходимо нарисовать стрелку в указанном c положении (например, x = 500, y = 500) в соответствии с исходным растровым изображением (например, ширина: 1230 высота: 2320). Как я могу рассчитать положение стрелки в моем imageView, если я использую scaleType = "centerCrop" и указать c ширину и высоту ImageView? Спасибо за помощь!

class ArrowLayout : RelativeLayout {
    lateinit var currentEmotion: EmotionEnums
    private var xOffset: Float = 0f
    private var yOffset: Float = 0f

    constructor(context: Context) : this(context, null, 0)
    constructor(context: Context, att: AttributeSet?) : this(context, att, 0)
    constructor(context: Context, att: AttributeSet?, def: Int) : super(context, att, def) {
        initLayout()
    }

    private fun initLayout() {
        View.inflate(context, R.layout.content_arrow_layout, this)
    }

    fun showImage(bitmap: Bitmap) {
        findViewById<ImageView>(R.id.emotionImage).setImageBitmap(bitmap)
        post {
            xOffset =
                if (bitmap.width >= this.width) -((bitmap.width - this.width) / 2).toFloat()
                else ((this.width - bitmap.width) / 2).toFloat()
            yOffset =
                if (bitmap.height >= this.height) -((bitmap.height - this.height) / 2).toFloat()
                else ((this.height - bitmap.height) / 2).toFloat()
            drawArrows()
        }
    }

    private fun drawArrows() {
        addView(ImageView(context).apply {
            layoutParams = LayoutParams(30, 55)
            setImageResource(R.drawable.arrow_oblique_right_green)
            x = 500 + xOffset
            y = 600 + yOffset
            requestLayout()
        })
    }
}

xml зрения

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/emotionImage"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        tools:ignore="ContentDescription" />
</RelativeLayout>

1 Ответ

0 голосов
/ 10 апреля 2020

Центр обрезки означает, что изображение будет отцентрировано, а затем обрезано снаружи. Таким образом, если изображение - imgHeight x imgWidth, представление - viewHeight x viewWidth, а пиксель, на который вы хотите указать, - это x, y на изображении

, если imgHeight> viewHeight, математика:

y-(imgHeight-viewHeight)/2

Фактически уменьшаем y на величину картинки, обрезанной сверху (что составляет половину разницы в высоте, другая половина обрезается снизу). Если этот ответ отрицательный или больше, чем viewHeight, стрелка указывает за пределы экрана (она обрезана).

, если imgHeight <= viewHeight, математика: </p>

y+(viewHeight- imageHeight)/2

В основном добавление нижнего отступа на высоту просмотра. Нижний отступ должен быть вдвое меньше разницы в высоте.

Направление х получается таким же, но с х и шириной.

...