Selector de color de Android
Estoy buscando un marco Color Picker que puede devolver color HEX en la selección.
He mirado esto preguntándose si hay alguna otra biblioteca que pueda usar.
- Android: Obtener accesos directos instalados
- El botón de imagen de 9 parches de Android no está escalado según lo previsto
- Selector de fecha de Android: deshabilitar fechas de vacaciones y fin de semana
- Simple Selector de directorio Android - ¿Cómo?
- Aplicar el selector android para un niño específico de listview y desactivar el selector en los otros niños en el mismo elemento de lista
- Android GridView Elemento seleccionado Fondo
- Desactivar el color de resaltado de fondo del elemento de menú en android
- Android: ¿Cómo lograr el efecto de resplandor cuando presiona un elemento de lista con mucho tiempo?
- Usando estados personalizados, onCreateDrawableState nunca se llama
- Elemento de ListView Estado de LongClick para el selector
- Android: textColor del botón deshabilitado en el selector no se muestra?
- Android: textColor del botón deshabilitado en el selector no se muestra?
- ¿Cómo cambio el tinte de un ImageButton en el enfoque / presione
Prueba estos proyectos de código abierto que podrían ayudarte
Sé que la pregunta es vieja, pero si alguien está buscando un gran recolector de color androide nuevo que el uso de diseño de material he bifurcado un gran proyecto de github y hecho un sencillo de usar el diálogo selector de color android.
Este es el proyecto: Selector de color de Android
Diálogo del selector de color de Android
CÓMO USARLO
Agregar la biblioteca a su proyecto
El artefacto aar está disponible en el repositorio jcenter . Declare el repositorio y la dependencia en su build.gradle
.
(raíz)
repositories { jcenter() }
(módulo)
dependencies { compile 'com.pes.materialcolorpicker:library:1.0.2' }
Usar la biblioteca
Crear un objeto de diálogo selector de color
final ColorPicker cp = new ColorPicker(MainActivity.this, defaultColorR, defaultColorG, defaultColorB);
DefaultColorR, defaultColorG, defaultColorB son 3 entero (valor 0-255) para la inicialización del selector de color con su valor de color personalizado. Si no quieres empezar con un color, ponlos a 0 o usa solo el primer argumento
A continuación, muestre el cuadro de diálogo (cuando y donde desee) y guarde el color seleccionado
/* Show color picker dialog */ cp.show(); /* On Click listener for the dialog, when the user select the color */ Button okColor = (Button)cp.findViewById(R.id.okColorButton); okColor.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /* You can get single channel (value 0-255) */ selectedColorR = cp.getRed(); selectedColorG = cp.getGreen(); selectedColorB = cp.getBlue(); /* Or the android RGB Color (see the android Color class reference) */ selectedColorRGB = cp.getColor(); cp.dismiss(); } });
Eso es todo 🙂
Puede usar el siguiente código, que le dará la misma apariencia que http://code.google.com/p/color-picker-view/
public class ColorPickerDialog extends Dialog { public interface OnColorChangedListener { void colorChanged(String key, int color); } private OnColorChangedListener mListener; private int mInitialColor, mDefaultColor; private String mKey; private static class ColorPickerView extends View { private Paint mPaint; private float mCurrentHue = 0; private int mCurrentX = 0, mCurrentY = 0; private int mCurrentColor, mDefaultColor; private final int[] mHueBarColors = new int[258]; private int[] mMainColors = new int[65536]; private OnColorChangedListener mListener; ColorPickerView(Context c, OnColorChangedListener l, int color, int defaultColor) { super(c); mListener = l; mDefaultColor = defaultColor; // 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]; updateMainColors(); mCurrentColor = color; // 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; } // Update the main field colors depending on the current selected hue private void updateMainColors() { int mainColor = getCurrentMainColor(); int index = 0; int[] topColors = new int[256]; for (int y = 0; y < 256; y++) { for (int x = 0; x < 256; x++) { if (y == 0) { mMainColors[index] = Color.rgb( 255 - (255 - Color.red(mainColor)) * x / 255, 255 - (255 - Color.green(mainColor)) * x / 255, 255 - (255 - Color.blue(mainColor)) * x / 255); topColors[x] = mMainColors[index]; } else mMainColors[index] = Color.rgb( (255 - y) * Color.red(topColors[x]) / 255, (255 - y) * Color.green(topColors[x]) / 255, (255 - y) * Color.blue(topColors[x]) / 255); index++; } } } @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(1); } else // else display a slightly larger black line { mPaint.setColor(Color.BLACK); mPaint.setStrokeWidth(3); } canvas.drawLine(x + 10, 0, x + 10, 40, mPaint); // canvas.drawLine(0, x+10, 40, x+10, mPaint); } // Display the main field colors using LinearGradient for (int x = 0; x < 256; x++) { int[] colors = new int[2]; colors[0] = mMainColors[x]; colors[1] = Color.BLACK; Shader shader = new LinearGradient(0, 50, 0, 306, colors, null, Shader.TileMode.REPEAT); mPaint.setShader(shader); canvas.drawLine(x + 10, 50, x + 10, 306, mPaint); } mPaint.setShader(null); // Display the circle around the currently selected color in the // main field if (mCurrentX != 0 && mCurrentY != 0) { mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(Color.BLACK); canvas.drawCircle(mCurrentX, mCurrentY, 10, mPaint); } // Draw a 'button' with the currently selected color mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(mCurrentColor); canvas.drawRect(10, 316, 138, 356, mPaint); // Set the text color according to the brightness of the color if (Color.red(mCurrentColor) + Color.green(mCurrentColor) + Color.blue(mCurrentColor) < 384) mPaint.setColor(Color.WHITE); else mPaint.setColor(Color.BLACK); canvas.drawText( getResources() .getString(R.string.settings_bg_color_confirm), 74, 340, mPaint); // Draw a 'button' with the default color mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(mDefaultColor); canvas.drawRect(138, 316, 266, 356, mPaint); // Set the text color according to the brightness of the color if (Color.red(mDefaultColor) + Color.green(mDefaultColor) + Color.blue(mDefaultColor) < 384) mPaint.setColor(Color.WHITE); else mPaint.setColor(Color.BLACK); canvas.drawText( getResources().getString( R.string.settings_default_color_confirm), 202, 340, mPaint); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(276, 366); } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() != MotionEvent.ACTION_DOWN) return true; float x = event.getX(); float y = event.getY(); // If the touch event is located in the hue bar if (x > 10 && x < 266 && y > 0 && y < 40) { // Update the main field colors mCurrentHue = (255 - x) * 360 / 255; updateMainColors(); // Update the current selected color int transX = mCurrentX - 10; int transY = mCurrentY - 60; int index = 256 * (transY - 1) + transX; if (index > 0 && index < mMainColors.length) mCurrentColor = mMainColors[256 * (transY - 1) + transX]; // Force the redraw of the dialog invalidate(); } // If the touch event is located in the main field if (x > 10 && x < 266 && y > 50 && y < 306) { mCurrentX = (int) x; mCurrentY = (int) y; int transX = mCurrentX - 10; int transY = mCurrentY - 60; int index = 256 * (transY - 1) + transX; if (index > 0 && index < mMainColors.length) { // Update the current color mCurrentColor = mMainColors[index]; // Force the redraw of the dialog invalidate(); } } // If the touch event is located in the left button, notify the // listener with the current color if (x > 10 && x < 138 && y > 316 && y < 356) mListener.colorChanged("", mCurrentColor); // If the touch event is located in the right button, notify the // listener with the default color if (x > 138 && x < 266 && y > 316 && y < 356) mListener.colorChanged("", mDefaultColor); return true; } } public ColorPickerDialog(Context context, OnColorChangedListener listener, String key, int initialColor, int defaultColor) { super(context); mListener = listener; mKey = key; mInitialColor = initialColor; mDefaultColor = defaultColor; } @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, mDefaultColor)); setTitle(R.string.settings_bg_color_dialog); } }
Acabé aquí buscando un selector de color HSV que ofrece transparencia y copiar / pegar el valor hexadecimal. Ninguna de las respuestas existentes satisfizo esas necesidades, así que aquí está la biblioteca que terminé escribiendo:
Selector de color HSV-Alpha para Android (GitHub).
Demostración del selector de color HSV-Alpha (Google Play).
Espero que sea útil para alguien más.
Acabamos de subir el selector de color AmbilWarna a Maven:
https://github.com/yukuku/ambilwarna
Se puede utilizar como diálogo o como entrada de configuración.
Si desea una solución de fragmento, he hecho una bifurcación de selector de color de Android donde se utiliza DialogFragment y se vuelve a crear en el cambio de configuración. Aquí está el enlace: https://github.com/lomza/android-color-picker
Aquí hay otra biblioteca:
https://github.com/eltos/SimpleDialogFragments
Cuadro de diálogo de rueda de color y selector de paleta
Después de algunas búsquedas en las referencias de Android, el recién llegado QuadFlask Color Picker parece ser una opción técnica y estéticamente buena. También tiene deslizador de transparencia y soporta colores HEX codificados.
Echar un vistazo:
Selector de color QuadFlask
- ¿Cómo agregar la vista de la imagen en el lado derecho de la barra de acción?
- Galería de Android no puede combinar título personalizado