Поддержание x и y для разных размеров экрана - PullRequest
0 голосов
/ 20 сентября 2019

enter image description here

У меня есть изображение с макетом сверху, в котором есть кнопки, добавленные в определенных координатах x и y.Как сделать так, чтобы на разных экранах все выровнялось одинаково, чтобы кнопки всегда находились в одном и том же положении относительно изображения независимо от экрана, а также как сохранить все положения, если ориентация горизонтальная.

1 Ответ

0 голосов
/ 20 сентября 2019

Я действительно специально создал класс или этот.Вы можете найти его здесь:

https://gist.github.com/nathan-fiscaletti/190a660620f6130e6a15962f59b21f22

Способ его использования следующий:

Замените ImageView в макете на SizeAwareImageView.

<com.my.app.SizeAwareImageView
        android:id="@+id/sizeAwareImageView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:scaleType="fitCenter"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/viewHeader"
        app:srcCompat="@drawable/somePicture" />

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

PointF location = sizeAwareImageView.getScaledCoordinateWithPadding(new PointF(10f, 10f));

// place the object at the location

Это будет держать ваши объекты в том же месте на основена рисование применяется к изображению.Независимо от того, на каком экране он находится, переменная location всегда будет указывать на одно и то же место на изображении .

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

/**
 * Update the map markers location and display it.
 *
 * @param mapPinLocation The new location.
 */
private void updateMarker(final PointF mapPinLocation) {
    markerContainer.removeView(mapMarker);

    PointF location = mapImageView
            .getScaledCoordinateWithPadding(mapPinLocation, 100f);

    if (getContext() != null) {
        int markerSize = (int) DisplayUtil.dpToPx(25, getContext());
        RelativeLayout.LayoutParams lp
                = new RelativeLayout.LayoutParams(markerSize, markerSize);

        // Android uses top left of the view for it's coords
        // so we need to center it at it's X/Y coords.
        if (location != null) {
            lp.topMargin = (int) location.y - (markerSize / 2);
            lp.leftMargin = (int) location.x - (markerSize / 2);
            mapMarker.setLayoutParams(lp);
            markerContainer.addView(mapMarker);
        }
    }
}

Надеюсь, это именно то, что вы искали.

...