Mega Code Archive

 
Categories / Android / UI
 

Color Select Dialog

//package com.hyperzsoft.utils; import android.app.Dialog; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; public class ColorSelectDialog extends Dialog {   public interface OnColorChangedListener {     void colorChanged(String key, int color);   }   private OnColorChangedListener mListener;   private int mInitialColor;   private String mKey;      public static class ColorPickerView extends View {     private Paint mPaint;     private float mCurrentHue = 0;     private final int[] mHueBarColors = new int[258];     private OnColorChangedListener mListener;          public void setColor(int color) {     }          public int getColor() {       return getCurrentMainColor();     }     ColorPickerView(Context c, OnColorChangedListener l, int color) {       super(c);       mListener = l;       // Get the current hue from the current color and update the main color field       float[] hsv = new float[3];       Color.colorToHSV(color, hsv);       mCurrentHue = hsv[0];       // Initialize the colors of the hue slider bar       int index = 0;       for (float i=0; i<256; i += 256/42) // Red (#f00) to pink (#f0f)       {         mHueBarColors[index] = Color.rgb(255, 0, (int) i);         index++;       }       for (float i=0; i<256; i += 256/42) // Pink (#f0f) to blue (#00f)       {         mHueBarColors[index] = Color.rgb(255-(int) i, 0, 255);         index++;       }       for (float i=0; i<256; i += 256/42) // Blue (#00f) to light blue (#0ff)       {         mHueBarColors[index] = Color.rgb(0, (int) i, 255);         index++;       }       for (float i=0; i<256; i += 256/42) // Light blue (#0ff) to green (#0f0)       {         mHueBarColors[index] = Color.rgb(0, 255, 255-(int) i);         index++;       }       for (float i=0; i<256; i += 256/42) // Green (#0f0) to yellow (#ff0)       {         mHueBarColors[index] = Color.rgb((int) i, 255, 0);         index++;       }       for (float i=0; i<256; i += 256/42) // Yellow (#ff0) to red (#f00)       {         mHueBarColors[index] = Color.rgb(255, 255-(int) i, 0);         index++;       }       // Initializes the Paint that will draw the View       mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);       mPaint.setTextAlign(Paint.Align.CENTER);       mPaint.setTextSize(12);     }     // Get the current selected color from the hue bar     private int getCurrentMainColor()     {       int translatedHue = 255-(int)(mCurrentHue*255/360);       int index = 0;       for (float i=0; i<256; i += 256/42)       {         if (index == translatedHue)           return Color.rgb(255, 0, (int) i);         index++;       }       for (float i=0; i<256; i += 256/42)       {         if (index == translatedHue)           return Color.rgb(255-(int) i, 0, 255);         index++;       }       for (float i=0; i<256; i += 256/42)       {         if (index == translatedHue)           return Color.rgb(0, (int) i, 255);         index++;       }       for (float i=0; i<256; i += 256/42)       {         if (index == translatedHue)           return Color.rgb(0, 255, 255-(int) i);         index++;       }       for (float i=0; i<256; i += 256/42)       {         if (index == translatedHue)           return Color.rgb((int) i, 255, 0);         index++;       }       for (float i=0; i<256; i += 256/42)       {         if (index == translatedHue)           return Color.rgb(255, 255-(int) i, 0);         index++;       }       return Color.RED;     }     @Override     protected void onDraw(Canvas canvas) {       int translatedHue = 255-(int)(mCurrentHue*255/360);       // Display all the colors of the hue bar with lines       for (int x=0; x<256; x++)       {         // If this is not the current selected hue, display the actual color         if (translatedHue != x)         {           mPaint.setColor(mHueBarColors[x]);           mPaint.setStrokeWidth(2);         }         else // else display a slightly larger black line         {           mPaint.setColor(Color.BLACK);           mPaint.setStrokeWidth(3);         }         canvas.drawLine((x*2)+10, 0, (x*2)+10, 40, mPaint);       }     }     @Override     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {       //setMeasuredDimension(276, 60);       setMeasuredDimension(532, 60);     }     @Override     public boolean onTouchEvent(MotionEvent event) {       if (event.getAction() != MotionEvent.ACTION_DOWN) return true;       float x = event.getX();       float y = event.getY();       //the touch event is located in the hue bar       if (x > 10 && x < 522 && y > 0 && y < 40)       {         // Update the main field colors         mCurrentHue = (255-(x/2))*360/255;         mListener.colorChanged("", getCurrentMainColor());         // Force the redraw of the dialog         invalidate();       }       return true;     }   }      public ColorSelectDialog(Context context, OnColorChangedListener listener, String key, int initialColor) {     super(context);     mListener = listener;     mKey = key;     mInitialColor = initialColor;   }   @Override   protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     OnColorChangedListener l = new OnColorChangedListener() {       public void colorChanged(String key, int color) {         mListener.colorChanged(mKey, color);         dismiss();       }     };     setContentView(new ColorPickerView(getContext(), l, mInitialColor));     setTitle("Select Color");   } }