好奇怪的,我想做一个简单的小画板,在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); }}
添加回答
举报
0/150
提交
取消