如何绘制不同颜色的多行并撤消,重做android中的路径?

我想在视图上用不同的颜色绘制多条线并撤消,重做android中的路径。

我使用位图绘制选项,每个路径都有一个独特的颜色但撤消,重做不起作用..

这是我的bitmappaint代码:

public MyView(Context context, Object object) { super(context); setFocusable(true); setFocusableInTouchMode(true); mPath = new Path(); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(0xFFFFFF00); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(3); mBitmap = Bitmap.createBitmap(320, 480, Bitmap.Config.ARGB_8888); mCanvas = new Canvas(mBitmap); } protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); } protected void onDraw(Canvas canvas) { canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); for (Path p : paths) { canvas.drawPath(p, mPaint); } canvas.drawPath(mPath, mPaint); } public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); int action = event.getAction(); int action1=event.getAction(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: undonePaths.clear(); mPath.reset(); mPath.moveTo(x, y); mX = x; mY = y; startPoint = new PointF(event.getX(), event.getY()); endPoint = new PointF(); invalidate(); // isDrawing = true; break; case MotionEvent.ACTION_MOVE: float dx = Math.abs(x - mX); System.out.println("action move"); float dy = Math.abs(y - mY); if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { // currentDrawingPath.path.quadTo(mX,mY,(x + mX)/2, (y + mY)/2); } mX = x; mY = y; endPoint.x = event.getX(); endPoint.y = event.getY(); isDrawing = true; invalidate(); break; case MotionEvent.ACTION_UP: mPath.lineTo(mX, mY); paths.add(mPath); mPath = new Path(); // mCanvas.drawPath(mPath, ppaint); endPoint.x = event.getX(); endPoint.y = event.getY(); isDrawing = false; invalidate(); break; default: break; } } 

![bitmappaint canvas的输出] [1] [1]: http ://i.stack.imgur.com/9aQvE.png

没有位图使用我遇到颜色问题,如果我为路径选择蓝色意味着所有以前的路径将更改为蓝色;

这是我的代码

 protected void onDraw(Canvas canvas) { canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); for (Path p : paths) { canvas.drawPath(p, mPaint); } canvas.drawPath(mPath, mPaint); } 

![使用canvas绘制无位图的输出] [2] [2]: http : //i.stack.imgur.com/eDp5Y.png

请帮我在android中绘制具有不同颜色的独特路径的多个路径。 谢谢advancde ……..

处理MotionEvent.ACTION_UP时:需要保存用于绘制路径的颜色,如下所示:

 case MotionEvent.ACTION_UP: paths.add(mPath); colorsMap.put(mPath,selectedColor); // store the color of mPath ... 

在绘制路径之前,您需要设置绘画颜色:

 protected void onDraw(Canvas canvas) { canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); for (Path p : paths) { mPaint.setColor(colorsMap.get(p)); canvas.drawPath(p, mPaint); } mPaint.setColor(selectedColor); canvas.drawPath(mPath, mPaint); } 

而colorsMap是一个简单的实例变量:

 private Map colorsMap = new HashMap(); 

要实现撤消/重做function,您只需从路径中删除最后一个元素(并将其存储在undoneList中,以便重做时可以恢复它)。 请参阅Android Canvas重做和撤消操作

