如何改变笔的颜色对Android的按钮点击 [英] how to change color of pen on button click in android

查看:178
本文介绍了如何改变笔的颜色对Android的按钮点击的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我做了一个简单的Andr​​oid程序singletouch涂料,它在我所AUT 4种不同大小的笔,我想是基于这种形象我想改变strokesize笔上。我曾尝试如下,请大家帮帮我:

main.java

 公共类MainActivity扩展活动实现OnClickListener {
    ImageView的笔,颜色;
    SingleTouchView mDrawView;
    RelativeLayout的布局,布局1;
    ImageView的删除;
    ImageView的橡皮擦;
    的LinearLayout笔;
    Horizo​​ntalScrollView myplate;
    私人油漆mPaint,m​​BitmapPaint;
    私人按钮的红,绿,蓝,青,黄,橙,浅绿,黑,COFEE,
            fuchiya,灰,蓝,卡其色,薰衣草,品红,芒果,枣红色,
            皮斯塔,粉红色,紫色;    私人路径的mpath;    公共帆布mCanvas;
    PEN1的LinearLayout,PEN2,pen3,pen4;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        mDrawView =(SingleTouchView)findViewById(R.id.myview);
        布局1 =(RelativeLayout的)findViewById(R.id.layout1);
        布局=(RelativeLayout的)findViewById(R.id.layout);
        笔=(ImageView的)findViewById(R.id.pen);
        笔=(的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);
        颜色=(ImageView的)findViewById(R.id.color);
        myplate =(Horizo​​ntalScrollView)findViewById(R.id.myplate);        //颜色......... !!!!
        红色=(按钮)findViewById(R.id.red);
        绿色=(按钮)findViewById(R.id.green);
        蓝=(按钮)findViewById(R.id.blue);
        橙色=(按钮)findViewById(R.id.orange);
        黄色=(按钮)findViewById(R.id.yellow);
        青色=(按钮)findViewById(R.id.cyan);
        黑=(按钮)findViewById(R.id.black);
        COFEE =(按钮)findViewById(R.id.cofee);
        fuchiya =(按钮)findViewById(R.id.fuchiya);
        灰色=(按钮)findViewById(R.id.gray);
        靛蓝=(按钮)findViewById(R.id.indigo);
        卡其色=(按钮)findViewById(R.id.khaki);
        薰衣草=(按钮)findViewById(R.id.lavendar);
        品红=(按钮)findViewById(R.id.magenta);
        芒果=(按钮)findViewById(R.id.mango);
        栗色=(按钮)findViewById(R.id.maroon);
        皮斯塔=(按钮)findViewById(R.id.pista);
        粉色=(按钮)findViewById(R.id.pink);
        紫=(按钮)findViewById(R.id.purple);        red.setOnClickListener(本);
        green.setOnClickListener(本);
        blue.setOnClickListener(本);
        orange.setOnClickListener(本);
        yellow.setOnClickListener(本);
        cyan.setOnClickListener(本);
        black.setOnClickListener(本);
        cofee.setOnClickListener(本);
        fuchiya.setOnClickListener(本);
        gray.setOnClickListener(本);
        indigo.setOnClickListener(本);
        khaki.setOnClickListener(本);
        lavendar.setOnClickListener(本);
        magenta.setOnClickListener(本);
        mango.setOnClickListener(本);
        maroon.setOnClickListener(本);
        pista.setOnClickListener(本);
        pink.setOnClickListener(本);
        purple.setOnClickListener(本);        橡皮擦=(ImageView的)findViewById(R.id.eraser);
        删除=(ImageView的)findViewById(R.id.remove);        pen.setOnClickListener(新OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                // TODO自动生成方法存根
                // layout.addView(mDrawView);
                pens.setVisibility(View.VISIBLE);
            }
        });        pens.setVisibility(View.GONE);        pen1.setOnClickListener(新OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                mDrawView.setPen(SingleTouchView.DrawingPens.PEN_1);
                pens.setVisibility(View.GONE);
            }
        });        pen2.setOnClickListener(新OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                mDrawView.setPen(SingleTouchView.DrawingPens.PEN_2);
                pens.setVisibility(View.GONE);
            }
        });        pen3.setOnClickListener(新OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                pens.setVisibility(View.GONE);
                mDrawView.setPen(SingleTouchView.DrawingPens.PEN_3);
            }
        });        pen4.setOnClickListener(新OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                pens.setVisibility(View.GONE);
                mDrawView.setPen(SingleTouchView.DrawingPens.PEN_4);
            }
        });        remove.setOnClickListener(新OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                layout.removeView(mDrawView);
                mDrawView =新SingleTouchView(MainActivity.this);
                layout.addView(mDrawView);
            }
        });        eraser.setOnClickListener(新OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                mBitmapPaint.setColor(Color.TRANSPARENT);
                mPath.reset();
                mDrawView.invalidate();
                }
        });        color.setOnClickListener(新OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                // TODO自动生成方法存根
                myplate.setVisibility(View.VISIBLE);
            }
        });
    }    // /选色器................!
    @覆盖
    公共无效的onClick(视图v){
        开关(v.getId()){
        案例R.id.black:
            myplate.setVisibility(View.GONE);
            mDrawView.setColor(SingleTouchView.DrawingColors.Black);
            System.out.println(\"===============\"+SingleTouchView.DrawingColors.Black+\"=========================\");
            打破;
        案例R.id.blue:
            myplate.setVisibility(View.GONE);
            //mDrawView.setColor(SingleTouchView.DrawingColors.Blue);
            打破;
        案例R.id.cofee:
            myplate.setVisibility(View.GONE);
            打破;
        案例R.id.cyan:
            myplate.setVisibility(View.GONE);
            打破;
        案例R.id.fuchiya:
            myplate.setVisibility(View.GONE);
            打破;
        案例R.id.gray:
            myplate.setVisibility(View.GONE);
            打破;
        案例R.id.green:
            myplate.setVisibility(View.GONE);            打破;
        案例R.id.indigo:
            myplate.setVisibility(View.GONE);
            打破;
        案例R.id.khaki:
            myplate.setVisibility(View.GONE);
            打破;
        案例R.id.lavendar:
            myplate.setVisibility(View.GONE);
            打破;
        案例R.id.magenta:
            myplate.setVisibility(View.GONE);
            打破;
        案例R.id.mango:
            myplate.setVisibility(View.GONE);
            打破;
        案例R.id.maroon:
            myplate.setVisibility(View.GONE);
            打破;
        案例R.id.orange:
            myplate.setVisibility(View.GONE);
            打破;
        案例R.id.pink:
            myplate.setVisibility(View.GONE);
            打破;
        案例R.id.pista:
            myplate.setVisibility(View.GONE);
            打破;
        案例R.id.purple:
            myplate.setVisibility(View.GONE);
            打破;
        案例R.id.red:
            myplate.setVisibility(View.GONE);            打破;
        案例R.id.yellow:
            myplate.setVisibility(View.GONE);
            打破;
        }
    }
}

