我正在从事具有图像编辑活动的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;
}