android长方形颜色选择器(Rectangle Color Selector)
2014-11-12 10:20
316 查看
文章参考网址:http://www.iteye.com/topic/1119586
最近项目需要长方形的单个颜色选择器,google发现没有找到很多这方面的资源,比较多的是圆形的颜色选择器, 所以在参考网址上面写了一个长方形的颜色选择器。
1、首先初始化画笔,这里用到了LinearGradient线性渐变,具体代码如下:
代码首先确定了这个视图的宽度和高度,宽度是屏幕的宽度,高度是固定值乘以屏幕的密度,这样使得后续的touch操作更加正确。
第二步设置了颜色渐变区域的范围,第三步设置了渐变,包括区域,颜色集以及简便方式,这里用到了
generateStreechColorArray()函数,这个函数主要是用来生成颜色集合,函数代码如下:
第三步设置了画笔。
2、开始画渐变区域,是一个长方形的区域,具体代码如下:
<com.example.colorselfdefinedemo.RectangleColorSelectorView
android:id="@+id/self_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
最近项目需要长方形的单个颜色选择器,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" />
相关文章推荐
- Android 颜色渲染(一) 颜色选择器 ColorPickerDialog剖析
- android android:textColor="@[package:]color/filename" ----Color/filename文字颜色selector状态列表
- Android UI selector 例子 (drawable/color)
- android中ColorStateList及StateListDrawable设置Selector
- Android 设置TextView字体Color Selector的正确方式
- Android 颜色渲染(一) 颜色选择器 ColorPickerDialog剖析
- android selector color button 背景色
- android中shape、selector、color
- android 代码设置 color的selector
- android基础_imageview的scaleType,listview的cacheColorHint和android:listSelector
- Android动态实现文字颜色选择器 ColorStateList
- Android的selector和shape基本使用和color颜色列表
- 浅谈android的selector,背景选择器
- 浅谈android的selector,背景选择器
- android的selector,背景选择器
- android背景选择器selector用法汇总
- 关于Android ListView组件中android:drawSelectorOnTop含义
- android:drawSelectorOnTop
- android的selector,背景选择器
- Android的selector背景选择器使用