I'm trying to draw on a user loaded bitmap. This is in onCreate
.
imageView = (ImageView) this.findViewById(R.id.ImageView);
Display currentDisplay = getWindowManager().getDefaultDisplay();
float dw = currentDisplay.getWidth();
float dh = currentDisplay.getHeight();
bitmap = Bitmap.createBitmap((int) dw, (int) dh,
Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
paint = new Paint();
paint.setColor(Color.BLUE);
imageView.setImageBitmap(bitmap);
imageView.setOnTouchListener(this);
Next code is when the user press a button to get the bitmap and after the bitmap is successfully retrieved. It is at the end of
"onActivityResult
"
canvas = new Canvas(bitmap);
paint = new Paint();
paint.setColor(Color.BLUE);
imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
imageView.setOnTouchListener(this);
I'm able to draw on the blank bitmap that is made during onCreate
, but when the user loads the new bitmap and try to draw it doesn't show. The new bitmap is loaded though.
I tired doing this too
canvas = new Canvas(BitmapFactory.decodeFile(picturePath));
then it gave me error.
Anyone know if i'm doing something wrong?
EDIT:THis is the log file:
10-25 03:19:31.409: W/System.err(1971): java.lang.Exception: java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
10-25 03:19:31.409: W/System.err(1971): at com.example.milestone2.Draw.onActivityResult(Draw.java:148)
10-25 03:19:31.409: W/System.err(1971): at android.app.Activity.dispatchActivityResult(Activity.java:5293)
10-25 03:19:31.409: W/System.err(1971): at android.app.ActivityThread.deliverResults(ActivityThread.java:3315)
10-25 03:19:31.409: W/System.err(1971): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3362)
10-25 03:19:31.409: W/System.err(1971): at android.app.ActivityThread.access$1100(ActivityThread.java:141)
10-25 03:19:31.419: W/System.err(1971): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282)
10-25 03:19:31.419: W/System.err(1971): at android.os.Handler.dispatchMessage(Handler.java:99)
10-25 03:19:31.419: W/System.err(1971): at android.os.Looper.loop(Looper.java:137)
10-25 03:19:31.428: W/System.err(1971): at android.app.ActivityThread.main(ActivityThread.java:5041)
10-25 03:19:31.428: W/System.err(1971): at java.lang.reflect.Method.invokeNative(Native Method)
10-25 03:19:31.428: W/System.err(1971): at java.lang.reflect.Method.invoke(Method.java:511)
10-25 03:19:31.428: W/System.err(1971): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
10-25 03:19:31.428: W/System.err(1971): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
10-25 03:19:31.428: W/System.err(1971): at dalvik.system.NativeStart.main(Native Method)
10-25 03:19:31.438: W/System.err(1971): Caused by: java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
10-25 03:19:31.448: W/System.err(1971): at android.graphics.Canvas.<init>(Canvas.java:127)
10-25 03:19:31.469: W/System.err(1971): at com.example.milestone2.Draw.onActivityResult(Draw.java:141)
10-25 03:19:31.469: W/System.err(1971): ... 13 more
10-25 03:19:31.588: E/SurfaceFlinger(37): ro.sf.lcd_density must be defined as a build property
To draw on a bitmap, use the image control's canvas and attach the mouse-event handlers to the appropriate events in the image control. Typically, you would use region operations (fills, rectangles, polylines, and so on). These are fast and efficient methods of drawing.
Canvas is the place or medium where perfroms/executes the operation of drawing, and Bitmap is responsible for storing the pixel of the picture you draw.
To create a bitmap object on a canvas C , use: id = C . create_bitmap( x , y , *options ...) which returns the integer ID number of the image object for that canvas.
You need to set the bitmap that is returned as the bitmap for the canvas. But BitmapFactory.decodeFile(picturePath)
returns an immutable bitmap. Convert this to a mutable bitmap and then set is to the canvas.
Try this:
Bitmap loadedBitmap = BitmapFactory.decodeFile(picturePath);
Bitmap drawableBitmap = loadedBitmap.copy(Bitmap.Config.ARGB_8888, true);
canvas = new Canvas(drawableBitmap);
paint = new Paint();
paint.setColor(Color.BLUE);
imageView.setImageBitmap(drawableBitmap);
imageView.setOnTouchListener(this);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With