Singleotuch.java

 公共类SingleTouchView扩展视图{
    公共静态INT宽度;
    公众诠释高度;
    公共位图mBitmap;
    公共帆布mCanvas;
    公共道路的mpath;
    市民漆mBitmapPaint;
    上下文语境;
    市民漆mPaint;
    市民漆circlePaint;
    公共路径circlePath;    公共枚举DrawingPens {
        PEN_1(6),PEN_2(4),PEN_3(2),PEN_4(1);        市民漆mPaint;        私人DrawingPens(最终诠释宽度){
            mPaint =新的油漆();            mPaint.setAntiAlias​​(真);
            mPaint.setStrokeWidth(宽);            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeJoin(Paint.Join.ROUND);
        }        油漆getPaint(){
            返回mPaint;
        }
    }    公共枚举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\"));        市民漆mPaint;        私人DrawingColors(最终诠释颜色){
            mPaint =新的油漆();            mPaint.setAntiAlias​​(真);
            mPaint.setStrokeWidth(宽);
            mPaint.setColor(颜色);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeJoin(Paint.Join.ROUND);
        }        油漆getPaint(){
            返回mPaint;
        }
    }    公共SingleTouchView(最终上下文的背景下){
        超级(上下文);        初始化(上下文);
    }    公共SingleTouchView(最终上下文的背景下,最终的AttributeSet ATTRS){
        超(背景下,ATTRS);        初始化(上下文);
        mBitmap = Bitmap.createBitmap(400,400,Bitmap.Config.ARGB_8888);
        mCanvas =新的Canvas(mBitmap);
        的mpath =新路径();
        mBitmapPaint =新的油漆(Paint.DITHER_FLAG);        mPaint =新的油漆();
        mPaint.setAntiAlias​​(真);
        mPaint.setDither(真);
        mPaint.setColor(0xFFFF0000地址);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap​​(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(12);
    }    公共SingleTouchView(最终上下文的背景下,最终的AttributeSet ATTRS,
            最终诠释defStyle){
        超(背景下,ATTRS,defStyle);        初始化(上下文);
    }    私人的ConcurrentLinkedQueue<&Map.Entry的LT;路径,DrawingPens>> mPaths =新的ConcurrentLinkedQueue<&Map.Entry的LT;路径,DrawingPens>>();
    私人的ConcurrentLinkedQueue<&Map.Entry的LT;路径,DrawingColors>> mPaths1 =新的ConcurrentLinkedQueue<&Map.Entry的LT;路径,DrawingColors>>();    私人路径mCurrentPath;
    私人无效的init(最终上下文的背景下){
        setPen(DrawingPens.PEN_1);
    }    @覆盖
    公共无效的onDraw(帆布油画){        super.onDraw(画布);        对于(Map.Entry的<路径,DrawingPens>项:mPaths){
            canvas.drawPath(entry.getKey(),entry.getValue()getPaint());
        }
    }    @覆盖
    公共布尔onTouchEvent(MotionEvent我){
        浮eventX = me.getX();
        浮eventY = me.getY();        开关(me.getAction()){
        案例MotionEvent.ACTION_DOWN:
            mCurrentPath.moveTo(eventX,eventY);
            返回true;
        案例MotionEvent.ACTION_MOVE:
            mCurrentPath.lineTo(eventX,eventY);
            打破;
        案例MotionEvent.ACTION_UP:
            打破;
        }        无效();        返回true;
    }    公共无效setPen(最终DrawingPens笔){        mCurrentPath =新路径();
        mPaths.add(新AbstractMap.SimpleImmutableEntry<路径,DrawingPens>(
                mCurrentPath,笔));
    }
    公共无效橡皮擦(){
        mPaint =新的油漆();
    }
    公共无效的setColor(最终DrawingColors颜色){        mCurrentPath =新路径();
        mPaths1.add(新AbstractMap.SimpleImmutableEntry<路径,DrawingColors>(
                mCurrentPath,颜色));
    }
}


