Я действительно специально создал класс или этот.Вы можете найти его здесь:
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);
}
}
}
Надеюсь, это именно то, что вы искали.