更改surfaceview中线条的颜色并保留上一条线条的颜色

时间:2013-01-22 21:54:13

标签: android android-canvas surfaceview

我从这里https://github.com/vivekrk/SurfaceView-Sample开始遵循教程并将其修改为以下代码。

每次按下按钮更改颜色包括视图中已存在的线条在内的整个颜色都会发生变化。我只希望新线条改变颜色。
我该怎么做?

我是Android中的菜鸟,任何帮助将不胜感激。 在此先感谢。

CanvasView.java

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CanvasView extends SurfaceView implements SurfaceHolder.Callback {

    private static final float STROKE_WIDTH = 8;

    private UIThread uiThread;

    private Path mPath;

    public static Paint mPaint;

    private Path oldPath;

    private DrawableObject drawableObject = null;

    private float mX;
    private float mY;
    private float TOUCH_TOLERANCE = 8;

    private RectF dirtyRect;

    private int mMode = Constants.FREE_DRAWING;

    private ArrayList<DrawableObject> objectsToDraw;


    public static int colorofpaint;



    public CanvasView(Context context) {
        super(context);
        getHolder().addCallback(this);

        objectsToDraw = new ArrayList<DrawableObject>();

        mPath = new Path();
    }

    public void clearCanvas() {
        mPath.reset();
    }

    public void setDrawingMode(int drawingMode) {
        mMode = drawingMode;
    }

    @Override
    public void onDraw(Canvas canvas) {
        setPaintProperties();

        if (canvas != null) {
            canvas.drawColor(Color.WHITE);
            synchronized (objectsToDraw) {
                for (DrawableObject drawableObject : objectsToDraw) {
                    drawableObject.draw(canvas);
                }
            }
        }
    }

    public void stopUIThread() {
        uiThread.setRunning(false);
    }

    private void setPaintProperties() {
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        //mPaint.setColor(Color.RED);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(STROKE_WIDTH);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        oldPath = mPath;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();

        switch (mMode) {
        case Constants.FREE_DRAWING:
            drawableObject = new FreeDrawing(mPath, mPaint);

            if (colorofpaint==1) {
                mPaint.setColor(Color.GREEN);
            }

            if (colorofpaint==2) {
                mPaint.setColor(Color.RED);
            }

            if (colorofpaint==3) {
                mPaint.setColor(Color.BLUE);
            }

            if (colorofpaint==4) {
                mPaint.setColor(Color.YELLOW);
            }

            if (colorofpaint==5) {
                mPaint.setColor(Color.CYAN);
            }

            if (colorofpaint==6) {
                mPaint.setColor(Color.BLACK);
            }

            if (colorofpaint==7) {
                mPaint.setColor(Color.MAGENTA);
            }


            break;


        default:
            break;
        }

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            synchronized (objectsToDraw) {
                objectsToDraw.add(drawableObject);
            }
            mPath.moveTo(x, y);
            mX = x;
            mY = y;
            break;

        case MotionEvent.ACTION_MOVE:
            switch (mMode) {
            case Constants.FREE_DRAWING:
                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;
                }
                break;
            }
            break;

        case MotionEvent.ACTION_UP:
            switch (mMode) {
            case Constants.FREE_DRAWING:
                mPath.moveTo(x, y);
                break;
            }
            break;
        }
        return true;
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        uiThread = new UIThread(this);
        uiThread.setRunning(true);
        uiThread.start();
    }

    public void restoreOldPath() {
        mPath = oldPath;
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        uiThread.setRunning(false);
    }

    public RectF getDirtyRect() {
        if(dirtyRect == null) {
            dirtyRect = new RectF();
        }
        return dirtyRect ;
    }



}

UIThread .java

import android.graphics.Canvas;
import android.view.SurfaceHolder;

public class UIThread extends Thread {

    private static boolean toRun = false;
    private CanvasView canvasView;
    private SurfaceHolder surfaceHolder;

    public UIThread(CanvasView canvasView) {
        this.canvasView = canvasView;
        surfaceHolder = canvasView.getHolder();
    }

    public boolean isThreadRunning() {
        return toRun;
    }

    public void setRunning(boolean run) {
        toRun = run;
    }

    @Override
    public void run() {
        Canvas c;
        while (toRun) {
                c = null;
                try {
                    c = surfaceHolder.lockCanvas(null);
                    canvasView.onDraw(c);
                } finally {
                    if (c != null) {
                        surfaceHolder.unlockCanvasAndPost(c);
                    }
                }
        }
    }

}

FreeDrawing .java

import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;

public class FreeDrawing extends DrawableObject {

    private Path mPath;
    private Paint mPaint;

    public FreeDrawing(Path path, Paint paint) {
        mPath = path;
        mPaint = paint;
    }

    @Override
    public void draw(Canvas canvas) {
        canvas.drawPath(mPath, mPaint);
    }
}

DrawableObject .java

import android.graphics.Canvas;

public abstract class DrawableObject {

    abstract public void draw(Canvas canvas);

}

常量.java

public class Constants {
//  XXX:Drawing modes
    public static final int FREE_DRAWING = 1000;
    public static final int LINE_DRAWING = 1001;
    public static final int RECT_DRAWING = 1002;
    public static final int SELECT = 1003;
}

SurfaceViewSampleActivity .java

import android.app.Activity;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.LightingColorFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.Toast;

public class SurfaceViewSampleActivity extends Activity  {
    /** Called when the activity is first created. */
    private CanvasView view;
    private static final int CLEAR = 100;

    private FrameLayout surfaceViewFrame;

    private RadioGroup mode;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);



        surfaceViewFrame = (FrameLayout) findViewById(R.id.surfaceviewFrame);
        view = new CanvasView(this);
        surfaceViewFrame.addView(view, 0);

        CanvasView.colorofpaint=6;


        view.setDrawingMode(Constants.FREE_DRAWING);


        Button b1=(Button)findViewById(R.id.button1);
        b1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                CanvasView.colorofpaint=2;
        //      view.setDrawingMode(Constants.FREE_DRAWING);
            }
        });



        Button b2=(Button)findViewById(R.id.button2);
        b2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                CanvasView.colorofpaint=3;

                view.setDrawingMode(Constants.FREE_DRAWING);
            }
        });





    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, CLEAR, 0, "Clear");
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case CLEAR:
            view.clearCanvas();
            break;
        }
        return true;
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Toast.makeText(getApplicationContext(), "onConfigurationChanged", Toast.LENGTH_SHORT).show();
    }



}

0 个答案:

没有答案