程序的源代码
=============================import java.io.File;
import java.io.FileOutputStream;import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.BlurMaskFilter;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BlurMaskFilter.Blur;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;public class MainActivity extends Activity {
BlurMaskFilter blur; // 模糊效果
private Button but_pen;
private Button but_color;
private int whichColor = 0;
private int whichStroke = 0;
private Button but_save;
private Button but_exit;


// final DrawView dv = (DrawView)findViewById(R.id.draw);
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
blur = new BlurMaskFilter(8, Blur.NORMAL);
but_pen = (Button) findViewById(R.id.flushbutton);
but_color = (Button) findViewById(R.id.colorbutton);
but_save = (Button) findViewById(R.id.savebutton);
but_exit=(Button) findViewById(R.id.exitbutton);
final DrawView dv = (DrawView) findViewById(R.id.draw);
// 选择颜色
but_color.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
//final DrawView dv = (DrawView) findViewById(R.id.draw);
Dialog mDialog = new AlertDialog.Builder(MainActivity.this)
.setTitle("颜色设置")
.setSingleChoiceItems(
new String[] { "红色", "绿色", "蓝色", "黄色" },
whichColor,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
switch (which) {
case 0: {
// 画笔的颜色
dv.mPaint.setColor(Color.RED);
whichColor = 0;
break;
} case 1: {
// 画笔的颜色
dv.mPaint.setColor(Color.GREEN);
whichColor = 1;
break;
}
case 2: {
// 画笔的颜色106
dv.mPaint.setColor(Color.BLUE);
whichColor = 2;
break;
} case 3: {
// 画笔的颜色106
dv.mPaint.setColor(Color.YELLOW);
whichColor = 3;
break;
}
default: {
dv.mPaint.setColor(Color.BLACK);
break;
}
}
} })
.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
dialog.dismiss();
}
}).create();
mDialog.show();
}
});
// 笔画粗细
but_pen.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
//final DrawView dv = (DrawView) findViewById(R.id.draw);
Dialog mDialog = new AlertDialog.Builder(MainActivity.this)
.setTitle("颜色设置")
.setSingleChoiceItems(
new String[] { "1像素", "5像素", "10像素", "模糊效果" },
whichStroke,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
switch (which) {
case 0: {
// 画笔的颜色
dv.mPaint.setStrokeWidth(1);
whichStroke = 0;
break;
} case 1: {
// 画笔的颜色
dv.mPaint.setStrokeWidth(5);
whichStroke = 1;
break;
}
case 2: {
// 画笔的颜色106
dv.mPaint.setStrokeWidth(10);
whichStroke = 2;
break;
} case 3: {
// 画笔的颜色106
dv.mPaint.setMaskFilter(blur);
whichStroke = 3;
break;
}
default: {
dv.mPaint.setStrokeWidth(3);
break;
}
}
} })
.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
dialog.dismiss();
}
}).create();
mDialog.show();
} });
/* but_save.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
final DrawView dv = (DrawView) findViewById(R.id.draw);
// TODO Auto-generated method stub
new AlertDialog.Builder(MainActivity.this)
.setTitle("确认退出吗?")
.setIcon(android.R.drawable.ic_dialog_info)
.setPositiveButton("确定",
new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog,
int which) {
// 点击“确认”后的操作
try {
File file = new File(
Environment
.getExternalStorageDirectory(),
System.currentTimeMillis()
+ ".png");
FileOutputStream stream = new FileOutputStream(
file);
dv.mBitmap.compress(
CompressFormat.PNG, 100,
stream);
stream.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} MainActivity.this.finish(); }

})
.setNegativeButton("返回",
new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog,
int which) {
// 点击“返回”后的操作,这里不设置没有任何操作
MainActivity.this.finish();
}
}).show();
}
});*/
but_save.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
File file = new File(
Environment
.getExternalStorageDirectory(),
System.currentTimeMillis()
+ ".png");
FileOutputStream stream = new FileOutputStream(
file);
dv.mBitmap.compress(
CompressFormat.PNG, 100,
stream);
stream.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} }
});

but_exit.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});
}=========================================================public class DrawView extends View {
 Canvas mCanvas; Bitmap mBitmap;//画面
private Path mPath;
private Paint mBitmapPaint;// 画布的画笔
Paint mPaint;// 真实的画笔
private float mX, mY;// 临时点坐标
private static final float TOUCH_TOLERANCE = 4; private int screenWidth = 1000, screenHeight = 300;// 屏幕長寬 public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);
/*
 * screenWidth = w; screenHeight = h;
 */ mBitmap = Bitmap.createBitmap(screenWidth, screenHeight,
Bitmap.Config.ARGB_8888);
 
// 保存一次一次绘制出来的图形
mCanvas = new Canvas(mBitmap);
       
mBitmapPaint = new Paint(Paint.DITHER_FLAG);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);// 设置外边缘
mPaint.setStrokeCap(Paint.Cap.SQUARE);// 形状
mPaint.setStrokeWidth(3);// 画笔宽度
// mCanvas.drawColor(Color.BLACK); 
// 反锯齿
mPaint.setAntiAlias(true);
mPaint.setDither(true);
    //   bmps= BitmapFactory.decodeResource(getResources(), R.drawable.playerbackground);  
} @Override
public void onDraw(Canvas canvas) {
// canvas.drawColor(0xFFAAAAAA);
// 将前面已经画过得显示出来
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
if (mPath != null) {
// 实时的显示
canvas.drawPath(mPath, mPaint);
}
} private void touch_start(float x, float y) {
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(mY - y); // 触摸间隔大于阈值才绘制路径
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
// 从x1,y1到x2,y2画一条贝塞尔曲线,更平滑(直接用mPath.lineTo也是可以的)
mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
mX = x;
mY = y;
}
} private void touch_up() {
mPath.lineTo(mX, mY);
mCanvas.drawPath(mPath, mPaint);
} @Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY(); switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 每次down下去重新new一个Path
mPath = new Path(); 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;
}
}
=========================
保存图片呈现黑色