Android Получить локальные координаты X, Y вида - PullRequest
1 голос
/ 12 марта 2020

Я пытаюсь получить локальные координаты вида, а затем я хочу выполнить матрицу PostTranslate для просмотра изображений. Я уже видел несколько сообщений, например Как получить абсолютные координаты вида Я не могу получить правильные координаты.

Я установил гравитацию макета на Bottom , в который я добавляю элементы.

 <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight=".4">
        <ImageView
            android:src="@drawable/Pointer"
            android:visibility="visible"
            android:scaleType="matrix"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/PostTranslateImage"/>

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:id="@+id/OverviewMarkerContainer"/>

    </FrameLayout>

Я добавляю несколько записей в линейный макет, а затем хочу установить вид изображения указателя сверху на самый верхний элемент в линейный макет.

Layout

Проблема: Я хочу получить значение Y для представления относительно линейного макета размера 40%. Получить Y не возвращает правильное значение, потому что гравитация была применена. Get Y вернет 0, но вместо этого из-за гравитации позиция была изменена. Я хочу получить Y там, где показан вид, чтобы я мог применить матрицу к изображению и переместить изображение к этому y.

Если я получу GetLocalVisibleRect или GetGlobalVisibleRect, они предоставляют значение, которое не является локальным для этого представления. например, GetGlobalVisibleRect предоставляет значение 2004 для Samsung Galaxy S10, но если я вручную установлю матрицу Y на 700, я едва смогу увидеть изображение, поэтому при установке этого значения изображение не отображается.

layout.ViewTreeObserver.GlobalLayout += (sender, args) =>
            {
                var matrix = waves.ImageMatrix;
                var scaleRatio = Resources.DisplayMetrics.WidthPixels / (float)waves.Drawable.IntrinsicWidth;
                matrix.SetScale(scaleRatio, scaleRatio);                

                Rect rectf = new Rect();
                var point = view3.GetGlobalVisibleRect(rectf);
                matrix.PostTranslate(0, point.TOP); //returns 0

                waves.ImageMatrix = matrix;
            };
...