颜色拾取android系统中不工作 [英] ColorPicker in android not working

查看:223
本文介绍了颜色拾取android系统中不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经学习了一个简单的画图Android程序,我已经把它适当地府选择任何颜色后显示一个ColorDialog类,笔的颜色没有改变,它仍然是黑的默认color.I试图为下面,请大家帮帮我吧,我的code是如下:

Main.java

 包com.example.singletouch;

进口java.util.AbstractMap中;
进口的java.util.Map;
进口java.util.concurrent.ConcurrentLinkedQueue中;

进口com.example.singletouch.SingleTouchView.DrawingPens;

进口android.os.Bundle;
进口android.app.ActionBar.LayoutParams;
进口android.app.Activity;
进口android.content.Context;
进口android.graphics.Bitmap;
进口android.graphics.Canvas;
进口android.graphics.Color;
进口android.graphics.Paint;
进口android.graphics.Path;
进口android.util.AttributeSet;
进口android.view.MotionEvent;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.widget.Horizo​​ntalScrollView;
进口android.widget.ImageView;
进口android.widget.LinearLayout;
进口android.widget.RelativeLayout;
进口android.widget.TextView;

公共类MainActivity扩展活动器具
        ColorPickerDialog.OnColorChangedListener {
    ImageView的笔,颜色;
    SingleTouchView mDrawView;
    RelativeLayout的布局,布局1;
    ImageView的删除;
    ImageView的橡皮擦;
    涂料mPaint;
    私人的LinearLayout list_color;
    的LinearLayout笔;

    私人TextView的select_color;
    私人诠释selectedColor = 0x00FF0000;
    Horizo​​ntalScrollView myplate;




    私人路径的mpath;

    公共帆布mCanvas;
    的LinearLayout PEN1,PEN2,PEN3,pen4;

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        mDrawView =(SingleTouchView)findViewById(R.id.myview);

        布局=(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.eraser);
        删除=(ImageView的)findViewById(R.id.remove);
        颜色=(ImageView的)findViewById(R.id.color);


        pen.setOnClickListener(新OnClickListener(){

            公共无效的onClick(视图v){
                // TODO自动生成方法存根
                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){


            }
        });

        color.setOnClickListener(新OnClickListener(){

            @覆盖
            公共无效的onClick(视图v){
                // TODO自动生成方法存根
                // myplate.setVisibility(View.VISIBLE);
                新ColorPickerDialog(MainActivity.this,MainActivity.this,
                mPaint.getColor())显示()。

            }
        });

    }

    @覆盖
    公共无效colorChanged(INT颜色){
        // TODO自动生成方法存根
        mPaint.getColor();
    }



}
 类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;
        }
    }

    公共SingleTouchView(最终上下文的背景下){
        超(上下文);

        的init(上下文);
    }

    公共SingleTouchView(最终上下文的背景下,最终的AttributeSet ATTRS){
        超(背景下,ATTRS);

        的init(上下文);
        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);

        的init(上下文);
    }

    私人的ConcurrentLinkedQueue<为Map.Entry<路径,DrawingPens>> mPaths =新的ConcurrentLinkedQueue<为Map.Entry<路径,DrawingPens>>();

    私人路径mCurrentPath;

    私人无效的init(最终上下文的背景下){

        setPen(DrawingPens.PEN_3);

    }

    @覆盖
    公共无效的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,笔));
    }
 

