Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
184 views
in Technique[技术] by (71.8m points)

how to change color of pen on button click in android

I have made a simple android program for singletouch paint, in it I have aut 4 types of pens of different sizes and I want is based on that image I want to change strokesize of pen. I have tried as below, please help me:

My image screen shot

main.java

public class MainActivity extends Activity implements OnClickListener {
    ImageView pen, color;
    SingleTouchView mDrawView;
    RelativeLayout layout, layout1;
    ImageView remove;
    ImageView eraser;
    LinearLayout pens;
    HorizontalScrollView myplate;
    private Paint mPaint, mBitmapPaint;
    private Button red, green, blue, cyan, yellow, orange, aqua, black, cofee,
            fuchiya, gray, indigo, khaki, lavendar, magenta, mango, maroon,
            pista, pink, purple;

    private Path mPath;

    public Canvas mCanvas;
    LinearLayout pen1, pen2, pen3, pen4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDrawView = (SingleTouchView) findViewById(R.id.myview);
        layout1 = (RelativeLayout) findViewById(R.id.layout1);
        layout = (RelativeLayout) findViewById(R.id.layout);
        pen = (ImageView) findViewById(R.id.pen);
        pens = (LinearLayout) findViewById(R.id.linear);
        pens.setVisibility(View.GONE);
        pen1 = (LinearLayout) findViewById(R.id.pen1);
        pen2 = (LinearLayout) findViewById(R.id.pen2);
        pen3 = (LinearLayout) findViewById(R.id.pen3);
        pen4 = (LinearLayout) findViewById(R.id.pen4);
        color = (ImageView) findViewById(R.id.color);
        myplate = (HorizontalScrollView) findViewById(R.id.myplate);

        // colors.........!!!!
        red = (Button) findViewById(R.id.red);
        green = (Button) findViewById(R.id.green);
        blue = (Button) findViewById(R.id.blue);
        orange = (Button) findViewById(R.id.orange);
        yellow = (Button) findViewById(R.id.yellow);
        cyan = (Button) findViewById(R.id.cyan);
        black = (Button) findViewById(R.id.black);
        cofee = (Button) findViewById(R.id.cofee);
        fuchiya = (Button) findViewById(R.id.fuchiya);
        gray = (Button) findViewById(R.id.gray);
        indigo = (Button) findViewById(R.id.indigo);
        khaki = (Button) findViewById(R.id.khaki);
        lavendar = (Button) findViewById(R.id.lavendar);
        magenta = (Button) findViewById(R.id.magenta);
        mango = (Button) findViewById(R.id.mango);
        maroon = (Button) findViewById(R.id.maroon);
        pista = (Button) findViewById(R.id.pista);
        pink = (Button) findViewById(R.id.pink);
        purple = (Button) findViewById(R.id.purple);

        red.setOnClickListener(this);
        green.setOnClickListener(this);
        blue.setOnClickListener(this);
        orange.setOnClickListener(this);
        yellow.setOnClickListener(this);
        cyan.setOnClickListener(this);
        black.setOnClickListener(this);
        cofee.setOnClickListener(this);
        fuchiya.setOnClickListener(this);
        gray.setOnClickListener(this);
        indigo.setOnClickListener(this);
        khaki.setOnClickListener(this);
        lavendar.setOnClickListener(this);
        magenta.setOnClickListener(this);
        mango.setOnClickListener(this);
        maroon.setOnClickListener(this);
        pista.setOnClickListener(this);
        pink.setOnClickListener(this);
        purple.setOnClickListener(this);

        eraser = (ImageView) findViewById(R.id.eraser);
        remove = (ImageView) findViewById(R.id.remove);

