您的位置:首页 > 移动开发 > Android开发

android长方形颜色选择器(Rectangle Color Selector)

2014-11-12 10:20 316 查看
文章参考网址:http://www.iteye.com/topic/1119586

最近项目需要长方形的单个颜色选择器,google发现没有找到很多这方面的资源,比较多的是圆形的颜色选择器,   所以在参考网址上面写了一个长方形的颜色选择器。

1、首先初始化画笔,这里用到了LinearGradient线性渐变,具体代码如下:   

public void setInitData() {
float density = metrics.density;
this.mHeight = (int) (30f * density);
this.mWidth = metrics.widthPixels;
rectLeft = 0;// 渐变方块左x坐标
rectTop = 0;// 渐变方块右x坐标
rectRight = mWidth;// 渐变方块上y坐标
rectBottom = mHeight;// 渐变方块下y坐标
int[] colors = generateStretchColorArray();
LinearGradient s = new LinearGradient(rectLeft, rectTop, rectRight, rectBottom, colors, null, LinearGradient.TileMode.CLAMP);
mPaint = new Paint();
mPaint.setShader(s);
}

代码首先确定了这个视图的宽度和高度,宽度是屏幕的宽度,高度是固定值乘以屏幕的密度,这样使得后续的touch操作更加正确。

第二步设置了颜色渐变区域的范围,第三步设置了渐变,包括区域,颜色集以及简便方式,这里用到了

generateStreechColorArray()函数,这个函数主要是用来生成颜色集合,函数代码如下:

private int[] generateStretchColorArray() {
int[] colorArray = new int[361];
int count = 0;
for (int i = colorArray.length - 1; i >= 0; i--, count++) {
colorArray[count] = Color.HSVToColor(new float[]{i, 1f, 1f});
}
return colorArray;
}


第三步设置了画笔。   

2、开始画渐变区域,是一个长方形的区域,具体代码如下:

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(rectLeft, rectTop, rectRight, rectBottom, mPaint);
}
3、设置这个自定义视图的大小,代码如下:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = View.MeasureSpec.getSize(widthMeasureSpec);
//高度在setInitData函数中
setMeasuredDimension(width, mHeight);
}
4、onTouchEvent函数,在这个函数中获取点击的坐标点,判断所点击的坐标点是否是在长方形区域内,如果在的话就获取这个点上面的颜色,代码如下:

@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
boolean inCircle = inColorRec(x, y);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
currentDownInRect = inCircle;
case MotionEvent.ACTION_MOVE:
if (currentDownInRect && inCircle) {// down按在渐变色环内, 且move也在渐变色环内
colorValue = interpRectColor(x);
if (colorValue != null) {
mListener.onColorChanged(colorValue);
}
}
invalidate();
break;
case MotionEvent.ACTION_UP:
if (currentDownInRect) {
if (mListener != null && colorValue != null) {
mListener.onColorChanged(colorValue);
currentDownInRect = false;
}
}
if (downInRect) {
downInRect = false;
}
invalidate();
break;
}
return true;
}
5、如果触摸点在矩形区域上就获取这个点的颜色值,具体代码如下:

private String interpRectColor(float x) {
Log.e(TAG, "\n x " + x);
Log.e(TAG, "\ncolor " + Color.HSVToColor(new float[]{pointToStretchColor(x), 1f, 1f}));
int currentColor = Color.HSVToColor(new float[]{pointToStretchColor(x), 1f, 1f});
return convertToARGB(currentColor);
}
里面有一个函数pointToStrechColor函数是用来获取颜色的主要函数,代码如下:

private float pointToStretchColor(float x) {
float width = rectRight - rectLeft;
if (x < rectLeft) {
x = 0f;
} else if (x > rectRight) {
x = width;
} else {
x = x - rectLeft;
}
return 360f - (x * 360f / width);
}
颜色转换函数:

public String convertToARGB(int color) {
String alpha = Integer.toHexString(Color.alpha(color));
String red = Integer.toHexString(Color.red(color));
String green = Integer.toHexString(Color.green(color));
String blue = Integer.toHexString(Color.blue(color));
if (alpha.length() == 1) {
alpha = "0" + alpha;
}
if (red.length() == 1) {
red = "0" + red;
}
if (green.length() == 1) {
green = "0" + green;
}
if (blue.length() == 1) {
blue = "0" + blue;
}
return "#" + red + green + blue;
}
6、颜色改变时的监听接口:

public interface OnColorChangedListener {
void onColorChanged(String color);
}

public void setOnColorChangedListener(OnColorChangedListener mListener) {
this.mListener = mListener;
}
至此,这个view算是画完了,当触摸滑动的时候颜色会随着指尖的滑动而改变,在xml中的调用如下:

  <com.example.colorselfdefinedemo.RectangleColorSelectorView

    android:id="@+id/self_view"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息