Friday 9 August 2013

Drawing does not remain on view after clearing canvas

Drawing does not remain on view after clearing canvas

I tried to create a drawing board.Following is my code
DrawingBoard.java
public class DrawingBoard extends View {
private static final float TOUCH_TOLERANCE = 4;
private float startX = 0;
private float startY = 0;
private Bitmap bitmap = null;
private Canvas canvas = null;
private Path path = null;
private Paint paint = null;
private Paint bitmapPaint = null;
public Paint getPaint() {
return paint; // returning paint.
}
public void setPaint(Paint paint) {
this.paint = paint; // Assigning to this.paint.
}
public DrawingBoard(Context context) {
super(context);
bitmap = Bitmap.createBitmap(320, 480, Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
path = new Path();
bitmapPaint = new Paint(Paint.DITHER_FLAG);
}
public Bitmap getBitmap() {
return bitmap; // returning bitmap.
}
public void setBitmap(Bitmap bitmap) {
this.bitmap = bitmap; // Assigning to this.bitmap.
}
/*
* (non-Javadoc)
*
* @see android.view.View#onSizeChanged(int, int, int, int)
*/
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
}
/*
* (non-Javadoc)
*
* @see android.view.View#onDraw(android.graphics.Canvas)
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(0xFFAAAAAA);
canvas.drawBitmap(bitmap, 0, 0, bitmapPaint);
canvas.drawPath(path, paint);
}
public void clearCanvas(){
bitmap = Bitmap.createBitmap(320, 480 , Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
path = new Path();
paint = getPaint();
startX = 0;
startY = 0;
invalidate();
}
/*
* (non-Javadoc)
*
* @see android.view.View#onTouchEvent(android.view.MotionEvent)
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
touchStop();
invalidate();
break;
case MotionEvent.ACTION_DOWN:
touchStart(x, y);
invalidate();
break;
case MotionEvent.ACTION_MOVE:
touchMove(x, y);
invalidate();
break;
}
return true;
}
private void touchStart(float x, float y) {
path.reset();
path.moveTo(x, y);
startX = x;
startY = y;
}
private void touchMove(float x, float y) {
float dx = Math.abs(x - startX);
float dy = Math.abs(y - startY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
path.quadTo(startX, startY, (x + startX) / 2, (y + startY) / 2);
startX = x;
startY = y;
}
}
private void touchStop() {
path.lineTo(startX, startY);
canvas.drawPath(path, paint);
path.reset();
}
}
MainActivity.java
public class MainActivity extends Activity implements
OnColorChangedListener {
private DrawingBoard drawingBoard = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setDither(true);
paint.setColor(0xFFFF0000);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(3);
drawingBoard = new DrawingBoard(this);
drawingBoard.setPaint(paint);
drawingBoard.setDrawingCacheEnabled(true);
setContentView(drawingBoard);// R.layout.activity_main);
}
@Override
public void colorChanged(int color) {
drawingBoard.getPaint().setColor(color);
}
private void showGalleryImages(){
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(Intent.createChooser(intent, "Select
Picture"), 1000);
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == 1000) {
Uri selectedImageUri = data.getData();
if (selectedImageUri != null) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = context.getContentResolver().query(uri,
projection,null, null, null);
int column_index =
cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String imagePath = cursor.getString(column_index);
try {
cursor.close();
} catch (Exception e) {
}
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
Bitmap bitmap = loadBitmap(imagePath,
getImageOrientation(selectedImageUri),displayMetrics.widthPixels,
displayMetrics.heightPixels); //
BitmapFactory.decodeFile(selectedImagePath);
if (bitmap != null) {
drawingBoard.clearCanvas();
drawingBoard.setBitmap(bitmap.copy(Bitmap.Config.ARGB_8888,
true));
}
}
}
}
private int getImageOrientation(Uri imageUri) {
int orientation = -1;
try {
Cursor cursor = context.getContentResolver().query(imageUri,
new String[] { MediaStore.Images.Media.ORIENTATION },
null,
null, null);
try {
if (cursor != null && cursor.getCount() > 0) {
cursor.moveToFirst();
orientation = cursor.getInt(0);
} else {
orientation = -1;
}
} catch (Exception e) {
orientation = -1;
} finally {
if (cursor != null) {
cursor.close();
}
}
} catch (Exception e) {
}
return orientation;
}
private Bitmap loadBitmap(String filePath, int orientation, int width,
int height) {
Bitmap bitmap = null;
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
int scale = 1;
// calculate scale only if the height or width of
// the image exceeds the required value.
if ((options.outWidth > width)
|| (options.outHeight > height)) {
// calculate scale with respect to the smaller dimension
if (options.outWidth < options.outHeight) {
scale = Math
.round((float) options.outWidth / width);
} else {
scale = Math.round((float) options.outHeight
/ height);
}
}
options.inSampleSize = scale;
options.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeFile(filePath, options);
if (orientation > 0) {
Matrix matrix = new Matrix();
matrix.postRotate(orientation);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
bitmap.getHeight(), matrix, true);
}
} catch (Exception e) {
bitmap = null;
}
return bitmap;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/*
* (non-Javadoc)
*
* @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
drawingBoard.getPaint().setXfermode(null);
drawingBoard.getPaint().setAlpha(0xFF);
switch (item.getItemId()) {
//create new drawing board
case R.id.action_create:
drawingBoard.clearCanvas();
drawingBoard.setBitmap(Bitmap.createBitmap(320, 480,
Bitmap.Config.ARGB_8888));
drawingBoard.invalidate();
break;
//set color
case R.id.action_color:
new ColorPickerDialog(this, this, drawingBoard.getPaint()
.getColor()).show();
break;
//edit an existing image
case R.id.action_edit:
showGalleryImages();
break;
}
return super.onOptionsItemSelected(item);
}
}
I tried to create this app following an android sample in ApiDemos. My
issue is that when selects 'Create' or 'Edit' manu and try to draw the
drawing does not remain in the view. It become disappears when removing
touch. I am stuck on this issue.How can i fix this problem?
Thanks in Advance

No comments:

Post a Comment