Android 保存时,将添加的textview位置保留在imageview上
有一个带有两个按钮的主活动,一个是“添加文本”,另一个是“保存图像”。这是主布局的一部分:Android 保存时,将添加的textview位置保留在imageview上,android,canvas,bitmap,Android,Canvas,Bitmap,有一个带有两个按钮的主活动,一个是“添加文本”,另一个是“保存图像”。这是主布局的一部分: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <RelativeLayout &l
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<RelativeLayout <!-- cause i couldn't added textview on viewpager, i had to add a relativelayout -->
android:id="@+id/rlvViewImage"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1">
<android.support.v4.view.ViewPager
android:id="@+id/ivPager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" />
</RelativeLayout>
<LinearLayout ... <!-- Add text and Save image buttons are here. -->
例如,原始图像大小为1280*800,viewpager中显示的相对图像为(根据设备大小)1110*720。
我添加了一个文本视图并将其拖到某个地方;
如果我在relativeLayout上添加textview并使用rlt.draw(c),问题已解决但保存的图像大小等于显示的视图(1110*720)。
使用ratioW和ratioH会有一些帮助,但它们并不准确
private View.OnClickListener mBtnAddTextClicked = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (findViewById(R.id.addededttxtid1) == null)
addText();
}
};
private View.OnClickListener mBtnSaveToOutputClicked = new View.OnClickListener() {
@Override
public void onClick(View v) {
saveImage(mRlvViwImage);
}
};
final OnTouchListener mTxtTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
dragAddedTxtViw(event, v);
return false;
}
};
public void dragAddedTxtViw(MotionEvent event, View v) {
RelativeLayout.LayoutParams params =(android.widget.RelativeLayout.LayoutParams) v
.getLayoutParams();
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE: {
params.topMargin = (int) event.getRawY() - (v.getHeight());
params.leftMargin = (int) event.getRawX() - (v.getWidth() / 2);
v.setLayoutParams(params);
break;
}
case MotionEvent.ACTION_UP: {
params.topMargin = (int) event.getRawY() - (v.getHeight());
params.leftMargin = (int) event.getRawX() - (v.getWidth() / 2);
v.setLayoutParams(params);
break;
}
case MotionEvent.ACTION_DOWN: {
v.setLayoutParams(params);
break;
}
}
}
private void addText() {
mEdtText = new EditText(MainActivity.this);
mEdtText.setText(R.string.add_text_here);
mEdtText.setId(R.id.addededttxtid1);
mEdtText.setBackgroundColor(getResources().getColor(
android.R.color.transparent));
mEdtText.setOnTouchListener(mTxtTouchListener);
mEdtText.setLongClickable(false);
mRlvViwImage = new RelativeLayout(MainActivity.this);
mRlvViwImage = (RelativeLayout) findViewById(R.id.rlvViewImage);
mRlvViwImage.addView(mEdtText);
}
private void saveImage(View v) {
Bitmap textBitmap = null;
EditText mEdtTxtViw = null;
mEdtTxtViw = (EditText) findViewById(R.id.addededttxtid1);
mEdtTxtViw.setDrawingCacheEnabled(true);
mEdtTxtViw.buildDrawingCache(true);
textBitmap = mEdtTxtViw.getDrawingCache();
// I get original image here
Bitmap backBitmap = BitmapFactory.decodeFile(mPagerAdapter.getCurrentImage().getFileName());
Bitmap lastBitmap = Bitmap.createBitmap(backBitmap.getWidth(),
backBitmap.getHeight(), backBitmap.getConfig());
Canvas canvas = new Canvas(lastBitmap);
canvas.drawBitmap(backBitmap, 0, 0, null);
//Doesn't help too much.
float ratioW = (float)((float)backBitmap.getWidth()/(float)v.getWidth());
float ratioH = (float)((float)backBitmap.getHeight()/(float)v.getHeight());
/////////////////
canvas.drawBitmap(textBitmap, (float)((float)mEdtTxtViw.getLeft())*ratioW,(float)((float)mEdtTxtViw.getTop())*ratioH, null);
}
File myDir = new File(Environment.getExternalStorageDirectory()
+ File.separator);
myDir.mkdirs();
Random generator = new Random();
int n = 10000;
n = generator.nextInt(n);
String fname = "Image-" + n + ".jpg";
File file = new File(myDir, fname);
if (file.exists())
file.delete();
try {
FileOutputStream out = new FileOutputStream(file);
// Canvas c = new Canvas(bitmap);
// this.getResources().getDrawable(R.drawable.p).draw(c);
// v.draw(c);
boolean success = lastBitmap.compress(CompressFormat.PNG, 100, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}