好奇怪的,我想做一个简单的小画板,在Canvas上用手指绘制,现在想动态改变笔刷的颜色,粗细等属性,可是改变之后再次画的时候,原来已经画在Canvas上的线条也一起变为了新的设置了,请问如何解决这一问题呢?怎么样能让已经画好的不被Paint 新设置的颜色改变覆盖??望高手指点
,谢谢啦
package jet.dsm.demo;
import java.io.File;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.os.Environment;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
/**
* 画笔类
*
* @author Yue
*
*/
public class Pen extends View {
private float mX, mY;
private Path mPath;
private Paint mPaint;
public Paint getmPaint() {
return mPaint;
}
public void setmPaint(Paint mPaint) {
this.mPaint = mPaint;
}
private static final float TOUCH_TOLERANCE = 4;
private Bitmap mBitmap;
private Canvas mCanvas;
private Paint mBitmapPaint;
private int screenWidth = 100;
private int screenHeight = 100;
public int getScreenWidth() {
return screenWidth;
}
public void setScreenWidth(int screenWidth) {
this.screenWidth = screenWidth;
}
public int getScreenHeight() {
return screenHeight;
}
public void setScreenHeight(int screenHeight) {
this.screenHeight = screenHeight;
}
public Pen(Context context, String pathName, String fileName,
int screenWdith, int screenHeight) {
super(context);
// TODO Auto-generated constructor stub
mPaint = Brush.getBrush();
// mBitmap = Bitmap.createBitmap(320,
// 480,Bitmap.Config.ARGB_8888);//绘制固定大小的bitmap对象
// mBitmap = this.getPhoto(fileName);
mBitmap = Pub.getPicture(pathName, fileName);
// String
// path=Environment.getExternalStorageDirectory().getPath()+"/"+fileName;
// mCanvas = new Canvas(BitmapFactory
// .decodeFile(pathName + "/" + fileName).copy(
// Bitmap.Config.ARGB_8888, true));
mCanvas = new Canvas();
// Rect src=new Rect(500, 500, mBitmap.getWidth(), mBitmap.getHeight());
// Rect dst=new Rect(0,0,100,500);
// mCanvas.drawBitmap(mBitmap, src, dst, null);
// mCanvas = new Canvas(Bitmap.createBitmap(mBitmap));//
// 将固定的bitmap对象嵌入到canvas对象中
mPath = new Path();// 创建画笔路径
mBitmapPaint = new Paint(Paint.DITHER_FLAG);
}
private void onTouchDown(float x, float y) {
// mPath.reset();// 将上次的路径保存起来,并重置新的路径。
mPath.moveTo(x, y);// 设置新的路径“轮廓”的开始
mX = x;
mY = y;
}
private void onTouchMove(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 onTouchUp(float x, float y) {
mPath.lineTo(mX, mY);// 从最后一个指定的xy点绘制一条线,如果没有用moveTo方法,那么起始点表示(0,0)点。
// commit the path to our offscreen
mCanvas.drawPath(mPath, mPaint);// 手指离开屏幕后,绘制创建的“所有”路径。
// kill this so we don't double draw
// mPath.reset();
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
canvas.drawColor(0xFFAAAAAA);
Rect src = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight());
Rect dst = new Rect(0, 0, this.screenWidth, this.screenHeight);
canvas.drawBitmap(mBitmap, src, dst, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:// 手指开始按压屏幕,这个动作包含了初始化位置
onTouchDown(x, y);
invalidate();// 刷新画布,重新运行onDraw()方法
break;
case MotionEvent.ACTION_MOVE:// 手指按压屏幕时,位置的改变触发,这个方法在ACTION_DOWN和ACTION_UP之间。
onTouchMove(x, y);
invalidate();
break;
case MotionEvent.ACTION_UP:// 手指离开屏幕,不再按压屏幕
onTouchUp(x, y);
invalidate();
break;
default:
break;
}
return true;
}
/**
* 根据路径得到图片
*
* @param fileName
* @return
*/
public Bitmap getPhoto(String fileName) {
// SDCard的路径,也就是“/sdcard/”
File root = Environment.getExternalStorageDirectory();
// 图片
File wall = new File(root, fileName);
// 图片路径
String path = wall.getAbsolutePath();
// Log.d(TAG, "MM文件路径为:" + path);
return BitmapFactory.decodeFile(path);
}
}
在画布上再加一层
请问再加一层是什么意思?加一个控件,还是Canvas?
哦,不是,我觉得是因为 ,画布每次刷新,画布上所有的内容 都会重新绘制 一遍,在你程序了我觉得你应该就一个画笔,所以当你设置了画笔了某些属性时,等再次刷新还会用你这个已经改变过属性的笔重新绘制,这就导致你绘制的线条总会是最后设置的颜色。
如果以上推断是正确的话,只要每次改变属性就在画布上增加一层,即增加一个新的bitmap,另外用新生成的画笔绘制。 这个我没做过,建议仅供参考
学习一下,有点收获