Col​​orPickerDialog.java

 公共类ColorPickerDialog扩展对话框{
    公共接口OnColorChangedListener {
        无效colorChanged(INT颜色);
    }

    私人OnColorChangedListener mListener;
    私人诠释mInitialColor;

    私有静态类ColorPickerView扩展视图{
        私人油漆mPaint;
        私人油漆mCenterPaint;
        私人最终诠释[] mColors;
        私人OnColorChangedListener mListener;

        ColorPickerView(上下文C,OnColorChangedListener L,INT的颜色){
            超级(C);
            mListener =升;
            mColors =新INT [] {
                0xFFFF0000地址,0xFFFF00FF,0xFF0000FF,0xFF00FFFF,0xFF00FF00,
                0xFFFFFF00,0xFFFF0000地址
            };
            着色器S =新SweepGradient(0,0,mColors,NULL);

            mPaint =新的油漆(Paint.ANTI_ALIAS_FLAG);
            mPaint.setShader(多个);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(32);

            mCenterPaint =新的油漆(Paint.ANTI_ALIAS_FLAG);
            mCenterPaint.setColor(颜色);
            mCenterPaint.setStrokeWidth(5);
        }

        私人布尔mTrackingCenter;
        私人布尔mHighlightCenter;

        保护无效的OnDraw(帆布油画){
            浮动R = CENTER_X  -  mPaint.getStrokeWidth()* 0.5F;

            canvas.translate(CENTER_X,CENTER_X);

            canvas.drawOval(新RectF(-r,-r,R,R),mPaint);
            canvas.drawCircle(0,0,CENTER_RADIUS,mCenterPaint);

            如果(mTrackingCenter){
                INT C = mCenterPaint.getColor();
                mCenterPaint.setStyle(Paint.Style.STROKE);

                如果(mHighlightCenter){
                    mCenterPaint.setAlpha(0xFF的);
                } 其他 {
                    mCenterPaint.setAlpha(0x80的);
                }
                canvas.drawCircle(0,0,
                                  CENTER_RADIUS + mCenterPaint.getStrokeWidth(),
                                  mCenterPaint);

                mCenterPaint.setStyle(Paint.Style.FILL);
                mCenterPaint.setColor(C);
            }
        }

        保护无效onMeasure(INT widthMeasureSpec,诠释heightMeasureSpec){
            setMeasuredDimension(CENTER_X * 2,* CENTER_Y 2);
        }

        私有静态最终诠释CENTER_X = 100;
        私有静态最终诠释CENTER_Y = 100;
        私有静态最终诠释CENTER_RADIUS = 32;

        私人诠释floatToByte(浮点X){
            INT N = java.lang.Math.round(X);
            返回N;
        }
        私人诠释pinToByte(INT N){
            如果(正℃,){
                N = 0;
            }否则如果(N> 255){
                N = 255;
            }
            返回N;
        }

        私人诠释AVE(int类型,INT研发,浮动P){
            返回S + java.lang.Math.round(P *(D  -  S));
        }

        私人诠释interpColor(INT颜色[],浮点单元){
            如果(单元其中; = 0){
                返回颜色[0];
            }
            如果(部> = 1){
                返回颜色[colors.length  -  1];
            }

            浮动P =单位*(colors.length  -  1);
            INT I =(INT)P;
            对 -  =我;

            //现在p是刚刚小数部分[0 ... 1),i是索引
            INT C0 =颜色[I]
            INT C1 =颜色[I + 1];
            int的一个= AVE(Color.alpha(C0),Color.alpha(C1)中,p);
            INT R = AVE(Color.red(C0),Color.red(C1)中,p);
            INT克= AVE(Color.green(C0),Color.green(C1)中,p);
            INT B = AVE(Color.blue(C0),Color.blue(C1)中,p);

            返回Color.argb(A,R,G,B);
        }

        私人诠释rotateColor(INT色,浮RAD){
            浮度=弧度* 180 / 3.1415927f;
            INT R = Color.red(彩色);
            INT G = Color.green(彩色);
            INT B = Color.blue(彩色);

            嘉洛斯厘米=新嘉洛斯();
            嘉洛斯TMP =新嘉洛斯();

            cm.setRGB2YUV();
            tmp.setRotate(0,度);
            cm.postConcat(TMP);
            tmp.setYUV2RGB();
            cm.postConcat(TMP);

            最终浮动[] A = cm.getArray();

            INT IR = floatToByte(一个[0] * R + A [1] * G +一个[2] * b)条;
            INT IG = floatToByte(一个[5] * R + A [6] * G + A [7] * b)条;
            INT IB = floatToByte(一个[10] * R + A [11] * G + A [12] * b)条;

            返回Color.argb(Color.alpha(颜色),pinToByte(IR),
                              pinToByte(IG),pinToByte(IB));
        }

        私有静态最终浮动PI = 3.1415926f;

        @覆盖
        公共布尔的onTouchEvent(MotionEvent事件){
            浮X = event.getX() -  CENTER_X;
            浮动Y = event.getY() -  CENTER_Y;
            布尔内心= java.lang.Math.sqrt(X * X + Y * Y)< = CENTER_RADIUS;

            开关(event.getAction()){
                案例MotionEvent.ACTION_DOWN:
                    mTrackingCenter =内心;
                    如果(内心){
                        mHighlightCenter =真;
                        无效();
                        打破;
                    }
                案例MotionEvent.ACTION_MOVE:
                    如果(mTrackingCenter){
                        如果(mHighlightCenter!=内心){
                            mHighlightCenter =内心;
                            无效();
                        }
                    } 其他 {
                        浮动角=(浮点)java.lang.Math.atan2(Y,X);
                        //需要打开的角度[-PI ... PI]为单位[0 .... 1]
                        浮单位=角/(2 * PI);
                        如果(单位℃,){
                            单元+ = 1;
                        }
                        mCenterPaint.setColor(interpColor(mColors,股吧));
                        无效();
                    }
                    打破;
                案例MotionEvent.ACTION_UP:
                    如果(mTrackingCenter){
                        如果(内心){
                            mListener.colorChanged(mCenterPaint.getColor());
                        }
                        mTrackingCenter = FALSE; //所以我们得出的w / o晕
                        无效();
                    }
                    打破;
            }
            返回true;
        }
    }

    公共ColorPickerDialog(上下文的背景下,
                             OnColorChangedListener监听器,
                             INT initialColor){
        超(上下文);

        mListener =侦听器;
        mInitialColor = initialColor;
    }

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        OnColorChangedListener L =新OnColorChangedListener(){
            公共无效colorChanged(INT颜色){
                mListener.colorChanged(颜色);
                解雇();
            }
        };

        的setContentView(新ColorPickerView(的getContext(),升,mInitialColor));
        的setTitle(选择颜色);
    }
}
 

崩溃日志:

  08-06 15:44:00.427:E / AndroidRuntime(3617):显示java.lang.NullPointerException
    08-06 15:44:00.427:E / AndroidRuntime(3617):在com.example.singletouch.MainActivity $ 8.onClick(MainActivity.java:134)
    08-06 15:44:00.427:E / AndroidRuntime(3617):在android.view.View.performClick(View.java:3511)
    08-06 15:44:00.427:E / AndroidRuntime(3617):在android.view.View $ PerformClick.run(View.java:14109)
    08-06 15:44:00.427:E / AndroidRuntime(3617):在android.os.Handler.handleCallback(Handler.java:605)
    08-06 15:44:00.427:E / AndroidRuntime(3617):在android.os.Handler.dispatchMessage(Handler.java:92)
    08-06 15:44:00.427:E / AndroidRuntime(3617):在android.os.Looper.loop(Looper.java:137)
    08-06 15:44:00.427:E / AndroidRuntime(3617):在android.app.ActivityThread.main(ActivityThread.java:4424)
    08-06 15:44:00.427:E / AndroidRuntime(3617):在java.lang.reflect.Method.invokeNative(本机方法)
    08-06 15:44:00.427:E / AndroidRuntime(3617):在java.lang.reflect.Method.invoke(Method.java:511)
    08-06 15:44:00.427:E / AndroidRuntime(3617):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
    08-06 15:44:00.427:E / AndroidRuntime(3617):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    08-06 15:44:00.427:E / AndroidRuntime(3617):在dalvik.system.NativeStart.main(本机方法)
 

