如何使用Android中的Matrix在您的位置旋转imageview?

时间:2016-12-29 06:53:12

标签: java android matrix rotation imageview

我创建了具有捏缩放,平移和旋转的简单应用。他们工作得很好,但不是你所在位置的轮换。

我使用过Matrix类。

我的活动代码

public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
Matrix saveMatrix = new Matrix();
private ImageView viewImage;
private Button btnCapture;

private static final int RESULT_LOAD_IMAGE = 1;
private static final int REQUEST_IMAGE_CAPTURE = 2;
Matrix matrix = new Matrix();
private Uri mCapturedImageURI;
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;

PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;

private float d = 0f;
private float newRot = 0f;
private float[] lastEvent = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btnCapture = (Button) findViewById(R.id.btnCapture);
    viewImage = (ImageView) findViewById(R.id.viewImage);
    viewImage.setOnTouchListener(MainActivity.this);
    initListerner();
}

public void initListerner() {
    btnCapture.setVisibility(View.VISIBLE);
    btnCapture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            btnCapture.setVisibility(View.GONE);
            final Dialog dialog = new Dialog(MainActivity.this);
            dialog.setContentView(R.layout.custom_dialog_box);
            dialog.setTitle("Title...");
            Button dialogButton = (Button) dialog.findViewById(R.id.btnExit);
            dialogButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });
            Button btnChoosePath = (Button) dialog.findViewById(R.id.btnChoosePath);
            btnChoosePath.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    activeGallery();
                    dialog.dismiss();
                }
            });
            Button btnTakePhoto = (Button) dialog.findViewById(R.id.btnTakePhoto);
            btnTakePhoto.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    activeTakePhoto();
                    dialog.dismiss();
                }
            });
            dialog.show();
        }
    });
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    btnCapture.setVisibility(View.VISIBLE);
}

private void activeTakePhoto() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        String fileName = "temp.jpg";
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.TITLE, fileName);
        mCapturedImageURI = getContentResolver()
                .insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        values);
        takePictureIntent
                .putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}

private void activeGallery() {
    Intent intent = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(intent, RESULT_LOAD_IMAGE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case RESULT_LOAD_IMAGE:
            if (requestCode == RESULT_LOAD_IMAGE &&
                    resultCode == RESULT_OK && null != data) {
                Uri selectedImage = data.getData();
                String[] filePathColumn = {MediaStore.Images.Media.DATA};
                Cursor cursor = getContentResolver()
                        .query(selectedImage, filePathColumn, null, null,
                                null);
                cursor.moveToFirst();
                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                String picturePath = cursor.getString(columnIndex);
                cursor.close();

                viewImage.setImageBitmap(BitmapFactory.decodeFile(picturePath));
            }
        case REQUEST_IMAGE_CAPTURE:
            if (requestCode == REQUEST_IMAGE_CAPTURE &&
                    resultCode == RESULT_OK) {
                String[] projection = {MediaStore.Images.Media.DATA};
                Cursor cursor =
                        getContentResolver().query(mCapturedImageURI, projection, null,
                                null, null);
                int column_index_data = cursor.getColumnIndexOrThrow(
                        MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                String picturePath = cursor.getString(column_index_data);
                cursor.close();
                viewImage.setImageBitmap(BitmapFactory.decodeFile(picturePath));
            }
    }
}

@Override
public boolean onTouch(View v, MotionEvent motionEvent) {
    ImageView view = (ImageView) v;
    switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            saveMatrix.set(matrix);
            start.set(motionEvent.getX(), motionEvent.getY());
            mode = DRAG;
            lastEvent = null;
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            oldDist = spacing(motionEvent);
            if (oldDist > 10f) {
                saveMatrix.set(matrix);
                midPoint(mid, motionEvent);
                mode = ZOOM;
            }
            lastEvent = new float[4];
            lastEvent[0] = motionEvent.getX(0);
            lastEvent[1] = motionEvent.getX(1);
            lastEvent[2] = motionEvent.getY(0);
            lastEvent[3] = motionEvent.getY(1);
            d = rotation(motionEvent);
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
            mode = NONE;
            lastEvent = null;
            break;
        case MotionEvent.ACTION_MOVE:
            if (mode == DRAG) {
                matrix.set(saveMatrix);
                float dx = motionEvent.getX() - start.x;
                float dy = motionEvent.getY() - start.y;
                matrix.postTranslate(dx, dy);
            } else if (mode == ZOOM) {
                float newDist = spacing(motionEvent);
                if (newDist > 10f) {
                    matrix.set(saveMatrix);
                    float scale = (newDist / oldDist);
                    matrix.postScale(scale, scale, mid.x, mid.y);
                }
                if (lastEvent != null && motionEvent.getPointerCount() == 2) {
                    newRot = rotation(motionEvent);
                    float r = newRot - d;
                    float[] values = new float[9];
                    matrix.getValues(values);
                    float tx = values[2];
                    float ty = values[5];
                    float sx = values[0];
                    float xc = (view.getWidth() / 2) * sx;
                    float yc = (view.getHeight() / 2) * sx;
                    matrix.postRotate(r, tx + xc, ty + yc);
                }
            }
            break;
    }
    view.setImageMatrix(matrix);
    return true;
}

private float spacing(MotionEvent event) {
    float x = event.getX(0) - event.getX(1);
    float y = event.getY(0) - event.getY(1);
    return (float) Math.sqrt(x * x + y * y);
}

private void midPoint(PointF point, MotionEvent event) {
    float x = event.getX(0) + event.getX(1);
    float y = event.getY(0) + event.getY(1);
    point.set(x / 2, y / 2);
}

private float rotation(MotionEvent event) {
    double delta_x = (event.getX(0) - event.getX(1));
    double delta_y = (event.getY(0) - event.getY(1));
    double radians = Math.atan2(delta_y, delta_x);
    return (float) Math.toDegrees(radians);
}

}

0 个答案:

没有答案