        pen.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // layout.addView(mDrawView);
                pens.setVisibility(View.VISIBLE);
            }
        });

        pens.setVisibility(View.GONE);

        pen1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mDrawView.setPen(SingleTouchView.DrawingPens.PEN_1);
                pens.setVisibility(View.GONE);
            }
        });

        pen2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mDrawView.setPen(SingleTouchView.DrawingPens.PEN_2);
                pens.setVisibility(View.GONE);
            }
        });

        pen3.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                pens.setVisibility(View.GONE);
                mDrawView.setPen(SingleTouchView.DrawingPens.PEN_3);
            }
        });

        pen4.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                pens.setVisibility(View.GONE);
                mDrawView.setPen(SingleTouchView.DrawingPens.PEN_4);
            }
        });

        remove.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                layout.removeView(mDrawView);
                mDrawView = new SingleTouchView(MainActivity.this);
                layout.addView(mDrawView);
            }
        });

        eraser.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mBitmapPaint.setColor(Color.TRANSPARENT);
                mPath.reset();
                mDrawView.invalidate();
                }
        });

        color.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                myplate.setVisibility(View.VISIBLE);
            }
        });
    }

    // /colorpicker................!
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.black:
            myplate.setVisibility(View.GONE);
            mDrawView.setColor(SingleTouchView.DrawingColors.Black);
            System.out.println("==============="+SingleTouchView.DrawingColors.Black+"=========================");
            break;
        case R.id.blue:
            myplate.setVisibility(View.GONE);
            //mDrawView.setColor(SingleTouchView.DrawingColors.Blue);
            break;
        case R.id.cofee:
            myplate.setVisibility(View.GONE);
            break;
        case R.id.cyan:
            myplate.setVisibility(View.GONE);
            break;
        case R.id.fuchiya:
            myplate.setVisibility(View.GONE);
            break;
        case R.id.gray:
            myplate.setVisibility(View.GONE);
            break;
        case R.id.green:
            myplate.setVisibility(View.GONE);

            break;
        case R.id.indigo:
            myplate.setVisibility(View.GONE);
            break;
        case R.id.khaki:
            myplate.setVisibility(View.GONE);
            break;
        case R.id.lavendar:
            myplate.setVisibility(View.GONE);
            break;
        case R.id.magenta:
            myplate.setVisibility(View.GONE);
            break;
        case R.id.mango:
            myplate.setVisibility(View.GONE);
            break;
        case R.id.maroon:
            myplate.setVisibility(View.GONE);
            break;
        case R.id.orange:
            myplate.setVisibility(View.GONE);
            break;
        case R.id.pink:
            myplate.setVisibility(View.GONE);
            break;
        case R.id.pista:
            myplate.setVisibility(View.GONE);
            break;
        case R.id.purple:
            myplate.setVisibility(View.GONE);
            break;
        case R.id.red:
            myplate.setVisibility(View.GONE);

            break;
        case R.id.yellow:
            myplate.setVisibility(View.GONE);
            break;
        }
    }
}

Singleotuch.java

public class SingleTouchView extends View {
    public static int width;
    public int height;
    public Bitmap mBitmap;
    public Canvas mCanvas;
    public Path mPath;
    public Paint mBitmapPaint;
    Context context;
    public Paint mPaint;
    public Paint circlePaint;
    public Path circlePath;

    public enum DrawingPens {
        PEN_1(6), PEN_2(4), PEN_3(2), PEN_4(1);

        public Paint mPaint;

        private DrawingPens(final int width) {
            mPaint = new Paint();

            mPaint.setAntiAlias(true);
            mPaint.setStrokeWidth(width);

            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeJoin(Paint.Join.ROUND);
        }

        Paint getPaint() {
            return mPaint;
        }
    }

    public enum DrawingColors{
        Black(Color.parseColor("#000000")),Blue(Color.parseColor("#0000FF")),Cofee(Color.parseColor("#D2691E")),Cyan(Color.parseColor("#00FFFF"))
        ,Fuchiya(Color.parseColor("#FF00FF")),Gray(Color.parseColor("#808080")),Green(Color.parseColor("#00FF00")),Indigo(Color.parseColor("#4B0082")),
        Khaki(Color.parseColor("#F0E68C")),Lavendar(Color.parseColor("#E6E6FA")),Magenta(Color.parseColor("#FF00FF")),Mango(Color.parseColor("#FF8C00"))
        ,Maroon(Color.parseColor("#800000")),Orange(Color.parseColor("#FFA500")),Pink(Color.parseColor("#FFC0CB")),Pista(Color.parseColor("#9ACD32")),
        Purple(Color.parseColor("#800080")),Red(Color.parseColor("#FF0000")),Tan(Color.parseColor("#0000A0")),Yellow(Color.parseColor("#FFD801"));

        public Paint mPaint;

        private DrawingColors(final int color) {
            mPaint = new Paint();

            mPaint.setAntiAlias(true);
            mPaint.setStrokeWidth(width);
            mPaint.setColor(color);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeJoin(Paint.Join.ROUND);
        }

        Paint getPaint() {
            return mPaint;
        }
    }

    public SingleTouchView(final Context context) {
        super(context);

        init(context);
    }