解决方案

使用以下作为参考。根据您的需要修改。我用你用同样的颜色选择器。

正如你看到的图纸视图是一个内部类的活动类的,我用一个单一的涂料对象,所以在颜色的变化反映了平局。

MainActivity.java

 公共类MainActivity扩展活动
        实现ColorPickerDialog.OnColorChangedListener {

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(新MyView的(这个));

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

        mEmboss =新EmbossMaskFilter(新浮法[] {1,1,1},
                                       0.4f,6,3.5F);

        运动模糊=新BlurMaskFilter(8,BlurMaskFilter.Blur.NORMAL);
    }

    私人油漆mPaint;
    私人MaskFilter将mEmboss;
    私人MaskFilter将运动模糊;

    公共无效colorChanged(INT颜色){
        mPaint.setColor(颜色);
    }

    公共类MyView的扩展视图{

        私有静态最终浮动MINP = 0.25f;
        私有静态最终浮动MAXP = 0.75f​​;

        私人位图mBitmap;
        私人帆布mCanvas;
        私人路径的mpath,circlePath;
        私人油漆mBitmapPaint,circlePaint;

        公共MyView的(语境C){
            超级(C);
            circlePaint =新的油漆();
            circlePath =新路径();
            circlePaint.setAntiAlias​​(真正的);
            circlePaint.setColor(Color.BLUE);
            circlePaint.setStyle(Paint.Style.STROKE);
            circlePaint.setStrokeJoin(Paint.Join.MITER);
            circlePaint.setStrokeWidth(4F);

            的mpath =新路径();
            mBitmapPaint =新的油漆(Paint.DITHER_FLAG);
        }

        @覆盖
        保护无效onSizeChanged(INT W,INT小时,INT oldw,诠释oldh){
            super.onSizeChanged(W,H,oldw,oldh);
            mBitmap = Bitmap.createBitmap(W,H,Bitmap.Config.ARGB_8888);
            mCanvas =新的Canvas(mBitmap);
        }

        @覆盖
        保护无效的OnDraw(帆布油画){
            canvas.drawColor(0xFFAAAAAA);

            canvas.drawBitmap(mBitmap,0,0,mBitmapPaint);

            canvas.drawPath(的mpath,mPaint);
            canvas.drawPath(circlePath,circlePaint);
        }

        私人浮动MX,我的;
        私有静态最终浮动TOUCH_TOLERANCE = 4;

        私人无效touch_start(浮X,浮动Y){
            mPath.reset();
            mPath.moveTo(X,Y);
            MX = X;
            我= Y;
        }
        私人无效TOUCH_MOVE(浮X,浮动Y){
            浮DX = Math.abs(X  -  MX);
            浮DY = Math.abs(Y  - 我的);
            如果(DX> = TOUCH_TOLERANCE || DY> = TOUCH_TOLERANCE){
                mPath.quadTo(MX,MY,(X + MX)/ 2,(Y +我)/ 2);
                MX = X;
                我= Y;
            }
            circlePath.reset();
            circlePath.addCircle(MX,我,30,Path.Direction.CW);
        }
        私人无效touch_up(){
            mPath.lineTo(MX,MY);
            //提交路径,我们的屏幕外
            mCanvas.drawPath(的mpath,mPaint);
            //杀了这个,所以我们不重复抽奖
            circlePath.reset();
            mPath.reset();
        }

        @覆盖
        公共布尔的onTouchEvent(MotionEvent事件){
            浮X = event.getX();
            浮动Y = event.getY();

            开关(event.getAction()){
                案例MotionEvent.ACTION_DOWN:
                    touch_start(X,Y​​);
                    无效();
                    打破;
                案例MotionEvent.ACTION_MOVE:
                    TOUCH_MOVE(X,Y);
                    无效();
                    打破;
                案例MotionEvent.ACTION_UP:
                    润色();
                    无效();
                    打破;
            }
            返回true;
        }
    }

    私有静态最终诠释COLOR_MENU_ID = Menu.FIRST;
    私有静态最终诠释EMBOSS_MENU_ID = Menu.FIRST + 1;
    私有静态最终诠释BLUR_MENU_ID = Menu.FIRST + 2;
    私有静态最终诠释ERASE_MENU_ID = Menu.FIRST + 3;
    私有静态最终诠释SRCATOP_MENU_ID = Menu.FIRST + 4;

    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        super.onCreateOptionsMenu(菜单);

        menu.add(0,COLOR_MENU_ID,0,颜色)setShortcut('3','c')中。
        menu.add(0,EMBOSS_MENU_ID,0,浮雕)setShortcut('4','s'的)。
        menu.add(0,BLUR_MENU_ID,0,模糊)setShortcut('5','Z')。
        menu.add(0,ERASE_MENU_ID,0,擦除)setShortcut('5','Z')。
        menu.add(0,SRCATOP_MENU_ID,0,SrcATop)setShortcut('5','Z')。

        / ****这是该机制与滤镜效果延伸?
        意向意图=新的意图(空,getIntent()的getData());
        intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
        menu.addIntentOptions(
                              Menu.ALTERNATIVE,0,
                              新的组件名(本,NotesList.class)
                              空,意向,0,NULL);
        ***** /
        返回true;
    }

    @覆盖
    公共布尔prepareOptionsMenu(功能菜单)在{
        super.on prepareOptionsMenu(菜单);
        返回true;
    }

    @覆盖
    公共布尔onOptionsItemSelected(菜单项项){
        mPaint.setXfermode(空);
        mPaint.setAlpha(0xFF的);

        开关(item.getItemId()){
            案例COLOR_MENU_ID:
                //颜色选择器
                新ColorPickerDialog(这个,这​​个,mPaint.getColor())显示()。
                返回true;
            案例EMBOSS_MENU_ID:
                如果(mPaint.getMaskFilter()!= mEmboss){
                    mPaint.setMaskFilter(mEmboss);
                } 其他 {
                    mPaint.setMaskFilter(空);
                }
                返回true;
            案例BLUR_MENU_ID:
                如果(mPaint.getMaskFilter()!=运动模糊){
                    mPaint.setMaskFilter(运动模糊);
                } 其他 {
                    mPaint.setMaskFilter(空);
                }
                返回true;
            案例ERASE_MENU_ID:
                mPaint.setXfermode(新PorterDuffXfermode(
                                                        PorterDuff.Mode.CLEAR));
                返回true;
            案例SRCATOP_MENU_ID:
                mPaint.setXfermode(新PorterDuffXfermode(
                                                    PorterDuff.Mode.SRC_ATOP));
                mPaint.setAlpha(0x80的);
                返回true;
        }
        返回super.onOptionsItemSelected(项目);
    }
}
 

