Я работаю над проектом 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;
}