    public SingleTouchView(final Context context, final AttributeSet attrs) {
        super(context, attrs);

        init(context);
        mBitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888);
        mCanvas = new Canvas(mBitmap);
        mPath = new Path();
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);

        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(0xFFFF0000);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(12);
    }

    public SingleTouchView(final Context context, final AttributeSet attrs,
            final int defStyle) {
        super(context, attrs, defStyle);

        init(context);
    }

    private ConcurrentLinkedQueue<Map.Entry<Path, DrawingPens>> mPaths = new ConcurrentLinkedQueue<Map.Entry<Path, DrawingPens>>();
    private ConcurrentLinkedQueue<Map.Entry<Path, DrawingColors>> mPaths1 = new ConcurrentLinkedQueue<Map.Entry<Path, DrawingColors>>();

    private Path mCurrentPath;


    private void init(final Context context) {
        setPen(DrawingPens.PEN_1);
    }

    @Override
    public void onDraw(Canvas canvas) {

        super.onDraw(canvas);

        for (Map.Entry<Path, DrawingPens> entry : mPaths) {
            canvas.drawPath(entry.getKey(), entry.getValue().getPaint());
    

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Seems there's no ability to draw only part of Path using one Paint and draw another part with another one. So, I see the only solution - use multiple Paths and correspond path to the Paint. Also, I would suggest to encapsulate all drawing related information inside view and let Activity operate with high-level stuff.

So the following changes should be applied:

  1. Use some container for Paths and keep Path - Paint relation inside it;
  2. Provide some method from custom View to let Activity change current Pen;
  3. Keep drawing details part inside custom view, because these details might not be needed for Activity;

Like the following:

public class MyActivity extends Activity implements View.OnClickListener {

    private static final String TAG = "MyActivity";

    ImageView pen, color;
    SingleTouchDrawingView mDrawView;
    // Drawing view container
    ImageView mRemove;
    ImageView mEraser;
    LinearLayout pens;
    HorizontalScrollView myplate;
    private Paint mPaint;
    private Paint mBitmapPaint;
    private View aqua;
    private ViewGroup mRootView;

    private Path mPath;
    public Canvas mCanvas;
    View pen1;
    View pen2;
    View pen3;
    View pen4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mRootView = (ViewGroup) findViewById(R.id.root);
        mDrawView = (SingleTouchDrawingView) findViewById(R.id.myview);
        pen = (ImageView) findViewById(R.id.pen);
        pens = (LinearLayout) findViewById(R.id.linear);
        pens.setVisibility(View.GONE);
        pen1 = findViewById(R.id.pen1);
        pen2 = findViewById(R.id.pen2);
        pen3 = findViewById(R.id.pen3);
        pen4 = findViewById(R.id.pen4);
        color = (ImageView) findViewById(R.id.color);
        myplate = (HorizontalScrollView) findViewById(R.id.myplate);

        // colors.........!!!!
        final View red = findViewById(R.id.red);
        final View green = findViewById(R.id.green);
        final View blue = findViewById(R.id.blue);
        final View orange = findViewById(R.id.orange);
        final View yellow = findViewById(R.id.yellow);
        final View cyan = findViewById(R.id.cyan);
        final View black = findViewById(R.id.black);
        final View cofee = findViewById(R.id.coffee);
        final View fuchiya = findViewById(R.id.fuchiya);
        final View gray = findViewById(R.id.gray);
        final View indigo = findViewById(R.id.indigo);
        final View khaki = findViewById(R.id.khaki);
        final View lavendar = findViewById(R.id.lavendar);
        final View magenta = findViewById(R.id.magenta);
        final View mango = findViewById(R.id.mango);
        final View maroon = findViewById(R.id.maroon);
        final View pista = findViewById(R.id.pista);
        final View pink = findViewById(R.id.pink);
        final View purple = findViewById(R.id.purple);

        red.setOnClickListener(this);
        green.setOnClickListener(this);
        blue.setOnClickListener(this);
        orange.setOnClickListener(this);
        yellow.setOnClickListener(this);
        cyan.setOnClickListener(this);
        black.setOnClickListener(this);
        cofee.setOnClickListener(this);
        fuchiya.setOnClickListener(this);
        gray.setOnClickListener(this);
        indigo.setOnClickListener(this);
        khaki.setOnClickListener(this);
        lavendar.setOnClickListener(this);
        magenta.setOnClickListener(this);
        mango.setOnClickListener(this);
        maroon.setOnClickListener(this);
        pista.setOnClickListener(this);
        pink.setOnClickListener(this);
        purple.setOnClickListener(this);

        mEraser = (ImageView) findViewById(R.id.eraser);
        mRemove = (ImageView) findViewById(R.id.remove);

        pen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (pens.getVisibility() == View.VISIBLE) {
                    pens.setVisibility(View.GONE);
                } else {
                    pens.setVisibility(View.VISIBLE);
                    myplate.setVisibility(View.GONE);
                }
            }
        });

        pens.setVisibility(View.GONE);

        pen1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mDrawView.setPen(SingleTouchDrawingView.DrawingPens.PEN_1);
                pens.setVisibility(View.GONE);
            }
        });

        pen2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mDrawView.setPen(SingleTouchDrawingView.DrawingPens.PEN_2);
                pens.setVisibility(View.GONE);
            }
        });

        pen3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                pens.setVisibility(View.GONE);
                mDrawView.setPen(SingleTouchDrawingView.DrawingPens.PEN_3);
            }
        });

        pen4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                pens.setVisibility(View.GONE);
                mDrawView.setPen(SingleTouchDrawingView.DrawingPens.PEN_4);
            }
        });

        mRemove.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mRootView.removeView(mDrawView);
                mDrawView = new SingleTouchDrawingView(MyActivity.this);
                mDrawView.setBackgroundResource(R.drawable.up_image);
                mRootView.addView(mDrawView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
                mRootView.bringChildToFront(findViewById(R.id.tools_container));
                mRootView.bringChildToFront(findViewById(R.id.linear));
                mRootView.bringChildToFront(findViewById(R.id.myplate));
                pens.setVisibility(View.GONE);
                myplate.setVisibility(View.GONE);
            }
        });

        mEraser.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mBitmapPaint.setColor(Color.TRANSPARENT);
                mPath.reset();
                mDrawView.invalidate();
                pens.setVisibility(View.GONE);
                myplate.setVisibility(View.GONE);
            }
        });

        color.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (myplate.getVisibility() == View.VISIBLE) {
                    myplate.setVisibility(View.GONE);
                } else {
                    myplate.setVisibility(View.VISIBLE);
                    pens.setVisibility(View.GONE);
                }
            }
        });
    }

    // /colorpicker................!
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.black:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.BLACK);
                break;
            case R.id.blue:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.BLUE);
                break;
            case R.id.coffee:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.COFEE);
                break;
            case R.id.cyan:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.CYAN);
                break;
            case R.id.fuchiya:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.FUCHIYA);
                break;
            case R.id.gray:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.GRAY);
                break;
            case R.id.green:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.GREEN);
                break;
            case R.id.indigo:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.INDIGO);
                break;
            case R.id.khaki:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.KHAKI);
                break;
            case R.id.lavendar:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.LAVENDAR);
                break;
            case R.id.magenta:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.MAGENTA);
                break;
            case R.id.mango:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.MANGO);
                break;
            case R.id.maroon:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.MAROON);
                break;
            case R.id.orange:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.ORANGE);
                break;
            case R.id.pink:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.PINK);
                break;
            case R.id.pista:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.PISTA);
                break;
            case R.id.purple:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.PURPLE);
                break;
            case R.id.red:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.RED);
                break;
            case R.id.yellow:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.YELLOW);
                break;
        }
    }
}

And view itself:

public class SingleTouchDrawingView extends View {

    public int height;
    public Bitmap mBitmap;
    public Canvas mCanvas;
    public Path mPath;
    public Paint mBitmapPaint;
    Context context;

    public enum DrawingPens {
        PEN_1(6), PEN_2(4), PEN_3(2), PEN_4(1);

        public int mWidth;

        private DrawingPens(final int width) {
            mWidth = width;
        }

        int getPenWidth() {
            return mWidth;
        }
    }

    public enum DrawingColors{
        BLACK(Color.parseColor("#000000")),   BLUE(Color.parseColor("#0000FF")),     COFEE(Color.parseColor("#D2691E")),   CYAN(Color.parseColor("#00FFFF")),
        FUCHIYA(Color.parseColor("#FF00FF")), GRAY(Color.parseColor("#808080")),     GREEN(Color.parseColor("#00FF00")),   INDIGO(Color.parseColor("#4B0082")),
        KHAKI(Color.parseColor("#F0E68C")),   LAVENDAR(Color.parseColor(

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...