您使用相同的颜色选择器

 公共类ColorPickerDialog扩展对话框{

    公共接口OnColorChangedListener {
        无效colorChanged(INT颜色);
    }

    私人OnColorChangedListener mListener;
    私人诠释mInitialColor;

    私有静态类ColorPickerView扩展视图{
        私人油漆mPaint;
        私人油漆mCenterPaint;
        私人最终诠释[] mColors;
        私人OnColorChangedListener mListener;

        ColorPickerView(上下文C,OnColorChangedListener L,INT的颜色){
            超级(C);
            mListener =升;
            mColors =新INT [] {
                0xFFFF0000地址,0xFFFF00FF,0xFF0000FF,0xFF00FFFF,0xFF00FF00,
                0xFFFFFF00,0xFFFF0000地址
            };
            着色器S =新SweepGradient(0,0,mColors,NULL);

            mPaint =新的油漆(Paint.ANTI_ALIAS_FLAG);
            mPaint.setShader(多个);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(32);

            mCenterPaint =新的油漆(Paint.ANTI_ALIAS_FLAG);
            mCenterPaint.setColor(颜色);
            mCenterPaint.setStrokeWidth(5);
        }

        私人布尔mTrackingCenter;
        私人布尔mHighlightCenter;

        @覆盖
        保护无效的OnDraw(帆布油画){
            浮动R = CENTER_X  -  mPaint.getStrokeWidth()* 0.5F;

            canvas.translate(CENTER_X,CENTER_X);

            canvas.drawOval(新RectF(-r,-r,R,R),mPaint);
            canvas.drawCircle(0,0,CENTER_RADIUS,mCenterPaint);

            如果(mTrackingCenter){
                INT C = mCenterPaint.getColor();
                mCenterPaint.setStyle(Paint.Style.STROKE);

                如果(mHighlightCenter){
                    mCenterPaint.setAlpha(0xFF的);
                } 其他 {
                    mCenterPaint.setAlpha(0x80的);
                }
                canvas.drawCircle(0,0,
                                  CENTER_RADIUS + mCenterPaint.getStrokeWidth(),
                                  mCenterPaint);

                mCenterPaint.setStyle(Paint.Style.FILL);
                mCenterPaint.setColor(C);
            }
        }

        @覆盖
        保护无效onMeasure(INT widthMeasureSpec,诠释heightMeasureSpec){
            setMeasuredDimension(CENTER_X * 2,* CENTER_Y 2);
        }

        私有静态最终诠释CENTER_X = 100;
        私有静态最终诠释CENTER_Y = 100;
        私有静态最终诠释CENTER_RADIUS = 32;

        私人诠释floatToByte(浮点X){
            INT N = java.lang.Math.round(X);
            返回N;
        }
        私人诠释pinToByte(INT N){
            如果(正℃,){
                N = 0;
            }否则如果(N> 255){
                N = 255;
            }
            返回N;
        }

        私人诠释AVE(int类型,INT研发,浮动P){
            返回S + java.lang.Math.round(P *(D  -  S));
        }

        私人诠释interpColor(INT颜色[],浮点单元){
            如果(单元其中; = 0){
                返回颜色[0];
            }
            如果(部> = 1){
                返回颜色[colors.length  -  1];
            }

            浮动P =单位*(colors.length  -  1);
            INT I =(INT)P;
            对 -  =我;

            //现在p是刚刚小数部分[0 ... 1),i是索引
            INT C0 =颜色[I]
            INT C1 =颜色[I + 1];
            int的一个= AVE(Color.alpha(C0),Color.alpha(C1)中,p);
            INT R = AVE(Color.red(C0),Color.red(C1)中,p);
            INT克= AVE(Color.green(C0),Color.green(C1)中,p);
            INT B = AVE(Color.blue(C0),Color.blue(C1)中,p);

            返回Color.argb(A,R,G,B);
        }

        私人诠释rotateColor(INT色,浮RAD){
            浮度=弧度* 180 / 3.1415927f;
            INT R = Color.red(彩色);
            INT G = Color.green(彩色);
            INT B = Color.blue(彩色);

            嘉洛斯厘米=新嘉洛斯();
            嘉洛斯TMP =新嘉洛斯();

            cm.setRGB2YUV();
            tmp.setRotate(0,度);
            cm.postConcat(TMP);
            tmp.setYUV2RGB();
            cm.postConcat(TMP);

            最终浮动[] A = cm.getArray();

            INT IR = floatToByte(一个[0] * R + A [1] * G +一个[2] * b)条;
            INT IG = floatToByte(一个[5] * R + A [6] * G + A [7] * b)条;
            INT IB = floatToByte(一个[10] * R + A [11] * G + A [12] * b)条;

            返回Color.argb(Color.alpha(颜色),pinToByte(IR),
                              pinToByte(IG),pinToByte(IB));
        }

        私有静态最终浮动PI = 3.1415926f;

        @覆盖
        公共布尔的onTouchEvent(MotionEvent事件){
            浮X = event.getX() -  CENTER_X;
            浮动Y = event.getY() -  CENTER_Y;
            布尔内心= java.lang.Math.sqrt(X * X + Y * Y)< = CENTER_RADIUS;

            开关(event.getAction()){
                案例MotionEvent.ACTION_DOWN:
                    mTrackingCenter =内心;
                    如果(内心){
                        mHighlightCenter =真;
                        无效();
                        打破;
                    }
                案例MotionEvent.ACTION_MOVE:
                    如果(mTrackingCenter){
                        如果(mHighlightCenter!=内心){
                            mHighlightCenter =内心;
                            无效();
                        }
                    } 其他 {
                        浮动角=(浮点)java.lang.Math.atan2(Y,X);
                        //需要打开的角度[-PI ... PI]为单位[0 .... 1]
                        浮单位=角/(2 * PI);
                        如果(单位℃,){
                            单元+ = 1;
                        }
                        mCenterPaint.setColor(interpColor(mColors,股吧));
                        无效();
                    }
                    打破;
                案例MotionEvent.ACTION_UP:
                    如果(mTrackingCenter){
                        如果(内心){
                            mListener.colorChanged(mCenterPaint.getColor());
                        }
                        mTrackingCenter = FALSE; //所以我们得出的w / o晕
                        无效();
                    }
                    打破;
            }
            返回true;
        }
    }

    公共ColorPickerDialog(上下文的背景下,
                             OnColorChangedListener监听器,
                             INT initialColor){
        超(上下文);

        mListener =侦听器;
        mInitialColor = initialColor;
    }

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        OnColorChangedListener L =新OnColorChangedListener(){
            公共无效colorChanged(INT颜色){
                mListener.colorChanged(颜色);
                解雇();
            }
        };

        的setContentView(新ColorPickerView(的getContext(),升,mInitialColor));
        的setTitle(选择颜色);
    }
}
 

