我使用的图像可以从图库中选择,也可以使用相机。我正在使用自定义视图进行缩放和自由手绘。我已经使用了画布和油漆来编辑它的图像,但我的问题是,当我们开始绘制触摸事件时,它被绘制但不是相同的x,y坐标它显示在很多触点之下。请帮助我如何改进我的代码以实现我的目标我的代码在这里...
public class EditImage extends Activity implements OnTouchListener{
TouchImageView edit_img;//custom image view
Bitmap bitmap;
String imagepath;
Bitmap alteredBitmap,alteredBitmap1;
Canvas canvas;
Paint paint;
Matrix matrix;
float downx = 0;
float downy = 0;
float upx = 0;
float upy = 0;
int count=0;
/** Called when the activity is first created. */
@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.editscreen2);
// TODO Auto-generated method stub
Button back_btn=(Button)findViewById(R.id.back_button);
back_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});
Intent extras=getIntent();
Uri imageFileUri = Uri.parse(extras.getStringExtra("imagepath"));
edit_img=(TouchImageView)findViewById(R.id.editimage);
Log.i("imagepath2",imageFileUri+"");
try {
BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
bmpFactoryOptions.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream
(imageFileUri), null, bmpFactoryOptions);
alteredBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap
.getHeight(), Config.ARGB_8888);
canvas = new Canvas(alteredBitmap);
paint = new Paint();
paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
paint.setDither(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(5);
matrix = new Matrix();
canvas.drawBitmap(bitmap, matrix, paint);
Drawable drawable = (Drawable)new BitmapDrawable(alteredBitmap);
edit_img.setBackgroundDrawable(drawable);
} catch (Exception e) {
Log.v("ERROR", e.toString());
}
edit_img.setOnTouchListener(this);
setfunction();
}
private void setfunction()
{
Button done_btn=(Button)findViewById(R.id.done);
done_btn.setVisibility(View.VISIBLE);
done_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String root = Environment.getExternalStorageDirectory().toString();
// File myDir = new File(root + "/saved_image);
String imagename = "Image.png";
File file = new File (root, imagename);
if (file.exists ()) file.delete ();
try {
FileOutputStream out = new FileOutputStream(file);
alteredBitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
Intent intent=new Intent(EditImage2.this,SaveImage.class);
intent.putExtra("imagepath",alteredBitmap);
startActivity(intent);
}
});
Button erase_btn=(Button)findViewById(R.id.erase);
erase_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
canvas.drawColor(0, Mode.CLEAR);
canvas.drawBitmap(bitmap,matrix, paint);
}
});
}
public boolean onTouch(View v, MotionEvent event) {
if(event.getPointerCount()>1)
{
edit_img.setMaxZoom(4f);
}
else
{
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
downx = event.getX();
downy = event.getY();
Log.i("touch points x,y",downx+"/"+downy);
break;
case MotionEvent.ACTION_MOVE:
upx = event.getX();
upy = event.getY();
Log.i("touch points upx,upy",upx+"/"+upy);
canvas.drawLine(downx, downy, upx, upy, paint);
downx = upx;
downy = upy;
Log.i("touch points x,y",downx+"/"+downy);
//edit_img.invalidate();
v.invalidate();
break;
case MotionEvent.ACTION_UP:
upx = event.getX();
upy = event.getY();
break;
case MotionEvent.ACTION_CANCEL:
break;
default:
break;
}
}
return true;
}
}
答案 0 :(得分:0)
您正在使用的坐标(来自event.getX/Y()
)与您认为的坐标无关。查看文档,和/或放置一些System.out.printlns
来验证这一点。
例如,您可能需要使用手动偏移(由画布绝对位置给出)。
对不起,我不是更具体:我已经离开Android很长一段时间了。这开始是一个评论,但有点长。