这个工作代码。我在我自己的应用程序上测试它,它工作得非常好。 可能对你有帮助。请评论一下。

  public class Main extends Activity implements OnColorChangedListener { //public static int selectedColor = Color.BLACK; public static ArrayList mMaindialog; // private ArrayList undonePaths; // public int selectedcolor; private static final String COLOR_PREFERENCE_KEY = "color"; private FrameLayout relativelayout; static String sdpath,location; Boolean i; // Instance variables private Bitmap mBitmap=null; Bitmap bitmap; private Paint mPaint, mBitmapPaint, mPaint1; private MyView mView; ImageView idd; // private Path mPath; int slll = Color.BLACK; Bitmap map=ListView5.bMap; private Button ClearPaint, Colorpaint; Ghostdatabase gost; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); idd=(ImageView)findViewById(R.id.imageView1); relativelayout = (FrameLayout) findViewById(R.id.frameLayout); DisplayMetrics metrics = getBaseContext().getResources() .getDisplayMetrics(); int w = metrics.widthPixels; int h = metrics.heightPixels; System.out.println(" width " + w); System.out.println(" height " + h); mView = new MyView(this, w, h); mView.setDrawingCacheEnabled(true); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setColor(Color.BLACK); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(4); ClearPaint = (Button) findViewById(R.id.ne); ClearPaint.setOnClickListener(new OnClickListener() { public void onClick(View v) { // mBitmap.eraseColor(Color.TRANSPARENT); // mPath.reset(); // mView.invalidate(); mView.onClickUndo(); } }); Button save22 = (Button) findViewById(R.id.save); save22.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub File cacheDir; Toast.makeText(Main.this, "Photo", 500).show(); Bitmap icon; relativelayout.setDrawingCacheEnabled(true); icon = Bitmap.createBitmap(relativelayout.getDrawingCache()); Bitmap bitmap = icon; relativelayout.setDrawingCacheEnabled(false); // File mFile1 = Environment.getExternalStorageDirectory(); Date d = new Date(); String fileName = d.getTime() + "mg1.jpg"; File storagePath = (Environment.getExternalStorageDirectory()); File dest = new File(storagePath + "/CityAppImages"); if (!dest.exists()) { dest.mkdirs(); } File mFile2 = new File(dest, fileName); sdpath = mFile2.getAbsolutePath(); Log.d("qqqqqqqqqqqqqqqqqqqqqqq", "zzzzzzzz" + sdpath); try { FileOutputStream outStream; outStream = new FileOutputStream(mFile2); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream); outStream.flush(); outStream.close(); Toast.makeText(Main.this, "Photo Saved Sucessfully", 500) .show(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); Toast.makeText(Main.this, "Photo Not Saved Sucessfully", 500).show(); } gost = new Ghostdatabase(Main.this); gost.open(); gost.insertTitle(sdpath); } }); Button view = (Button) findViewById(R.id.listtt); view.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent ii = new Intent(Main.this, ListView5.class); startActivity(ii); } }); Button Colorpaint = (Button) findViewById(R.id.Color); Colorpaint.setOnClickListener(new OnClickListener() { public void onClick(View v) { int color = PreferenceManager.getDefaultSharedPreferences( Main.this).getInt(COLOR_PREFERENCE_KEY, Color.WHITE); // int _color = R.color.red; new ColorPickerDialog(v.getContext(), new OnColorChangedListener() { public void colorChanged(int color) { mPaint.setColor(color); slll = color; Log.i("TAG", "mpaint one" + mPaint); } }, mPaint.getColor()).show(); Log.i("TAG", "mpaint two" + mPaint); } }); relativelayout.addView(mView); } // //////////******************* Pinting view // *******************/////////////////// public class MyView extends View implements OnTouchListener { private Map colorsMap = new HashMap(); private ArrayList mMaindialog = new ArrayList(); private ArrayList undonePaths = new ArrayList(); int colorPicked = slll; // Paint mPaint1; private Canvas mCanvas; private Path mPath; public MyView(Context c, int w, int h) { super(c); if(GlobalVariable.impath==1) { Log.d("","111111"+GlobalVariable.impath); System.out.println(GlobalVariable.impath); Intent ii = getIntent(); location = ii.getStringExtra("IMAGE"); // bitmap.recycle(); Log.d("","location"+location); bitmap = BitmapFactory.decodeFile(location); mBitmap = Bitmap.createScaledBitmap(bitmap,300, 300,false); Log.d("hhhhhhhhhhhhhhhssssssss","mBitmap"+mBitmap); //mBitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); // idd.setImageBitmap(mBitmap); Log.d("hhhhhhhhhhhhhhhssssssss","GlobalVariable.impath"+GlobalVariable.impath); } else if(GlobalVariable.impath==2){ //bitmap.recycle(); Log.d("","22222222222222222222222"+GlobalVariable.impath); bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.base); mBitmap = Bitmap.createScaledBitmap(bitmap,100, 100, false); //mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); Log.d("hhhhhhhhhhhhhhhssssssss1111111","mBitmap"+mBitmap); } // mCanvas = new Canvas(mBitmap); mPath = new Path(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); for (Path p : mMaindialog) { mPaint.setColor(colorsMap.get(p)); canvas.drawPath(p, mPaint); } mPaint.setColor(slll); canvas.drawPath(mPath, mPaint); } // //////************touching evants for painting**************/////// private float mX, mY; private static final float TOUCH_TOLERANCE = 0; private void touch_start(float x, float y) { mPath.reset(); mPath.moveTo(x, y); mX = x; mY = y; undonePaths.clear(); } 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 = new Path(); mPath.reset(); mMaindialog.add(mPath); } @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(); undonePaths.clear(); mPath.reset(); mPath.moveTo(x, y); mX = x; mY = y; invalidate(); break; case MotionEvent.ACTION_MOVE: // touch_move(x, y); // invalidate(); 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; } invalidate(); break; case MotionEvent.ACTION_UP: // touch_up(); // invalidate(); mPath.lineTo(mX, mY); mMaindialog.add(mPath); colorsMap.put(mPath, slll); mPath = new Path(); mPath.reset(); invalidate(); break; } return true; } // end of touch events for image private Paint createPen(int colorPicked) { // TODO Auto-generated method stub mPaint1 = new Paint(); mPaint1.setColor(colorPicked); mPaint1.setAntiAlias(true); mPaint1.setDither(true); mPaint1.setStyle(Paint.Style.STROKE); mPaint1.setStrokeJoin(Paint.Join.ROUND); mPaint1.setStrokeCap(Paint.Cap.ROUND); // mPaint1.setStrokeWidth(3); return mPaint1; } public void onClickRedo() { if (undonePaths.size() > 0) { mMaindialog.add(undonePaths.remove(undonePaths.size() - 1)); mView.invalidate(); } else { } // toast the user } public void onClickUndo() { if (mMaindialog.size() > 0) { undonePaths.add(mView.mMaindialog.remove(mView.mMaindialog .size() - 1)); mView.invalidate(); } else { } } @Override public boolean onTouch(View arg0, MotionEvent arg1) { // TODO Auto-generated method stub return false; } }// end MyView @Override public void colorChanged(int color) { // TODO Auto-generated method stub PreferenceManager.getDefaultSharedPreferences(this).edit() .putInt(COLOR_PREFERENCE_KEY, color).commit(); slll = color; } }