快拍。使用菜单键选择选项。这是相同的,与一些小的修改,在样品中的fingerpaint API

编辑:

您可以允许用户使用数字选择器更改笔的厚度

<一个href="http://stackoverflow.com/questions/17944061/how-to-use-number-picker-with-dialog/17944205#17944205">how使用数字选择器与对话

I have made a simple drawing android program for learning ,I have put a colorDialog which is displayed properly bu after selecting any color ,The pen color is not changing ,It still remains "black" the default color.I have tried as below,Please help me for it,My code is as below:

Main.java

   package com.example.singletouch;

import java.util.AbstractMap;
import java.util.Map;
import java.util.concurrent.ConcurrentLinkedQueue;

import com.example.singletouch.SingleTouchView.DrawingPens;

import android.os.Bundle;
import android.app.ActionBar.LayoutParams;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MainActivity extends Activity implements
        ColorPickerDialog.OnColorChangedListener {
    ImageView pen, color;
    SingleTouchView mDrawView;
    RelativeLayout layout, layout1;
    ImageView remove;
    ImageView eraser;
    Paint mPaint;
    private LinearLayout list_color;
    LinearLayout pens;

    private TextView select_color;
    private int selectedColor = 0x00FF0000;
    HorizontalScrollView myplate;




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

        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);
        eraser = (ImageView) findViewById(R.id.eraser);
        remove = (ImageView) findViewById(R.id.remove);
        color = (ImageView) findViewById(R.id.color);


        pen.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                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) {


            }
        });

        color.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // myplate.setVisibility(View.VISIBLE);
                new ColorPickerDialog(MainActivity.this, MainActivity.this,
                mPaint.getColor()).show();

            }
        });

    }

    @Override
    public void colorChanged(int color) {
        // TODO Auto-generated method stub
        mPaint.getColor();
    }



}
 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 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 Path mCurrentPath;

    private void init(final Context context) {

        setPen(DrawingPens.PEN_3);

    }

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

ColorPickerDialog.java

public class ColorPickerDialog extends Dialog{
    public interface OnColorChangedListener {
        void colorChanged(int color);
    }

    private OnColorChangedListener mListener;
    private int mInitialColor;

    private static class ColorPickerView extends View {
        private Paint mPaint;
        private Paint mCenterPaint;
        private final int[] mColors;
        private OnColorChangedListener mListener;

        ColorPickerView(Context c, OnColorChangedListener l, int color) {
            super(c);
            mListener = l;
            mColors = new int[] {
                0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00,
                0xFFFFFF00, 0xFFFF0000
            };
            Shader s = new SweepGradient(0, 0, mColors, null);

            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setShader(s);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(32);

            mCenterPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mCenterPaint.setColor(color);
            mCenterPaint.setStrokeWidth(5);
        }

