Мое приложение имеет две кнопки. Один для выбора изображения из хранилища и загрузки его в ImageView. Я делаю это с помощью библиотеки Пикассо. Другая кнопка рисует точку на холсте. Я прикрепил детекторы поворота, масштабирования и перемещения в окне просмотра изображений.
Проблема в том, что сразу после того, как я рисую точку, я хочу, чтобы эта точка двигалась, когда я выполняю жест перемещения. Точно так же точка должна увеличиваться или уменьшаться, когда я выполняю жест масштаба. Но точка не движется вообще.
MainActivity.class
import android.app.Dialog;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.view.animation.RotateAnimation;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.almeros.android.multitouch.MoveGestureDetector;
import com.almeros.android.multitouch.RotateGestureDetector;
import com.github.chrisbanes.photoview.PhotoView;
import com.squareup.picasso.Picasso;
public class MainActivity extends AppCompatActivity {
private static final int PICK_IMAGE = 1;
ImageView marker_iv;
DrawImageView iv;
TextView tvFloor;
Button checkpointBt, selectBt;
RelativeLayout rootLayout;
private Matrix mMatrix = new Matrix();
private float mScaleFactor = 1f;
private float mRotationDegrees = 0.f;
private float mFocusX = 0.f;
private float mFocusY = 0.f;
private int mAlpha = 255;
private int mImageHeight, mImageWidth;
private ScaleGestureDetector mScaleDetector;
private RotateGestureDetector mRotateDetector;
private MoveGestureDetector mMoveDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
setListeners();
}
private void initViews() {
iv = findViewById(R.id.main_iv);
tvFloor = findViewById(R.id.floormain_tv);
marker_iv = findViewById(R.id.marker_iv);
checkpointBt = findViewById(R.id.check_bt);
selectBt = findViewById(R.id.select_bt);
rootLayout = findViewById(R.id.root);
mFocusX = rootLayout.getWidth() / 2;
mFocusY = rootLayout.getHeight() / 2;
mScaleDetector = new ScaleGestureDetector(getApplicationContext(), new
ScaleListener());
mRotateDetector = new RotateGestureDetector(getApplicationContext(), new
RotateListener());
mMoveDetector = new MoveGestureDetector(getApplicationContext(), new
MoveListener());
}
private void setListeners() {
iv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mScaleDetector.onTouchEvent(event);
mRotateDetector.onTouchEvent(event);
mMoveDetector.onTouchEvent(event);
float scaledImageCenterX = (mImageWidth * mScaleFactor) / 2;
float scaledImageCenterY = (mImageHeight * mScaleFactor) / 2;
mMatrix.reset();
mMatrix.postScale(mScaleFactor, mScaleFactor);
mMatrix.postRotate(mRotationDegrees, scaledImageCenterX,
scaledImageCenterY);
mMatrix.postTranslate(mFocusX - scaledImageCenterX, mFocusY -
scaledImageCenterY);
ImageView view = (ImageView) v;
view.setImageMatrix(mMatrix);
view.setAlpha(mAlpha);
return true;
}
});
checkpointBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
iv.x = marker_iv.getX() + 45;
iv.y = marker_iv.getY() + 45;
iv.invalidate();
iv.drawRect = true;
}
});
selectBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(
Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, PICK_IMAGE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable
Intent data) {
if (requestCode == PICK_IMAGE & resultCode == RESULT_OK) {
if (requestCode == PICK_IMAGE && resultCode == RESULT_OK && null !=
data) {
Uri selectedImage = data.getData();
Picasso.get().load(selectedImage).noPlaceholder().into(iv);
mImageWidth = iv.getWidth();
mImageHeight = iv.getWidth();
float scaledImageCenterX = (mImageWidth * mScaleFactor) / 2;
float scaledImageCenterY = (mImageHeight * mScaleFactor) / 2;
mMatrix.postScale(mScaleFactor, mScaleFactor);
mMatrix.postTranslate(mFocusX - scaledImageCenterX, mFocusY -
scaledImageCenterY);
iv.setImageMatrix(mMatrix);
showTheDialog();
}
}
}
private void showTheDialog() {
final Dialog d = new Dialog(this);
d.setContentView(R.layout.floornamedialog);
d.setCancelable(false);
final EditText enteredFloor = d.findViewById(R.id.floor_et);
Button dialogButton = d.findViewById(R.id.floor_bt);
dialogButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String str = enteredFloor.getText().toString();
tvFloor.setText("Floor Name: " + str);
d.dismiss();
}
});
d.show();
}
private class ScaleListener extends
ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
mScaleFactor *= detector.getScaleFactor(); // scale change since
previous event
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f));
/* iv.setScaleX(mScaleFactor);
iv.setScaleX(mScaleFactor);*/
return true;
}
}
private class RotateListener extends
RotateGestureDetector.SimpleOnRotateGestureListener {
@Override
public boolean onRotate(RotateGestureDetector detector) {
mRotationDegrees -= detector.getRotationDegreesDelta();
// iv.setRotation(mRotationDegrees);
return true;
}
}
private class MoveListener extends
MoveGestureDetector.SimpleOnMoveGestureListener {
@Override
public boolean onMove(MoveGestureDetector detector) {
PointF d = detector.getFocusDelta();
mFocusX += d.x;
mFocusY += d.y;
/* iv.setX(mFocusX);
iv.setY(mFocusY);*/
return true;
}
}
}
DrawImageView.java
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.widget.ImageView;
@SuppressLint("AppCompatCustomView")
public class DrawImageView extends ImageView {
private Paint currentPaint;
public boolean drawRect = false;
public float x;
public float y;
public Bitmap newBitmap;
public Matrix matrix;
public DrawImageView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
currentPaint = new Paint();
currentPaint.setDither(true);
currentPaint.setColor(0xFF00CC00);
currentPaint.setStyle(Paint.Style.STROKE);
currentPaint.setStrokeJoin(Paint.Join.ROUND);
currentPaint.setStrokeCap(Paint.Cap.ROUND);
currentPaint.setStrokeWidth(60);
}
public void setNewBitmap(Bitmap bmp){
newBitmap = bmp;
}
public Bitmap getNewBitmap(){
return newBitmap;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(drawRect){
canvas.drawPoint(x,y,currentPaint);
//canvas.drawBitmap(newBitmap,new Matrix(),null);
//canvas.drawColor(0, PorterDuff.Mode.CLEAR);
}
}
}
Images-
- Это сразу после того, как я выбрал изображение из галереи и загрузил его в просмотр изображений
- Это сразу после нажатия кнопки «Добавить контрольную точку». Зеленая точка появляется
- Это когда я переместил изображение. Точка остается там. Я хочу, чтобы он двигался с растровым изображением