4

Can someone provide me some code of a color picker and it's usage in android?

I found some example here Android Color Picker, but I don't know how to use it :(

Please help me, thanks

Community
  • 1
  • 1
Tünde
  • 885
  • 4
  • 11
  • 24

2 Answers2

20

Color Picker dialog.

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

Usage

new ColorPickerDialog(FingerPaintActivity.this, FingerPaintActivity.this, mPaint.getColor()).show();

FingerPaintActivity.this - is the activity context   mPaint is the paint object. 

Whatever color the user chooses the object will have that color. If user chooses red mPaint will have red color which can be used to draw.

To show a colorpicker

Say on button click you want to display the colorpicker dialog

Button b= (Button) findViewById(R.id.button1);
b.setOnClickListener(new OnClickListener()
{
    public void OnClick(View v)
    {
        new ColorPickerDialog(FingerPaintActivity.this, FingerPaintActivity.this, mPaint.getColor()).show();
    }  
}); 
Rich
  • 1,015
  • 1
  • 10
  • 22
Raghunandan
  • 132,755
  • 26
  • 225
  • 256
  • How do I use the same method for a custom color picker? – Si8 Feb 05 '14 at 03:09
  • @SiKni8 do you have a custom color picker designed? – Raghunandan Feb 05 '14 at 03:28
  • I have a layout with a palette background and a small thumb which the user can drag and it is supposed to give the RGB value but it'd not working... My question is here http://stackoverflow.com/questions/21567226/how-to-use-a-layouts-background-as-a-bitmap-to-convert-x-and-y-to-rgb-values. – Si8 Feb 05 '14 at 03:40
  • What I am looking to do is use the background as an image bitmap and when the user drags by touch the thumb moves and if the user drags outside the layout... The thumb X and Y is the last position before leaving the layout. – Si8 Feb 05 '14 at 03:42
  • http://stackoverflow.com/questions/21567226/how-to-use-a-layouts-background-as-a-bitmap-to-convert-x-and-y-to-rgb-values no one has been able to help me :/ – Si8 Feb 05 '14 at 03:43
  • @SiKni8 http://stackoverflow.com/questions/16363235/android-color-picker-to-be-included-in-the-activity. similar color picker – Raghunandan Feb 05 '14 at 03:45
  • How hard would it be to modify mine to work? I am trying this way due to space on screen – Si8 Feb 05 '14 at 03:48
  • I was able to get the drawable to bitmap. Can you help with the X and Y? http://stackoverflow.com/questions/21593543/how-to-keep-an-image-within-layouts-view-while-dragging – Si8 Feb 06 '14 at 03:51
  • Thanks for grate solution, i am using it. But if i have a color code and i want to calculate x and y position of that color in Oval. Actually have to show point on last selected color.Thanks in advance. – Hradesh Kumar Oct 19 '16 at 11:56
  • In my case the title is not visible. Can you help me? my question here: https://stackoverflow.com/questions/57993083/title-colorpickerdialog-not-showing – Baby Sep 18 '19 at 13:32
  • is it available square color picker? – user3315464 May 25 '20 at 23:14
0

I found this one: https://www.buzzingandroid.com/2012/11/hsv-color-picker-dialog

Since FloatMath been depreciated I made the following changes:

import java.lang.Math;
 //import android.util.FloatMath;

selectedPoint.x = rect.left + (int) ((float)-Math.cos( hueInPiInterval ) * colorHsv[1] * innerCircleRadius + fullCircleRadius);
selectedPoint.y = rect.top + (int) ((float)-Math.sin( hueInPiInterval ) * colorHsv[1] * innerCircleRadius + fullCircleRadius);
//selectedPoint.x = rect.left + (int) (-FloatMath.cos( hueInPiInterval ) * colorHsv[1] * innerCircleRadius + fullCircleRadius);
//selectedPoint.y = rect.top + (int) (-FloatMath.sin( hueInPiInterval ) * colorHsv[1] * innerCircleRadius + fullCircleRadius);

` It is the best color picker I've ever seen! Very easy to use and well described. Hope it may work for you as ell.

Tomas F.
  • 318
  • 3
  • 14