关于Android Paint绘图颜色

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对象.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...