Я пытаюсь получить локальные координаты вида, а затем я хочу выполнить матрицу 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>
Я добавляю несколько записей в линейный макет, а затем хочу установить вид изображения указателя сверху на самый верхний элемент в линейный макет.
Проблема: Я хочу получить значение 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;
};