        private boolean mTrackingCenter;
        private boolean mHighlightCenter;

        protected void onDraw(Canvas canvas) {
            float r = CENTER_X - mPaint.getStrokeWidth()*0.5f;

            canvas.translate(CENTER_X, CENTER_X);

            canvas.drawOval(new RectF(-r, -r, r, r), mPaint);
            canvas.drawCircle(0, 0, CENTER_RADIUS, mCenterPaint);

            if (mTrackingCenter) {
                int c = mCenterPaint.getColor();
                mCenterPaint.setStyle(Paint.Style.STROKE);

                if (mHighlightCenter) {
                    mCenterPaint.setAlpha(0xFF);
                } else {
                    mCenterPaint.setAlpha(0x80);
                }
                canvas.drawCircle(0, 0,
                                  CENTER_RADIUS + mCenterPaint.getStrokeWidth(),
                                  mCenterPaint);

                mCenterPaint.setStyle(Paint.Style.FILL);
                mCenterPaint.setColor(c);
            }
        }

        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            setMeasuredDimension(CENTER_X*2, CENTER_Y*2);
        }

        private static final int CENTER_X = 100;
        private static final int CENTER_Y = 100;
        private static final int CENTER_RADIUS = 32;

        private int floatToByte(float x) {
            int n = java.lang.Math.round(x);
            return n;
        }
        private int pinToByte(int n) {
            if (n < 0) {
                n = 0;
            } else if (n > 255) {
                n = 255;
            }
            return n;
        }

        private int ave(int s, int d, float p) {
            return s + java.lang.Math.round(p * (d - s));
        }

        private int interpColor(int colors[], float unit) {
            if (unit <= 0) {
                return colors[0];
            }
            if (unit >= 1) {
                return colors[colors.length - 1];
            }

            float p = unit * (colors.length - 1);
            int i = (int)p;
            p -= i;

            // now p is just the fractional part [0...1) and i is the index
            int c0 = colors[i];
            int c1 = colors[i+1];
            int a = ave(Color.alpha(c0), Color.alpha(c1), p);
            int r = ave(Color.red(c0), Color.red(c1), p);
            int g = ave(Color.green(c0), Color.green(c1), p);
            int b = ave(Color.blue(c0), Color.blue(c1), p);

            return Color.argb(a, r, g, b);
        }

        private int rotateColor(int color, float rad) {
            float deg = rad * 180 / 3.1415927f;
            int r = Color.red(color);
            int g = Color.green(color);
            int b = Color.blue(color);

            ColorMatrix cm = new ColorMatrix();
            ColorMatrix tmp = new ColorMatrix();

            cm.setRGB2YUV();
            tmp.setRotate(0, deg);
            cm.postConcat(tmp);
            tmp.setYUV2RGB();
            cm.postConcat(tmp);

            final float[] a = cm.getArray();

            int ir = floatToByte(a[0] * r +  a[1] * g +  a[2] * b);
            int ig = floatToByte(a[5] * r +  a[6] * g +  a[7] * b);
            int ib = floatToByte(a[10] * r + a[11] * g + a[12] * b);

            return Color.argb(Color.alpha(color), pinToByte(ir),
                              pinToByte(ig), pinToByte(ib));
        }

        private static final float PI = 3.1415926f;

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float x = event.getX() - CENTER_X;
            float y = event.getY() - CENTER_Y;
            boolean inCenter = java.lang.Math.sqrt(x*x + y*y) <= CENTER_RADIUS;

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mTrackingCenter = inCenter;
                    if (inCenter) {
                        mHighlightCenter = true;
                        invalidate();
                        break;
                    }
                case MotionEvent.ACTION_MOVE:
                    if (mTrackingCenter) {
                        if (mHighlightCenter != inCenter) {
                            mHighlightCenter = inCenter;
                            invalidate();
                        }
                    } else {
                        float angle = (float)java.lang.Math.atan2(y, x);
                        // need to turn angle [-PI ... PI] into unit [0....1]
                        float unit = angle/(2*PI);
                        if (unit < 0) {
                            unit += 1;
                        }
                        mCenterPaint.setColor(interpColor(mColors, unit));
                        invalidate();
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    if (mTrackingCenter) {
                        if (inCenter) {
                            mListener.colorChanged(mCenterPaint.getColor());
                        }
                        mTrackingCenter = false;    // so we draw w/o halo
                        invalidate();
                    }
                    break;
            }
            return true;
        }
    }

    public ColorPickerDialog(Context context,
                             OnColorChangedListener listener,
                             int initialColor) {
        super(context);

        mListener = listener;
        mInitialColor = initialColor;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        OnColorChangedListener l = new OnColorChangedListener() {
            public void colorChanged(int color) {
                mListener.colorChanged(color);
                dismiss();
            }
        };

        setContentView(new ColorPickerView(getContext(), l, mInitialColor));
        setTitle("Pick a Color");
    }
}

Crash log:

