Android - Нарисуйте линию на растровом изображении в другом месте. - PullRequest
0 голосов
/ 20 апреля 2020

Я создаю графический редактор для Android, приложение будет содержать некоторые функции, одна из которых рисует линию (размер и цвет bru sh не имеют значения).

I уже выполнили линии, но, похоже, возникла проблема с onTouchEvent или инициалом растрового изображения.

Процесс выглядит следующим образом: пользователь нажимает кнопку -> пользователь выбирает изображение из галереи -> изображение загружается в ImageView и изменяется как растровое изображение

. Проблема заключается в следующем: при попытке нарисовать линию на экране событие касания «поворачивается» к указанному c месту в приложении. , как показано на связанном изображении ниже: https://www.imageupload.net/image/error.xlbW5

Теперь, чтобы показать некоторый код .. Вот как я определил свой ImageView (ничего необычного):

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="500dp"
        android:id="@+id/ChoosenImageView">
    </ImageView>

Мой код для загрузки изображения по растровому изображению:

    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);

        if (resultCode == RESULT_OK) {
            Uri imageFileUri = intent.getData();
            try {
                BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
                bmpFactoryOptions.inJustDecodeBounds = true;
                bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageFileUri), null, bmpFactoryOptions);

                bmpFactoryOptions.inJustDecodeBounds = false;
                bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageFileUri), null, bmpFactoryOptions);

                alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp
                        .getHeight(), bmp.getConfig());
                canvas = new Canvas(alteredBitmap);
                paint = new Paint();
                paint.setColor(Color.GREEN);
                paint.setStrokeWidth(15);
                matrix = new Matrix();
                canvas.drawBitmap(bmp, matrix, paint);

                choosenImageView.setImageBitmap(alteredBitmap);
                choosenImageView.setOnTouchListener(this);
            } catch (Exception e) {
                Log.v("ERROR", e.toString());
            }
        }
    }

My onTouch:

    public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                downx = event.getX();
                downy = event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                upx = event.getX();
                upy = event.getY();
                canvas.drawLine(downx, downy, upx, upy, paint);
                choosenImageView.invalidate();
                downx = upx;
                downy = upy;
                break;
            case MotionEvent.ACTION_UP:
                upx = event.getX();
                upy = event.getY();
                canvas.drawLine(downx, downy, upx, upy, paint);
                choosenImageView.invalidate();
                break;
            case MotionEvent.ACTION_CANCEL:
                break;
            default:
                break;
        }
        return true;
    }

Спасибо

1 Ответ

0 голосов
/ 20 апреля 2020

Ваше растровое изображение уменьшается до размеров изображения. Координаты события касания относятся к представлению изображения, но когда вы рисуете на растровом холсте, вы рисуете в растровых координатах (которые затем снова уменьшаются, чтобы соответствовать виду изображения, и это то, что вы видите).

Вам необходимо каким-то образом преобразовать масштабированные координаты в исходные растровые координаты. Вы можете сделать это несколькими способами, но один из способов - масштабировать растровое изображение до изображения с самого начала (а не полагаться на встроенное масштабирование изображения). Как то так:

    // For full display
    float dw = currentDisplay.getWidth();
    float dh = currentDisplay.getHeight();

    // Or for image view itself (but requires correct layout setup)
    float dw = imageView.getWidth()
    float dh = imageView.getHeight();

    BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
    bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageFileUri), null, bmpFactoryOptions);

    // etc, etc.

    alteredBitmap = Bitmap.createScaledBitmap(bmp, dw, dh, true);
    canvas = new Canvas(alteredBitmap);
...