Thanks all for the efforts Robin & et. al., I am trying to so something very similar - create a signature page.
Did you figure what was missing to get the erase and properly saved image here? thanks john On Wednesday, February 16, 2011 1:17:15 PM UTC-6, Robin Talwar wrote: > > Alright > > So now i have 2 classes in my application. > the one is the custom view extending view and has all touch events on key > down and on key up. > This view is being called in my main.xml through the package name. > The other one is my main class which has the code to call options menu. > One menu item is Save and if user clicks on it the bitmap image created by > the custom view is to be saved . > It is actually getting saved but it is showing just the background not the > changed bitmap image through the touch of the user. > > The custom view code is exactly the same as the FingerPaint class file in > api demos > > The only thing where i am getting stuck is now how to save the changed > bitmap image which is created by the users touch i can save the initial one > > The code of main class file is :- > package org.testCircle; > > import android.app.Activity; > import android.graphics.Bitmap; > import android.graphics.Canvas; > import android.os.Bundle; > import android.provider.MediaStore.Images; > import android.view.Menu; > import android.view.MenuItem; > import android.widget.TextView; > import android.widget.Toast; > > public class testCircle extends Activity { > TextView tv; > /** Called when the activity is first created. */ > @Override > public void onCreate(Bundle savedInstanceState) { > super.onCreate(savedInstanceState); > //setContentView(new customView(this)); > setContentView(R.layout.main); > } > public boolean onCreateOptionsMenu(Menu menu) { > super.onCreateOptionsMenu(menu); > > menu.add(0, 1, 0, "save").setShortcut('3', 'c'); > return true; > } > public boolean onPrepareOptionsMenu(Menu menu) { > super.onPrepareOptionsMenu(menu); > return true; > } > > @Override > public boolean onOptionsItemSelected(MenuItem item) { > switch (item.getItemId()) { > case 1: > //new ColorPickerDialog(this, this, mPaint.getColor()).show(); > fingerPaint cv = new fingerPaint(this); > Bitmap viewBitmap = Bitmap.createBitmap(cv.getWidth(), > cv.getHeight(),Bitmap.Config.ARGB_8888); > Canvas canvas = new Canvas(viewBitmap); > cv.draw(canvas); > String url = Images.Media.insertImage(getContentResolver(), > viewBitmap, "title", null); > Toast.makeText(testCircle.this, url, Toast.LENGTH_LONG).show(); > return true; > } > return super.onOptionsItemSelected(item); > } > } > > > and the Custom View is > > package org.testCircle; > > import android.content.Context; > import android.graphics.Bitmap; > import android.graphics.Canvas; > import android.graphics.Paint; > import android.graphics.Path; > import android.util.AttributeSet; > import android.view.MotionEvent; > import android.view.View; > > public class fingerPaint extends View { > Paint mPaint; > > private static final float MINP = 0.25f; > private static final float MAXP = 0.75f; > > private static Bitmap mBitmap; > private Canvas mCanvas; > private Path mPath; > private Paint mBitmapPaint; > > public fingerPaint(Context c) { > super(c); > mPaint = new Paint(); > mPaint.setAntiAlias(true); > mPaint.setDither(true); > mPaint.setColor(0xFFFF0000); > mPaint.setStyle(Paint.Style.STROKE); > mPaint.setStrokeJoin(Paint.Join.ROUND); > mPaint.setStrokeCap(Paint.Cap.ROUND); > mPaint.setStrokeWidth(12); > mBitmap = Bitmap.createBitmap(320, 480, Bitmap.Config.ARGB_8888); > mCanvas = new Canvas(mBitmap); > mPath = new Path(); > mBitmapPaint = new Paint(Paint.DITHER_FLAG); > } > > public fingerPaint(Context c , AttributeSet attrs){ > super(c , attrs); > mPaint = new Paint(); > mPaint.setAntiAlias(true); > mPaint.setDither(true); > mPaint.setColor(0xFFFF0000); > mPaint.setStyle(Paint.Style.STROKE); > mPaint.setStrokeJoin(Paint.Join.ROUND); > mPaint.setStrokeCap(Paint.Cap.ROUND); > mPaint.setStrokeWidth(12); > mBitmap = Bitmap.createBitmap(320, 480, Bitmap.Config.ARGB_8888); > mCanvas = new Canvas(mBitmap); > mPath = new Path(); > mBitmapPaint = new Paint(Paint.DITHER_FLAG); > } > > public void onerase(){ > mCanvas=null; > } > > @Override > protected void onSizeChanged(int w, int h, int oldw, int oldh) { > super.onSizeChanged(w, h, oldw, oldh); > } > > @Override > protected void onDraw(Canvas canvas) { > canvas.drawColor(0xFFAAAAAA); > > canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); > > canvas.drawPath(mPath, mPaint); > } > > private float mX, mY; > private static final float TOUCH_TOLERANCE = 4; > > private void touch_start(float x, float y) { > mPath.reset(); > mPath.moveTo(x, y); > mX = x; > mY = y; > } > private void touch_move(float x, float y) { > float dx = Math.abs(x - mX); > float dy = Math.abs(y - mY); > if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { > mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); > mX = x; > mY = y; > } > } > private void touch_up() { > mPath.lineTo(mX, mY); > // commit the path to our offscreen > mCanvas.drawPath(mPath, mPaint); > // kill this so we don't double draw > mPath.reset(); > } > > @Override > public boolean onTouchEvent(MotionEvent event) { > float x = event.getX(); > float y = event.getY(); > > switch (event.getAction()) { > case MotionEvent.ACTION_DOWN: > touch_start(x, y); > invalidate(); > break; > case MotionEvent.ACTION_MOVE: > touch_move(x, y); > invalidate(); > break; > case MotionEvent.ACTION_UP: > touch_up(); > invalidate(); > break; > } > return true; > } > > } > > > On Tue, Feb 15, 2011 at 6:35 PM, Marcin Orlowski > <webnet....@gmail.com<javascript:> > > wrote: > >> On 15 February 2011 13:10, Robin Talwar >> <r.o.b.i.n...@gmail.com<javascript:>> >> wrote: >> >> > Saving this bitmap and >> >> String path = Environment.getExternalStorageDirectory().toString(); >> OutputStream fOut = new FileOutputStream( new File(path, "filename.jpg) ); >> bitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut); >> fOut.flush(); >> fOut.close(); >> >> > Erase button to clear all the canvas so that user can again make >> signature >> > on clear screen. >> >> >> http://developer.android.com/reference/android/graphics/Canvas.html#drawRGB%28int,%20int,%20int%29 >> >> but again: do RTFM first as there are other options you may want to >> utilse (i.e. you may want to save as PNG instead of lossy JPEG) or >> simply to know whene you will be trying to reinvent the wheel. >> >> -- >> You received this message because you are subscribed to the Google >> Groups "Android Developers" group. >> To post to this group, send email to >> android-d...@googlegroups.com<javascript:> >> To unsubscribe from this group, send email to >> android-developers+unsubscr...@googlegroups.com <javascript:> >> For more options, visit this group at >> http://groups.google.com/group/android-developers?hl=en >> > > -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en