Как установить границы для перемещения картинки
Столкнулся с проблемой ,что при перемещении картинки она может покинуть активную часть экрана ,т.е пропасть за пределами layout вот код разметки
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/font"
tools:context=".cs2.mapgranade.Activity_cs_map_granade">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="61dp"
android:background="@color/grey"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/backButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/arrow_back_svg"
android:layout_gravity="start"
android:paddingStart="8dp"
android:paddingEnd="8dp"
app:tint="@color/white" />
</androidx.appcompat.widget.Toolbar>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar">
<ImageView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
Вот сам код Activity
public class Activity_cs_map_granade extends AppCompatActivity {
private ScaleGestureDetector scaleGestureDetector;
private Float scaleFactor = 1.0f;
private Float x, y, dx, dy;
private String typeOfGranade;
private String mapName;
private ImageView mapImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cs_map_granade);
ImageView backButton = findViewById(R.id.backButton);
backButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
Intent intent = getIntent();
typeOfGranade = intent.getStringExtra("typeOfGranade");
mapName = intent.getStringExtra("mapName").toLowerCase();
mapImage = findViewById(R.id.mapView);
int imageResource = getResources().getIdentifier(mapName + "map", "drawable", getPackageName());
mapImage.setImageResource(imageResource);
scaleGestureDetector = new ScaleGestureDetector(this, new ScaleListener());
}
@Override
public boolean onTouchEvent(MotionEvent event) {
scaleGestureDetector.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x = event.getX();
y = event.getY();
break;
case MotionEvent.ACTION_MOVE:
dx = event.getX() - x;
dy = event.getY() - y;
mapImage.setX(mapImage.getX() + dx);
mapImage.setY(mapImage.getY() + dy);
x = event.getX();
y = event.getY();
break;
}
return true;
}
class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
scaleFactor *= detector.getScaleFactor();
scaleFactor = Math.max(0.1f, Math.min(scaleFactor, 10.0f));
// Get the initial width and height of the image
float initialWidth = mapImage.getWidth();
float initialHeight = mapImage.getHeight();
// Calculate the scaled width and height
float scaledWidth = initialWidth * scaleFactor;
float scaledHeight = initialHeight * scaleFactor;
// Check if the scaled dimensions are greater than or equal to the initial dimensions
if (scaledWidth >= initialWidth && scaledHeight >= initialHeight) {
mapImage.setScaleX(scaleFactor);
mapImage.setScaleY(scaleFactor);
}
return true;
}
}
}