08-06 15:44:00.427: E/AndroidRuntime(3617): java.lang.NullPointerException
    08-06 15:44:00.427: E/AndroidRuntime(3617):     at com.example.singletouch.MainActivity$8.onClick(MainActivity.java:134)
    08-06 15:44:00.427: E/AndroidRuntime(3617):     at android.view.View.performClick(View.java:3511)
    08-06 15:44:00.427: E/AndroidRuntime(3617):     at android.view.View$PerformClick.run(View.java:14109)
    08-06 15:44:00.427: E/AndroidRuntime(3617):     at android.os.Handler.handleCallback(Handler.java:605)
    08-06 15:44:00.427: E/AndroidRuntime(3617):     at android.os.Handler.dispatchMessage(Handler.java:92)
    08-06 15:44:00.427: E/AndroidRuntime(3617):     at android.os.Looper.loop(Looper.java:137)
    08-06 15:44:00.427: E/AndroidRuntime(3617):     at android.app.ActivityThread.main(ActivityThread.java:4424)
    08-06 15:44:00.427: E/AndroidRuntime(3617):     at java.lang.reflect.Method.invokeNative(Native Method)
    08-06 15:44:00.427: E/AndroidRuntime(3617):     at java.lang.reflect.Method.invoke(Method.java:511)
    08-06 15:44:00.427: E/AndroidRuntime(3617):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    08-06 15:44:00.427: E/AndroidRuntime(3617):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    08-06 15:44:00.427: E/AndroidRuntime(3617):     at dalvik.system.NativeStart.main(Native Method)

解决方案

Use the below as a reference. Modify according to your needs. i have used the same color picker that your used.

As you notice the drawing view is a inner class of your activity class and i used a single Paint object so the change in color reflects in the draw.

MainActivity.java

