DrawView.
java
public class DrawView extends View implements OnTouchListener { private Canvas mCanvas; private Path mPath; public Paint mPaint; ArrayList<Path> paths = new ArrayList<Path>(); private ArrayList<Path> undonePaths = new ArrayList<Path>(); private MaskFilter mEmboss; private MaskFilter mBlur; private Bitmap im; public DrawView(Context context) { super(context); setFocusable(true); setFocusableInTouchMode(true); this.setOnTouchListener(this); paths.clear(); undonePaths.clear(); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setColor(Color.BLUE); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(4); mEmboss = new EmbossMaskFilter(new float[] { 1,1,1 },0.4f,6,3.5f); mBlur = new BlurMaskFilter(8,BlurMaskFilter.Blur.NORMAL); mCanvas = new Canvas(); mPath = new Path(); // paths.add(mPath); im = BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_launcher); } @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.drawColor(Share.cColor); for (Path p : paths) { canvas.drawPath(p,mPaint); } canvas.drawPath(mPath,mPaint); } private float mX,mY; private static final float TOUCH_TOLERANCE = 4; private void touch_start(float x,float y) { mPaint.setColor(Share.dColor); undonePaths.clear(); mPath.reset(); mPath.moveTo(x,y); mX = x; mY = y; Log.e("","pathsize:::" + paths.size()); Log.e("","undonepathsize:::" + undonePaths.size()); } 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 paths.add(mPath); mPath = new Path(); Log.e("","undonepathsize:::" + undonePaths.size()); } public void onClickUndo() { Log.e("","undonepathsize:::" + undonePaths.size()); if (paths.size() > 0) { undonePaths.add(paths.remove(paths.size() - 1)); invalidate(); } else { } // toast the user } public void onClickRedo() { Log.e("","undonepathsize:::" + undonePaths.size()); if (undonePaths.size() > 0) { paths.add(undonePaths.remove(undonePaths.size() - 1)); invalidate(); } else { } // toast the user } @Override public boolean onTouch(View arg0,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; }
}
我试图绘制不同颜色的手指画,但每当我改变颜色的油漆然后所有以前的路径或绘图得到和绘制更新的颜色我想用不同的颜色绘制我该怎么办?请给我一些解决方案.
解决方法
为此,您必须为绘制的每个对象创建一个新的Paint.这是因为当Canvas重绘时,它每次引用相同的Paint对象,因此所有路径都将使用此绘制.
首先,我会更改您的路径数组以包含Paint和Path.您可以使用Android类型对来实现此目的.
ArrayList<Pair<Path,Paint>> paths = new ArrayList<Pair<Path,Paint>>();
您还必须以这种方式转换您的undonePaths变量.
然后,在touch_up()方法中,您需要添加这个新的Paint对象.
Paint newPaint = new Paint(mPaint); // Clones the mPaint object paths.add(new Pair<Path,Paint>(mPath,newPaint));
最后,你的循环也必须为此调整:
for (Pair<Path,Paint> p : paths) { canvas.drawPath(p.first,p.second); }
这是非常耗费内存的,所以当它们不再使用时你必须小心重置这些项目,但是要拥有这么多不同的颜色,你必须拥有所有这些不同的Paint对象.