当前位置: 动力学知识库 > 问答 > 编程问答 >

image - Android Save Drawing /

问题描述:

In the API Demos is a drawing example called FingerPaint.

package com.example.android.apis.graphics;

import android.content.Context;

import android.graphics.*;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.view.MotionEvent;

import android.view.View;

public class FingerPaint extends GraphicsActivity

implements ColorPickerDialog.OnColorChangedListener {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(new MyView(this));

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);

mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 },

0.4f, 6, 3.5f);

mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);

}

private Paint mPaint;

private MaskFilter mEmboss;

private MaskFilter mBlur;

public void colorChanged(int color) {

mPaint.setColor(color);

}

public class MyView extends View {

private static final float MINP = 0.25f;

private static final float MAXP = 0.75f;

private Bitmap mBitmap;

private Canvas mCanvas;

private Path mPath;

private Paint mBitmapPaint;

public MyView(Context c) {

super(c);

mPath = new Path();

mBitmapPaint = new Paint(Paint.DITHER_FLAG);

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);

mCanvas = new Canvas(mBitmap);

}

@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;

}

}

private static final int COLOR_MENU_ID = Menu.FIRST;

private static final int EMBOSS_MENU_ID = Menu.FIRST + 1;

private static final int BLUR_MENU_ID = Menu.FIRST + 2;

private static final int ERASE_MENU_ID = Menu.FIRST + 3;

private static final int SRCATOP_MENU_ID = Menu.FIRST + 4;

@Override

public boolean onCreateOptionsMenu(Menu menu) {

super.onCreateOptionsMenu(menu);

menu.add(0, COLOR_MENU_ID, 0, "Color").setShortcut('3', 'c');

menu.add(0, EMBOSS_MENU_ID, 0, "Emboss").setShortcut('4', 's');

menu.add(0, BLUR_MENU_ID, 0, "Blur").setShortcut('5', 'z');

menu.add(0, ERASE_MENU_ID, 0, "Erase").setShortcut('5', 'z');

menu.add(0, SRCATOP_MENU_ID, 0, "SrcATop").setShortcut('5', 'z');

/**** Is this the mechanism to extend with filter effects?

Intent intent = new Intent(null, getIntent().getData());

intent.addCategory(Intent.CATEGORY_ALTERNATIVE);

menu.addIntentOptions(

Menu.ALTERNATIVE, 0,

new ComponentName(this, NotesList.class),

null, intent, 0, null);

*****/

return true;

}

@Override

public boolean onPrepareOptionsMenu(Menu menu) {

super.onPrepareOptionsMenu(menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

mPaint.setXfermode(null);

mPaint.setAlpha(0xFF);

switch (item.getItemId()) {

case COLOR_MENU_ID:

new ColorPickerDialog(this, this, mPaint.getColor()).show();

return true;

case EMBOSS_MENU_ID:

if (mPaint.getMaskFilter() != mEmboss) {

mPaint.setMaskFilter(mEmboss);

} else {

mPaint.setMaskFilter(null);

}

return true;

case BLUR_MENU_ID:

if (mPaint.getMaskFilter() != mBlur) {

mPaint.setMaskFilter(mBlur);

} else {

mPaint.setMaskFilter(null);

}

return true;

case ERASE_MENU_ID:

mPaint.setXfermode(new PorterDuffXfermode(

PorterDuff.Mode.CLEAR));

return true;

case SRCATOP_MENU_ID:

mPaint.setXfermode(new PorterDuffXfermode(

PorterDuff.Mode.SRC_ATOP));

mPaint.setAlpha(0x80);

return true;

}

return super.onOptionsItemSelected(item);

}

}

I would like to save the drawing as an image such as a png file to the phone. I added this code:

 case SAVE_MENU_ID:

String filename = "signature.png";

getWindow().getDecorView().getRootView()

.setDrawingCacheEnabled(true);

Bitmap b = getWindow().getDecorView().getRootView()

.getDrawingCache();

OutputStream stream = null;

try {

stream = new FileOutputStream("/sdcard/signature.png");

} catch (FileNotFoundException e) {

e.printStackTrace();

}

/*

* Write bitmap to file using JPEG or PNG and 80% quality hint for

* JPEG.

*/

// bitmap.compress(CompressFormat.PNG, 80, stream);

try {

stream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

The image, signature.png is getting saved to the phone, but it is 0 bytes in size. I had added to my manifest.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

网友答案:

Should it not be

     stream = new FileOutputStream(file);

              than

      stream = new FileOutputStream("/sdcard/signature.png");  

      FileOutputStream(File file)
      Constructs a new FileOutputStream that writes to file. 

http://developer.android.com/reference/java/io/FileOutputStream.html.

Also UnComment the below

      bitmap.compress(CompressFormat.PNG, 80, stream); 

You can use a alertdialog to allow user to give a name to the draw being saved.

Once user types the name and click's ok you can save the draw in your sdcard under that name.

In my code content is the rootview;

 case SAVE_MENU_ID:

                AlertDialog.Builder editalert = new AlertDialog.Builder(DrawingRoomScreen.this);
                editalert.setTitle("Please Enter the name with which you want to Save");
                final EditText input = new EditText(DrawingRoomScreen.this);
                LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                        LinearLayout.LayoutParams.FILL_PARENT,
                        LinearLayout.LayoutParams.FILL_PARENT);
                input.setLayoutParams(lp);
                editalert.setView(input);
                editalert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        content.setDrawingCacheEnabled(true);
                        String name= input.getText().toString();
                        Bitmap bitmap = content.getDrawingCache();

                     String path = Environment.getExternalStorageDirectory().getAbsolutePath(); 
                        File file = new File("/sdcard/"+name+".png");           
                        try 
                        {
                            if(!file.exists())
                        {
                            file.createNewFile();
                        }
                            FileOutputStream ostream = new FileOutputStream(file);
                            bitmap.compress(CompressFormat.PNG, 10, ostream);
                            System.out.println("saving......................................................"+path);
                            ostream.close();
                            content.invalidate();                           
                        } 
                        catch (Exception e) 
                        {
                            e.printStackTrace();
                        }finally
                        {

                            content.setDrawingCacheEnabled(false);                          
                        }
                    }
                });

                editalert.show();

   break;               
分享给朋友:
您可能感兴趣的文章:
随机阅读: