Android顏色選取器

來源:互聯網
上載者:User

參考網上文章,做了兩種顏色選取器。

 

一種是固定顏色的選取器,這個很簡單,只要畫出來各種顏色地區,使用者選擇哪個,就選擇了什麼顏色。

另一種是萬能顏色選取器,這個有一些演算法的,所以就參考了網上的文章(由於原始出處不詳,就不表示感謝了),又做了一些最佳化和修改。

 

目前的這個萬能顏色選取器的功能已經足夠了,也沒什麼可保密的,就放上來,給需要的人做個參考。喜歡就拿去好了。

 

package arui.csdn.generaltools.colorchooser.universalcolor;<br />import arui.csdn.generaltools.colorchooser.ColorChooserType;<br />import arui.csdn.generaltools.colorchooser.OnColorChangedListener;<br />import android.content.Context;<br />import android.graphics.Canvas;<br />import android.graphics.Color;<br />import android.graphics.LinearGradient;<br />import android.graphics.Paint;<br />import android.graphics.RectF;<br />import android.graphics.Shader;<br />import android.graphics.SweepGradient;<br />import android.view.MotionEvent;<br />import android.view.View;<br />/**<br /> * Universal color view class. This class will draw color chooser graph.<br /> *<br /> * @author http://blog.csdn.net/arui319<br /> *<br /> */<br />public class UniversalColorView extends View {<br />private Paint mPaint;<br />private Paint mCenterPaint;<br />private Paint mHSVPaint;<br />private final int[] mColors;<br />private int[] mHSVColors;<br />private boolean mRedrawHSV;<br />private OnColorChangedListener mListener;<br />private boolean mTrackingCenter;<br />private boolean mHighlightCenter;<br />private static final int CENTER_X = 100;<br />private static final int CENTER_Y = CENTER_X;<br />private static final int CENTER_RADIUS = 30;<br />private static final int OUTER_RADIUS = 100;<br />private static final int HSV_X = CENTER_X;<br />private static final int HSV_Y_TOP = CENTER_Y + 10;<br />private static final int HSV_Y_BOTOM = HSV_Y_TOP + 20;<br />private static final float PI = 3.1415926f;<br />public UniversalColorView(Context context, OnColorChangedListener listener,<br />int color) {<br />super(context);<br />this.setBackgroundColor(Color.LTGRAY);<br />mListener = listener;<br />mColors = new int[] { 0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF,<br />0xFF00FF00, 0xFFFFFF00, 0xFFFF0000 };<br />Shader s = new SweepGradient(0, 0, mColors, null);<br />mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);<br />mPaint.setShader(s);<br />mPaint.setStyle(Paint.Style.STROKE);<br />mPaint.setStrokeWidth(55);<br />mCenterPaint = new Paint(Paint.ANTI_ALIAS_FLAG);<br />mCenterPaint.setColor(color);<br />mCenterPaint.setStrokeWidth(5);<br />mHSVColors = new int[] { 0xFF000000, color, 0xFFFFFFFF };<br />mHSVPaint = new Paint(Paint.ANTI_ALIAS_FLAG);<br />mHSVPaint.setStrokeWidth(10);<br />mRedrawHSV = true;<br />}<br />@Override<br />protected void onDraw(Canvas canvas) {<br />float r = CENTER_X - mPaint.getStrokeWidth() * 0.5f;<br />canvas.translate(CENTER_X, CENTER_X);<br />int c = mCenterPaint.getColor();<br />if (mRedrawHSV) {<br />mHSVColors[1] = c;<br />mHSVPaint.setShader(new LinearGradient(0 - HSV_X, 0, HSV_X, 0,<br />mHSVColors, null, Shader.TileMode.CLAMP));<br />}<br />canvas.drawOval(new RectF(-r, -r, r, r), mPaint);<br />canvas.drawCircle(0, 0, CENTER_RADIUS, mCenterPaint);<br />canvas.drawRect(new RectF(0 - HSV_X, HSV_Y_TOP, HSV_X, HSV_Y_BOTOM),<br />mHSVPaint);<br />if (mTrackingCenter) {<br />mCenterPaint.setStyle(Paint.Style.STROKE);<br />if (mHighlightCenter) {<br />mCenterPaint.setAlpha(0xFF);<br />} else {<br />mCenterPaint.setAlpha(0x80);<br />}<br />canvas.drawCircle(0, 0, CENTER_RADIUS<br />+ mCenterPaint.getStrokeWidth(), mCenterPaint);<br />mCenterPaint.setStyle(Paint.Style.FILL);<br />mCenterPaint.setColor(c);<br />}<br />mRedrawHSV = true;<br />}<br />@Override<br />protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {<br />setMeasuredDimension(CENTER_X * 2, HSV_Y_BOTOM * 2 - 20);<br />}<br />@Override<br />public boolean onTouchEvent(MotionEvent event) {<br />float x = event.getX() - CENTER_X;<br />float y = event.getY() - CENTER_Y;<br />double radius = Math.sqrt(x * x + y * y);<br />boolean inCenter = radius <= CENTER_RADIUS;<br />boolean inOuter = radius <= OUTER_RADIUS;<br />switch (event.getAction()) {<br />case MotionEvent.ACTION_DOWN:<br />mTrackingCenter = inCenter;<br />if (inCenter) {<br />mHighlightCenter = true;<br />invalidate();<br />break;<br />}<br />case MotionEvent.ACTION_MOVE:<br />if (mTrackingCenter) {<br />if (mHighlightCenter != inCenter) {<br />mHighlightCenter = inCenter;<br />invalidate();<br />}<br />} else if ((x >= 0 - HSV_X && x <= HSV_X)<br />&& (y <= HSV_Y_BOTOM && y >= HSV_Y_TOP)) {<br />// see if we are in the hsv slider<br />int a, r, g, b, c0, c1;<br />float p;<br />// set the center paint to this color<br />if (x < 0) {<br />c0 = mHSVColors[0];<br />c1 = mHSVColors[1];<br />p = (x + 100) / 100;<br />} else {<br />c0 = mHSVColors[1];<br />c1 = mHSVColors[2];<br />p = x / 100;<br />}<br />a = ave(Color.alpha(c0), Color.alpha(c1), p);<br />r = ave(Color.red(c0), Color.red(c1), p);<br />g = ave(Color.green(c0), Color.green(c1), p);<br />b = ave(Color.blue(c0), Color.blue(c1), p);<br />mCenterPaint.setColor(Color.argb(a, r, g, b));<br />mRedrawHSV = false;<br />invalidate();<br />} else if (inOuter) {<br />float angle = (float) Math.atan2(y, x);<br />// need to turn angle [-PI ... PI] into unit [0....1]<br />float unit = angle / (2 * PI);<br />if (unit < 0) {<br />unit += 1;<br />}<br />mCenterPaint.setColor(interpColor(mColors, unit));<br />invalidate();<br />}<br />break;<br />case MotionEvent.ACTION_UP:<br />if (mTrackingCenter) {<br />if (inCenter && mListener != null) {<br />mListener.colorChanged(this,<br />ColorChooserType.UNIVERSAL_COLOR_TYPE, mCenterPaint<br />.getColor());<br />}<br />mTrackingCenter = false;<br />invalidate();<br />}<br />break;<br />}<br />return true;<br />}<br />private int interpColor(int colors[], float unit) {<br />if (unit <= 0) {<br />return colors[0];<br />}<br />if (unit >= 1) {<br />return colors[colors.length - 1];<br />}<br />float p = unit * (colors.length - 1);<br />int i = (int) p;<br />p -= i;<br />// now p is just the fractional part [0...1) and i is the index<br />int c0 = colors[i];<br />int c1 = colors[i + 1];<br />int a = ave(Color.alpha(c0), Color.alpha(c1), p);<br />int r = ave(Color.red(c0), Color.red(c1), p);<br />int g = ave(Color.green(c0), Color.green(c1), p);<br />int b = ave(Color.blue(c0), Color.blue(c1), p);<br />return Color.argb(a, r, g, b);<br />}<br />private int ave(int s, int d, float p) {<br />return s + Math.round(p * (d - s));<br />}<br />public int getColor() {<br />return mCenterPaint.getColor();<br />}<br />public void setColor(int color) {<br />mCenterPaint.setColor(color);<br />}<br />}<br /> 

 

package arui.csdn.generaltools.colorchooser;<br />/**<br /> * color changed listener.<br /> *<br /> * @author http://blog.csdn.net/arui319<br /> *<br /> */<br />public interface OnColorChangedListener {<br />/**<br /> * Color changed event happened.<br /> *<br /> * @param source<br /> * event source object<br /> * @param type<br /> * ColorChooserType<br /> * @param color<br /> * color int value<br /> */<br />public void colorChanged(Object source, ColorChooserType type, int color);<br />} 

 

package arui.csdn.generaltools.colorchooser;</p><p>/**<br /> * Color chooser's type. One is defined color panel, another is universal color<br /> * panel.<br /> *<br /> * @author http://blog.csdn.net/arui319<br /> *<br /> */<br />public class ColorChooserType {<br />private int type = 0;<br />private static final int DEFINED_COLOR = 1;<br />private static final int UNIVERSAL_COLOR = 2;<br />public static final ColorChooserType DEFINED_COLOR_TYPE = new ColorChooserType(<br />DEFINED_COLOR);<br />public static final ColorChooserType UNIVERSAL_COLOR_TYPE = new ColorChooserType(<br />UNIVERSAL_COLOR);<br />private ColorChooserType(int type) {<br />this.type = type;<br />}<br />public int getType() {<br />return type;<br />}<br />@Override<br />public boolean equals(Object type) {<br />if (type instanceof ColorChooserType) {<br />if (this.getType() == ((ColorChooserType) type).getType()) {<br />return true;<br />}<br />}<br />return false;<br />}<br />@Override<br />public int hashCode() {<br />return this.getType();<br />}<br />}<br /> 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.