解决方案

好像没有仅绘制使用一个涂料路径的一部分能力,并绘制另一个另一部分。所以,我看到的唯一的解决方案 - 利用多个路径和对应油漆路径。另外,我建议封装内视图所有绘图相关的信息和活动,让高层次的东西进行操作。

所以下面的变化应该应用:


  1. 使用某些容器路径和保持路 - 油漆关系里面;

  2. 提供定制的一些方法查看让活动改变目前的笔;

  3. 保持绘制自定义视图中的细节部分,因为可能不需要为这些活动的详细信息;

这样的:

 公共类MyActivity扩展活动实现View.OnClickListener {    私有静态最后弦乐TAG =MyActivity;    ImageView的笔,颜色;
    SingleTouchDrawingView mDrawView;
    //工程视图容器
    ImageView的mRemove;
    ImageView的mEraser;
    的LinearLayout笔;
    Horizo​​ntalScrollView myplate;
    私人涂料mPaint;
    私人涂料mBitmapPaint;
    私人查看AQUA;
    私人的ViewGroup mRootView;    私人路径的mpath;
    公共帆布mCanvas;
    查看PEN1;
    查看PEN2;
    查看pen3;
    查看pen4;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main);
        mRootView =(ViewGroup中)findViewById(R.id.root);
        mDrawView =(SingleTouchDrawingView)findViewById(R.id.myview);
        笔=(ImageView的)findViewById(R.id.pen);
        笔=(的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);
        颜色=(ImageView的)findViewById(R.id.color);
        myplate =(Horizo​​ntalScrollView)findViewById(R.id.myplate);        //颜色......... !!!!
        最后查看红色= findViewById(R.id.red);
        最后查看绿色= findViewById(R.id.green);
        最后查看蓝= findViewById(R.id.blue);
        最后查看橙色= findViewById(R.id.orange);
        最后查看黄色= findViewById(R.id.yellow);
        最后查看青色= findViewById(R.id.cyan);
        最后查看黑= findViewById(R.id.black);
        最后查看COFEE = findViewById(R.id.coffee);
        最后查看fuchiya = findViewById(R.id.fuchiya);
        最后查看灰色= findViewById(R.id.gray);
        最后查看靛蓝= findViewById(R.id.indigo);
        最后查看卡其= findViewById(R.id.khaki);
        最后查看薰衣草= findViewById(R.id.lavendar);
        最后查看品红= findViewById(R.id.magenta);
        最后查看芒果= findViewById(R.id.mango);
        最后查看栗色= findViewById(R.id.maroon);
        最后查看皮斯塔= findViewById(R.id.pista);
        最后查看粉色= findViewById(R.id.pink);
        最后查看紫= findViewById(R.id.purple);        red.setOnClickListener(本);
        green.setOnClickListener(本);
        blue.setOnClickListener(本);
        orange.setOnClickListener(本);
        yellow.setOnClickListener(本);
        cyan.setOnClickListener(本);
        black.setOnClickListener(本);
        cofee.setOnClickListener(本);
        fuchiya.setOnClickListener(本);
        gray.setOnClickListener(本);
        indigo.setOnClickListener(本);
        khaki.setOnClickListener(本);
        lavendar.setOnClickListener(本);
        magenta.setOnClickListener(本);
        mango.setOnClickListener(本);
        maroon.setOnClickListener(本);
        pista.setOnClickListener(本);
        pink.setOnClickListener(本);
        purple.setOnClickListener(本);        mEraser =(ImageView的)findViewById(R.id.eraser);
        mRemove =(ImageView的)findViewById(R.id.remove);        pen.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                如果(pens.getVisibility()== View.VISIBLE){
                    pens.setVisibility(View.GONE);
                }其他{
                    pens.setVisibility(View.VISIBLE);
                    myplate.setVisibility(View.GONE);
                }
            }
        });        pens.setVisibility(View.GONE);        pen1.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                mDrawView.setPen(SingleTouchDrawingView.DrawingPens.PEN_1);
                pens.setVisibility(View.GONE);
            }
        });        pen2.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                mDrawView.setPen(SingleTouchDrawingView.DrawingPens.PEN_2);
                pens.setVisibility(View.GONE);
            }
        });        pen3.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                pens.setVisibility(View.GONE);
                mDrawView.setPen(SingleTouchDrawingView.DrawingPens.PEN_3);
            }
        });        pen4.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                pens.setVisibility(View.GONE);
                mDrawView.setPen(SingleTouchDrawingView.DrawingPens.PEN_4);
            }
        });        mRemove.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                mRootView.removeView(mDrawView);
                mDrawView =新SingleTouchDrawingView(MyActivity.this);
                mDrawView.setBackgroundResource(R.drawable.up_image);
                mRootView.addView(mDrawView,新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(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                mBitmapPaint.setColor(Color.TRANSPARENT);
                mPath.reset();
                mDrawView.invalidate();
                pens.setVisibility(View.GONE);
                myplate.setVisibility(View.GONE);
            }
        });        color.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                如果(myplate.getVisibility()== View.VISIBLE){
                    myplate.setVisibility(View.GONE);
                }其他{
                    myplate.setVisibility(View.VISIBLE);
                    pens.setVisibility(View.GONE);
                }
            }
        });
    }    // /选色器................!
    @覆盖
    公共无效的onClick(视图v){
        开关(v.getId()){
            案例R.id.black:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.BLACK);
                打破;
            案例R.id.blue:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.BLUE);
                打破;
            案例R.id.coffee:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.COFEE);
                打破;
            案例R.id.cyan:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.CYAN);
                打破;
            案例R.id.fuchiya:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.FUCHIYA);
                打破;
            案例R.id.gray:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.GRAY);
                打破;
            案例R.id.green:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.GREEN);
                打破;
            案例R.id.indigo:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.INDIGO);
                打破;
            案例R.id.khaki:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.KHAKI);
                打破;
            案例R.id.lavendar:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.LAVENDAR);
                打破;
            案例R.id.magenta:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.MAGENTA);
                打破;
            案例R.id.mango:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.MANGO);
                打破;
            案例R.id.maroon:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.MAROON);
                打破;
            案例R.id.orange:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.ORANGE);
                打破;
            案例R.id.pink:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.PINK);
                打破;
            案例R.id.pista:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.PISTA);
                打破;
            案例R.id.purple:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.PURPLE);
                打破;
            案例R.id.red:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.RED);
                打破;
            案例R.id.yellow:
                myplate.setVisibility(View.GONE);
                mDrawView.setColor(SingleTouchDrawingView.DrawingColors.YELLOW);
                打破;
        }
    }
}

