Как правильно нарисовать растровое изображение повернутого вида на другом растровом изображении? - PullRequest
0 голосов
/ 31 октября 2018

Я работаю над проектом Android с редактированием изображений. Растровое изображение ImageView может иметь наложение растрового изображения вида (EditText или другого изображения, импортированного из галереи) (кэш чертежа). Пользователь может переместить Edittext вокруг ImageView и поместить куда-нибудь, а затем нажать кнопку, чтобы нарисовать кэш рисования EditText на растровом изображении ImageView (в этом точном месте).

Теперь, казалось, все работало нормально, пока я не решил добавить вращение функция на Edittext. Bitmap очень хорошо печатает на изображении, когда оно находится на 0 градусов, 180 и 360. Но когда это другое значение, bitmap печатается вдали от того места, где пользователь поместил Edittext (оно должно быть напечатано на изображении, где пользователь разместил, а не от него).

Пожалуйста, посмотрите на мой код и предложите решение. Что я делаю неправильно? Есть ли лучший подход к этому?

Framelayout, который содержит Edittext для печати на изображении, также имеет некоторые другие ImageButton.

<FrameLayout
            android:id="@+id/mFrameLayoutTextContainer"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true"
            android:visibility="gone">

            <EditText
                android:id="@+id/mEditTextEnterText"
                style="@style/OverlayText"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_margin="10dp"
                android:background="@drawable/container_border"
                android:backgroundTint="@color/colorBlue"
                android:imeOptions="actionDone"
                android:inputType="text|textMultiLine"
                android:padding="10dp"
                android:text="Enter Text here"
                android:textAlignment="center"
                android:textColor="@android:color/white"
                android:textSize="30dp" />

            <ImageButton
                android:id="@+id/mImageButtonMoveText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="top|right"
                android:background="@android:color/transparent"
                android:padding="0dp"
                android:src="@drawable/ic_move" />

            <ImageButton
                android:id="@+id/mImageButtonHorizontalSize"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center|right"
                android:background="@color/colorTransparent"
                android:src="@drawable/ic_size_notch" />

            <ImageButton
                android:id="@+id/mImageButtonVerticalSize"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center|bottom"
                android:background="@color/colorTransparent"
                android:src="@drawable/ic_size_notch" />

            <ImageButton
                android:id="@+id/mImageButtonCommitText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="top|left"
                android:background="@color/colorTransparent"
                android:src="@drawable/ic_check_circle" />


        </FrameLayout>

Внутри "onTouch".

 if (view == mImageButtonMoveText) {

            switch (event.getAction()) {

                case MotionEvent.ACTION_DOWN:

                    dXLoc = view.getX() - event.getRawX();
                    dYLoc = view.getY() - event.getRawY();

                    break;

                case MotionEvent.ACTION_MOVE:

                    mFrameLayoutTextContainer.setY(event.getRawY() + dYLoc - mImageButtonMoveText.getTop() + lastY);
                    mFrameLayoutTextContainer.setX(event.getRawX() + dXLoc - mImageButtonMoveText.getLeft() + lastX);

                    actualX = mEditTextEnterText.getX() + mFrameLayoutTextContainer.getX();
                    actualY = mEditTextEnterText.getY() + mFrameLayoutTextContainer.getY();

                    break;

                default:

                    lastX = mFrameLayoutTextContainer.getX();
                    lastY = mFrameLayoutTextContainer.getY();

                    return false;
            }
        }

Пользователь может изменить поворот FrameLayout, содержащего EditText, который записывается следующим образом:

public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

                mFrameLayoutTextContainer.setRotation(Math.round(seekBar.getProgress() * 3.60));
                mTextViewTextRotation.setText("" + Math.round(seekBar.getProgress() * 3.60));

            }

Поворот и X, Y координаты EditText используются для печати EditText на изображении следующим образом.

 if (view == mImageButtonCommitText) {

            ColorFilter tint = mEditTextEnterText.getBackground().getColorFilter();
            mEditTextEnterText.setBackgroundColor(Color.TRANSPARENT);
            mEditTextEnterText.setDrawingCacheEnabled(false);
            mEditTextEnterText.setDrawingCacheEnabled(true);

            mEditTextEnterText.buildDrawingCache();

            Matrix matrix = new Matrix();
            matrix.postRotate(Math.round(mSeekBarTextRotation.getProgress() * 3.60));

            Bitmap bitmap1 = mEditTextEnterText.getDrawingCache();

            //matrix.postTranslate(-bitmap1.getWidth() / 2, -bitmap1.getHeight() / 2);
            bitmap1 = Bitmap.createBitmap(bitmap1, 0, 0, bitmap1.getWidth(), bitmap1.getHeight(), matrix, true);
            Bitmap bitmap = ((BitmapDrawable) mImageViewMemeViewer.getDrawable()).getBitmap();

            mEditTextEnterText.setBackground(ContextCompat.getDrawable(this, R.drawable.container_border));
            mEditTextEnterText.getBackground().setColorFilter(tint);

            Bitmap[] listBmp = {bitmap, bitmap1};
            Bitmap mergedImg = overlay(listBmp[0], listBmp[1]);

            mImageViewMemeViewer.setImageBitmap(mergedImg);
            mListBitmapHistory.add(mergedImg);

            changes++;
            userOn++;

        }

Используя этот метод наложения:

private Bitmap overlay(Bitmap bmp1, Bitmap bmp2) {

        Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());
        Canvas canvas = new Canvas(bmOverlay);

        canvas.drawBitmap(bmp1, new Matrix(), null);
        canvas.drawBitmap(bmp2, (actualX), (actualY), null);

        Log.v(TAG, "Actual X : " + actualX + " Y : " + actualY);
        Log.v(TAG, "Rotation : " + Math.round(mSeekBarTextRotation.getProgress() * 3.60));

        return bmOverlay;

    }
...