I used an image that we can select from the gallery or perhaps use a camera. I use a custom view of scaling and drawing on it. I used canvas and paint for editing on the image, but this is due to the fact that when we start drawing on a touch event, it is painted, but not the same x, y coordinates its display under a set of touch points. Please help me how to improve my code to achieve my goal, my code is here ...
public class EditImage extends Activity implements OnTouchListener{
TouchImageView edit_img;
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;
@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.editscreen2);
Button back_btn=(Button)findViewById(R.id.back_button);
back_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
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) {
String root = Environment.getExternalStorageDirectory().toString();
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) {
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);
v.invalidate();
break;
case MotionEvent.ACTION_UP:
upx = event.getX();
upy = event.getY();
break;
case MotionEvent.ACTION_CANCEL:
break;
default:
break;
}
}
return true;
}
}
user1217720
source
share