В Android, когда я рисую точку на холсте, она не остается на растровом изображении, когда я перемещаю, масштабирую или поворачиваю растровое изображение - PullRequest
0 голосов
/ 30 октября 2018

Мое приложение имеет две кнопки. Один для выбора изображения из хранилища и загрузки его в 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-

  • Это сразу после того, как я выбрал изображение из галереи и загрузил его в просмотр изображений

This is right after I selected an image from gallery and load it into imageview

  • Это сразу после нажатия кнопки «Добавить контрольную точку». Зеленая точка появляется

This is right after I press the 'Add checkpoint button'. The green dot appears

  • Это когда я переместил изображение. Точка остается там. Я хочу, чтобы он двигался с растровым изображением

This is when I moved the image. The dot stays there. I want it to move with the bitmap

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...