如何在另一个位图上正确绘制旋转视图的位图?

时间:2018-10-31 20:40:01

标签: java android image-processing bitmap android-edittext

我正在从事具有图像编辑活动的android项目。 ImageView的位图可以覆盖视图(EditText或从图库中导入的其他图像)位图(绘图缓存)的覆盖。用户可以在Edittext上移动ImageView并将其放置到某个位置,然后点击一个按钮以在ImageView的位图上(在该确切位置上)绘制EditText的Drawing缓存。

现在,在我决定增加轮换之前,一切似乎都工作正常  Edittext上的功能。 Bitmap在0度,180和360度的图像上打印效果很好。但是,当bitmap是其他值时,则将Edittext打印在用户放置{{1}的地方}(它必须打印在用户放置的图像上,并且不能远离它)。

请查看我的代码并提出解决方案。我究竟做错了什么?有更好的方法吗?

包含要在图像上打印的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;
            }
        }

用户可以更改包含EditText的FrameLayout的旋转,其记录如下:

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));

            }

EditText的旋转和X,Y坐标用于在图像上打印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;

    }

0 个答案:

没有答案