和视图本身:

 公共类SingleTouchDrawingView扩展视图{    公众诠释高度;
    公共位图mBitmap;
    公共帆布mCanvas;
    公共道路的mpath;
    市民漆mBitmapPaint;
    上下文语境;    公共枚举DrawingPens {
        PEN_1(6),PEN_2(4),PEN_3(2),PEN_4(1);        公众诠释mWidth;        私人DrawingPens(最终诠释宽度){
            mWidth =宽度;
        }        INT getPenWidth(){
            返回mWidth;
        }
    }    公共枚举DrawingColors {
        黑色(Color.parseColor(#000000)),蓝色(Color.parseColor(#0000FF)),COFEE(Color.parseColor(#D2691E)),青(Color.parseColor(#00FFFF) )
        FUCHIYA(Color.parseColor(#FF00FF)),灰色(Color.parseColor(#808080)),绿色(Color.parseColor(#00FF00)),靛蓝(Color.parseColor(#4B0082) )
        卡其(Color.parseColor(#F0E68C)),薰衣草(Color.parseColor(#E6E6FA)),品红(Color.parseColor(#FF00FF)),芒果(Color.parseColor(#FF8C00) )
        栗色(Color.parseColor(#800000)),橙色(Color.parseColor(#FFA500)),粉红色(Color.parseColor(#FFC0CB)),PISTA(Color.parseColor(#9ACD32) )
        紫色(Color.parseColor(#800080)),红(Color.parseColor(#FF0000)),TAN(Color.parseColor(#0000A0)),黄(Color.parseColor(#FFD801) );        私人诠释mColorValue;        私人DrawingColors(最终诠释颜色){
            mColorValue =颜色;
        }        INT getColorValue(){
            返回mColorValue;
        }
    }    公共SingleTouchDrawingView(最终上下文的背景下){
        超级(上下文);        初始化(上下文);
    }    公共SingleTouchDrawingView(最终上下文的背景下,最终的AttributeSet ATTRS){
        超(背景下,ATTRS);        初始化(上下文);
        mBitmap = Bitmap.createBitmap(400,400,Bitmap.Config.ARGB_8888);
        mCanvas =新的Canvas(mBitmap);
        的mpath =新路径();
        mBitmapPaint =新的油漆(Paint.DITHER_FLAG);
    }    公共SingleTouchDrawingView(最终上下文的背景下,
                                  最终的AttributeSet ATTRS,
                                  最终诠释defStyle){
        超(背景下,ATTRS,defStyle);        初始化(上下文);
    }    私人的ConcurrentLinkedQueue<&Map.Entry的LT;路径,为Map.Entry< D​​rawingPens,DrawingColors>>> mPaths =新的ConcurrentLinkedQueue<&Map.Entry的LT;路径,为Map.Entry< D​​rawingPens,DrawingColors>>>();
    创建{@link油漆} / **存储对象* /
    私人的HashMap<&Map.Entry的LT; D​​rawingPens,DrawingColors>中油漆和GT; mPaints =新的HashMap<&Map.Entry的LT; D​​rawingPens,DrawingColors>中油漆和GT;();
    / **当前漆参数 - PEN_1宽度和黑色* /
    私人AbstractMap.SimpleImmutableEntry< D​​rawingPens,DrawingColors> mCurrentPaintParameters =新AbstractMap.SimpleImmutableEntry< D​​rawingPens,DrawingColors>(DrawingPens.PEN_1,DrawingColors.BLACK);    私人路径mCurrentPath = NULL;
    私人无效的init(最终上下文的背景下){
        //初始化默认油漆
        getPaintWithParameters(mCurrentPaintParameters);
        mCurrentPath =新路径();
        mPaths.add(新AbstractMap.SimpleImmutableEntry<路径,为Map.Entry< D​​rawingPens,DrawingColors>>(mCurrentPath,mCurrentPaintParameters));
    }    / **
     *助手创建从参数油漆
     *
     * @参数paintParameters
     * @返回
     * /
    民营涂料getPaintWithParameters(最终为Map.Entry< D​​rawingPens,DrawingColors> paintParameters){
        涂料粉刷= mPaints.get(paintParameters);        如果(空==漆){
            油漆=新的油漆();
            paint.setAntiAlias​​(真);
            paint.setDither(真);
            paint.setStrokeWidth(paintParameters.getKey()getPenWidth());
            paint.setColor(paintParameters.getValue()getColorValue());
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setStrokeCap​​(Paint.Cap.ROUND);            mPaints.put(paintParameters,油漆);
        }        回漆;
    }    @覆盖
    公共无效的onDraw(帆布油画){
        super.onDraw(画布);        对于(Map.Entry的<路径,为Map.Entry< D​​rawingPens,DrawingColors>>项:mPaths){
            canvas.drawPath(entry.getKey(),getPaintWithParameters((entry.getValue())));
        }
    }    @覆盖
    公共布尔onTouchEvent(MotionEvent我){
        浮eventX = me.getX();
        浮eventY = me.getY();        开关(me.getAction()){
            案例MotionEvent.ACTION_DOWN:
                mCurrentPath.moveTo(eventX,eventY);
                返回true;
            案例MotionEvent.ACTION_MOVE:
                mCurrentPath.lineTo(eventX,eventY);
                打破;
            案例MotionEvent.ACTION_UP:
                打破;
        }        无效();        返回true;
    }    公共无效setPen(最终DrawingPens笔){
        mCurrentPath =新路径();        mCurrentPaintParameters =新AbstractMap.SimpleImmutableEntry< D​​rawingPens,DrawingColors>(笔,mCurrentPaintParameters.getValue());        mPaths.add(新AbstractMap.SimpleImmutableEntry<路径,为Map.Entry< D​​rawingPens,DrawingColors>>(mCurrentPath,mCurrentPaintParameters));
    }    公共无效橡皮擦(){
        //获取默认的参数漆
        mCurrentPaintParameters =新AbstractMap.SimpleImmutableEntry< D​​rawingPens,DrawingColors>(DrawingPens.PEN_1,DrawingColors.BLACK);
    }    公共无效的setColor(最终DrawingColors颜色){
        mCurrentPath =新路径();        mCurrentPaintParameters =新AbstractMap.SimpleImmutableEntry< D​​rawingPens,DrawingColors>(mCurrentPaintParameters.getKey(),彩色);        mPaths.add(新AbstractMap.SimpleImmutableEntry<路径,为Map.Entry< D​​rawingPens,DrawingColors>>(mCurrentPath,mCurrentPaintParameters));
    }
}

更新(有自定义颜色/宽度):

您的code问题在code不一致,以及如何Java的收藏的不正确的认识的作品。你不需要 mPaths1 附加集合,但应使用相同的集合所有的绘图和维护额外的结构(在我们的情况下,它是 Map.Entry的< DrawingPens,DrawingColors> ),它可以准确识别油漆并与路径集合中。对于藏品的详细信息,我建议在甲骨文试验的。

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:

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());
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent me) {
        float eventX = me.getX();
        float eventY = me.getY();

        switch (me.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mCurrentPath.moveTo(eventX, eventY);
            return true;
        case MotionEvent.ACTION_MOVE:
            mCurrentPath.lineTo(eventX, eventY);
            break;
        case MotionEvent.ACTION_UP:
            break;
        }

        invalidate();

        return true;
    }

    public void setPen(final DrawingPens pen) {

        mCurrentPath = new Path();
        mPaths.add(new AbstractMap.SimpleImmutableEntry<Path, DrawingPens>(
                mCurrentPath, pen));
    }
    public void eraser() {
        mPaint = new Paint();
    }
    public void setColor(final DrawingColors color ) {

        mCurrentPath = new Path();
        mPaths1.add(new AbstractMap.SimpleImmutableEntry<Path, DrawingColors>(
                mCurrentPath, color));
    }
}

解决方案

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("#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"));

        private int mColorValue;

        private DrawingColors(final int color) {
            mColorValue = color;
        }

        int getColorValue() {
            return mColorValue;
        }
    }

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

        init(context);
    }

    public SingleTouchDrawingView(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);
    }

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

        init(context);
    }

    private ConcurrentLinkedQueue<Map.Entry<Path, Map.Entry<DrawingPens, DrawingColors>>> mPaths = new ConcurrentLinkedQueue<Map.Entry<Path, Map.Entry<DrawingPens, DrawingColors>>>();
    /** Stores created {@link Paint} objects */
    private HashMap<Map.Entry<DrawingPens, DrawingColors>, Paint> mPaints = new HashMap<Map.Entry<DrawingPens, DrawingColors>, Paint>();
    /** Current paint parameters - PEN_1 width and BLACK color */
    private AbstractMap.SimpleImmutableEntry<DrawingPens, DrawingColors> mCurrentPaintParameters = new AbstractMap.SimpleImmutableEntry<DrawingPens, DrawingColors>(DrawingPens.PEN_1, DrawingColors.BLACK);

    private Path mCurrentPath = null;


    private void init(final Context context) {
        // Initialize default paint
        getPaintWithParameters(mCurrentPaintParameters);
        mCurrentPath = new Path();
        mPaths.add(new AbstractMap.SimpleImmutableEntry<Path, Map.Entry<DrawingPens, DrawingColors>>(mCurrentPath, mCurrentPaintParameters));
    }

    /**
     * Helper to create Paint from parameters
     *
     * @param paintParameters
     * @return
     */
    private Paint getPaintWithParameters(final Map.Entry<DrawingPens, DrawingColors> paintParameters) {
        Paint paint = mPaints.get(paintParameters);

        if (null == paint) {
            paint = new Paint();
            paint.setAntiAlias(true);
            paint.setDither(true);
            paint.setStrokeWidth(paintParameters.getKey().getPenWidth());
            paint.setColor(paintParameters.getValue().getColorValue());
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setStrokeCap(Paint.Cap.ROUND);

            mPaints.put(paintParameters, paint);
        }

        return paint;
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);

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

    @Override
    public boolean onTouchEvent(MotionEvent me) {
        float eventX = me.getX();
        float eventY = me.getY();

        switch (me.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mCurrentPath.moveTo(eventX, eventY);
                return true;
            case MotionEvent.ACTION_MOVE:
                mCurrentPath.lineTo(eventX, eventY);
                break;
            case MotionEvent.ACTION_UP:
                break;
        }

        invalidate();

        return true;
    }

    public void setPen(final DrawingPens pen) {
        mCurrentPath = new Path();

        mCurrentPaintParameters = new AbstractMap.SimpleImmutableEntry<DrawingPens, DrawingColors>(pen, mCurrentPaintParameters.getValue());

        mPaths.add(new AbstractMap.SimpleImmutableEntry<Path, Map.Entry<DrawingPens, DrawingColors>>(mCurrentPath, mCurrentPaintParameters));
    }

    public void eraser() {
        // Get default paint parameters
        mCurrentPaintParameters = new AbstractMap.SimpleImmutableEntry<DrawingPens, DrawingColors>(DrawingPens.PEN_1, DrawingColors.BLACK);
    }

    public void setColor(final DrawingColors color ) {
        mCurrentPath = new Path();

        mCurrentPaintParameters = new AbstractMap.SimpleImmutableEntry<DrawingPens, DrawingColors>(mCurrentPaintParameters.getKey(), color);

        mPaths.add(new AbstractMap.SimpleImmutableEntry<Path, Map.Entry<DrawingPens, DrawingColors>>(mCurrentPath, mCurrentPaintParameters));
    }
}

UPDATE (for having custom colours/widths):

Issue with Your code was in code inconsistency and incorrect understanding of how Java Collections works. You don't need mPaths1 additional collection, but should use the same collection for all drawing and maintain additional structure (in our case it's Map.Entry<DrawingPens, DrawingColors>) which could identify exact Paint and to be used with collection of paths. For more details of collections I would suggest to start at Oracle Trials.

这篇关于如何改变笔的颜色对Android的按钮点击的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