public class MainActivity extends Activity
        implements ColorPickerDialog.OnColorChangedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyView(this));

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

        mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 },
                                       0.4f, 6, 3.5f);

        mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);
    }

    private Paint       mPaint;
    private MaskFilter  mEmboss;
    private MaskFilter  mBlur;

    public void colorChanged(int color) {
        mPaint.setColor(color);
    }

    public class MyView extends View {

        private static final float MINP = 0.25f;
        private static final float MAXP = 0.75f;

        private Bitmap  mBitmap;
        private Canvas  mCanvas;
        private Path    mPath,circlePath;
        private Paint   mBitmapPaint,circlePaint;

        public MyView(Context c) {
            super(c);
            circlePaint = new Paint();
            circlePath = new Path();
            circlePaint.setAntiAlias(true);
            circlePaint.setColor(Color.BLUE);
            circlePaint.setStyle(Paint.Style.STROKE);
            circlePaint.setStrokeJoin(Paint.Join.MITER);
            circlePaint.setStrokeWidth(4f); 

            mPath = new Path();
            mBitmapPaint = new Paint(Paint.DITHER_FLAG);
        }

        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            mCanvas = new Canvas(mBitmap);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawColor(0xFFAAAAAA);

            canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

            canvas.drawPath(mPath, mPaint);
            canvas.drawPath(circlePath, circlePaint);
        }

        private float mX, mY;
        private static final float TOUCH_TOLERANCE = 4;

        private void touch_start(float x, float y) {
            mPath.reset();
            mPath.moveTo(x, y);
            mX = x;
            mY = y;
        }
        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;
            }
            circlePath.reset();
            circlePath.addCircle(mX, mY, 30, Path.Direction.CW);
        }
        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
            circlePath.reset();
            mPath.reset();
        }

        @Override
        public boolean onTouchEvent(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;
        }
    }

    private static final int COLOR_MENU_ID = Menu.FIRST;
    private static final int EMBOSS_MENU_ID = Menu.FIRST + 1;
    private static final int BLUR_MENU_ID = Menu.FIRST + 2;
    private static final int ERASE_MENU_ID = Menu.FIRST + 3;
    private static final int SRCATOP_MENU_ID = Menu.FIRST + 4;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        menu.add(0, COLOR_MENU_ID, 0, "Color").setShortcut('3', 'c');
        menu.add(0, EMBOSS_MENU_ID, 0, "Emboss").setShortcut('4', 's');
        menu.add(0, BLUR_MENU_ID, 0, "Blur").setShortcut('5', 'z');
        menu.add(0, ERASE_MENU_ID, 0, "Erase").setShortcut('5', 'z');
        menu.add(0, SRCATOP_MENU_ID, 0, "SrcATop").setShortcut('5', 'z');

        /****   Is this the mechanism to extend with filter effects?
        Intent intent = new Intent(null, getIntent().getData());
        intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
        menu.addIntentOptions(
                              Menu.ALTERNATIVE, 0,
                              new ComponentName(this, NotesList.class),
                              null, intent, 0, null);
        *****/
        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        mPaint.setXfermode(null);
        mPaint.setAlpha(0xFF);

        switch (item.getItemId()) {
            case COLOR_MENU_ID:
                // color picker
                new ColorPickerDialog(this, this, mPaint.getColor()).show();
                return true;
            case EMBOSS_MENU_ID:
                if (mPaint.getMaskFilter() != mEmboss) {
                    mPaint.setMaskFilter(mEmboss);
                } else {
                    mPaint.setMaskFilter(null);
                }
                return true;
            case BLUR_MENU_ID:
                if (mPaint.getMaskFilter() != mBlur) {
                    mPaint.setMaskFilter(mBlur);
                } else {
                    mPaint.setMaskFilter(null);
                }
                return true;
            case ERASE_MENU_ID:
                mPaint.setXfermode(new PorterDuffXfermode(
                                                        PorterDuff.Mode.CLEAR));
                return true;
            case SRCATOP_MENU_ID:
                mPaint.setXfermode(new PorterDuffXfermode(
                                                    PorterDuff.Mode.SRC_ATOP));
                mPaint.setAlpha(0x80);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

Same color picker you used

public class ColorPickerDialog extends Dialog {

    public interface OnColorChangedListener {
        void colorChanged(int color);
    }

    private OnColorChangedListener mListener;
    private int mInitialColor;

    private static class ColorPickerView extends View {
        private Paint mPaint;
        private Paint mCenterPaint;
        private final int[] mColors;
        private OnColorChangedListener mListener;

        ColorPickerView(Context c, OnColorChangedListener l, int color) {
            super(c);
            mListener = l;
            mColors = new int[] {
                0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00,
                0xFFFFFF00, 0xFFFF0000
            };
            Shader s = new SweepGradient(0, 0, mColors, null);

            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setShader(s);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(32);

            mCenterPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mCenterPaint.setColor(color);
            mCenterPaint.setStrokeWidth(5);
        }

        private boolean mTrackingCenter;
        private boolean mHighlightCenter;

        @Override
        protected void onDraw(Canvas canvas) {
            float r = CENTER_X - mPaint.getStrokeWidth()*0.5f;

            canvas.translate(CENTER_X, CENTER_X);

            canvas.drawOval(new RectF(-r, -r, r, r), mPaint);
            canvas.drawCircle(0, 0, CENTER_RADIUS, mCenterPaint);

            if (mTrackingCenter) {
                int c = mCenterPaint.getColor();
                mCenterPaint.setStyle(Paint.Style.STROKE);

                if (mHighlightCenter) {
                    mCenterPaint.setAlpha(0xFF);
                } else {
                    mCenterPaint.setAlpha(0x80);
                }
                canvas.drawCircle(0, 0,
                                  CENTER_RADIUS + mCenterPaint.getStrokeWidth(),
                                  mCenterPaint);

                mCenterPaint.setStyle(Paint.Style.FILL);
                mCenterPaint.setColor(c);
            }
        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            setMeasuredDimension(CENTER_X*2, CENTER_Y*2);
        }

        private static final int CENTER_X = 100;
        private static final int CENTER_Y = 100;
        private static final int CENTER_RADIUS = 32;

        private int floatToByte(float x) {
            int n = java.lang.Math.round(x);
            return n;
        }
        private int pinToByte(int n) {
            if (n < 0) {
                n = 0;
            } else if (n > 255) {
                n = 255;
            }
            return n;
        }

        private int ave(int s, int d, float p) {
            return s + java.lang.Math.round(p * (d - s));
        }

        private int interpColor(int colors[], float unit) {
            if (unit <= 0) {
                return colors[0];
            }
            if (unit >= 1) {
                return colors[colors.length - 1];
            }

            float p = unit * (colors.length - 1);
            int i = (int)p;
            p -= i;

            // now p is just the fractional part [0...1) and i is the index
            int c0 = colors[i];
            int c1 = colors[i+1];
            int a = ave(Color.alpha(c0), Color.alpha(c1), p);
            int r = ave(Color.red(c0), Color.red(c1), p);
            int g = ave(Color.green(c0), Color.green(c1), p);
            int b = ave(Color.blue(c0), Color.blue(c1), p);

            return Color.argb(a, r, g, b);
        }

        private int rotateColor(int color, float rad) {
            float deg = rad * 180 / 3.1415927f;
            int r = Color.red(color);
            int g = Color.green(color);
            int b = Color.blue(color);

            ColorMatrix cm = new ColorMatrix();
            ColorMatrix tmp = new ColorMatrix();

            cm.setRGB2YUV();
            tmp.setRotate(0, deg);
            cm.postConcat(tmp);
            tmp.setYUV2RGB();
            cm.postConcat(tmp);

            final float[] a = cm.getArray();

            int ir = floatToByte(a[0] * r +  a[1] * g +  a[2] * b);
            int ig = floatToByte(a[5] * r +  a[6] * g +  a[7] * b);
            int ib = floatToByte(a[10] * r + a[11] * g + a[12] * b);

            return Color.argb(Color.alpha(color), pinToByte(ir),
                              pinToByte(ig), pinToByte(ib));
        }

        private static final float PI = 3.1415926f;

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float x = event.getX() - CENTER_X;
            float y = event.getY() - CENTER_Y;
            boolean inCenter = java.lang.Math.sqrt(x*x + y*y) <= CENTER_RADIUS;

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mTrackingCenter = inCenter;
                    if (inCenter) {
                        mHighlightCenter = true;
                        invalidate();
                        break;
                    }
                case MotionEvent.ACTION_MOVE:
                    if (mTrackingCenter) {
                        if (mHighlightCenter != inCenter) {
                            mHighlightCenter = inCenter;
                            invalidate();
                        }
                    } else {
                        float angle = (float)java.lang.Math.atan2(y, x);
                        // need to turn angle [-PI ... PI] into unit [0....1]
                        float unit = angle/(2*PI);
                        if (unit < 0) {
                            unit += 1;
                        }
                        mCenterPaint.setColor(interpColor(mColors, unit));
                        invalidate();
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    if (mTrackingCenter) {
                        if (inCenter) {
                            mListener.colorChanged(mCenterPaint.getColor());
                        }
                        mTrackingCenter = false;    // so we draw w/o halo
                        invalidate();
                    }
                    break;
            }
            return true;
        }
    }

    public ColorPickerDialog(Context context,
                             OnColorChangedListener listener,
                             int initialColor) {
        super(context);

        mListener = listener;
        mInitialColor = initialColor;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        OnColorChangedListener l = new OnColorChangedListener() {
            public void colorChanged(int color) {
                mListener.colorChanged(color);
                dismiss();
            }
        };

        setContentView(new ColorPickerView(getContext(), l, mInitialColor));
        setTitle("Pick a Color");
    }
}

Snap Shot. Use the menu button to choose options. This is the same as the fingerpaint api in the samples with few minor modifications.

Edit:

You can allow users to change pen thickness using a number picker

how to use number picker with dialog

这篇关于颜色拾取android系统中不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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