在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → 【Android】自定义控件-颜色取色器

【Android】自定义控件-颜色取色器

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:20.34M
  • 下载次数:21
  • 浏览次数:351
  • 发布时间:2016-12-03
  • 实例类别:Android平台开发
  • 发 布 人:wlcm603
  • 文件格式:.zip
  • 所需积分:2
 相关标签: Android 取色 控件 d 自定义控件

实例介绍

【实例简介】

    ColorPickerView 是之前一个智能家居项目实战中所写的自定义控件,主要用于取得RGB 0~255范围的值,然后转换成十六进制0~FF的值,发送给网关控制RGB彩灯。参考的是网上一个朋友的源码写的,多的不说了,先看效果图

【实例截图】

    

【核心代码】

    package zxz.colorpickerdemo; import android.graphics.Color; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.LinearLayout; import android.widget.TextView; import zxz.colorpickerdemo.view.ColorPickerView; public class MainActivity extends AppCompatActivity { private LinearLayout ll; private TextView tv; private ColorPickerView colorPickerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ll = (LinearLayout) findViewById(R.id.ll_color); tv = (TextView) findViewById(R.id.tv_info); colorPickerView = new ColorPickerView(this); ll.addView(colorPickerView); colorPickerView.setOnColorBackListener(new ColorPickerView.OnColorBackListener() { @Override public void onColorBack(int a, int r, int g, int b) { tv.setText("R:" r "\nG:" g "\nB:" b "\n" colorPickerView.getStrColor()); tv.setTextColor(Color.argb(a, r, g, b)); } }); } }


package zxz.colorpickerdemo.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Shader; import android.graphics.SweepGradient; import android.view.MotionEvent; import android.view.View; public class ColorPickerView extends View { private static final float PI = (float) Math.PI; private Paint paintCirclePhantom; private Paint paintCircle; private Paint paintCenterShadow; private Paint paintCenter; private Paint paintGrayShadow; private Paint paintGray; private Paint paintLightShadow; private Paint paintLight; private double Zoom; private int[] arrColorGray; private final int[] arrColorCircle = new int[]{0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00, 0xFFFFFF00, 0xFFFF0000}; private boolean mRedrawHSV; private boolean IsPressCenter; private boolean IsMoveCenter; private int CenterX = 100; private int CenterY = 100; private int CenterRadius = 30; private String strColor = ""; private OnColorBackListener l; public ColorPickerView(Context context) { super(context); float density = getContext().getResources().getDisplayMetrics().density; double Zoom = (double) (density / 2.0 0.5); int color = Color.parseColor("#FFFFFF"); init(color, Zoom); } public ColorPickerView(Context context, int color, double Zoom) { super(context); init(color, Zoom); } private void init(int color, double Zoom) { this.Zoom = Zoom; CenterX = (int) (100 * Zoom); CenterY = (int) (100 * Zoom); CenterRadius = (int) (30 * Zoom); paintCirclePhantom = new Paint(Paint.ANTI_ALIAS_FLAG); paintCircle = new Paint(Paint.ANTI_ALIAS_FLAG); paintCenterShadow = new Paint(Paint.ANTI_ALIAS_FLAG); paintCenter = new Paint(Paint.ANTI_ALIAS_FLAG); paintGrayShadow = new Paint(Paint.ANTI_ALIAS_FLAG); paintGray = new Paint(Paint.ANTI_ALIAS_FLAG); paintLightShadow = new Paint(Paint.ANTI_ALIAS_FLAG); paintLight = new Paint(Paint.ANTI_ALIAS_FLAG); paintCirclePhantom.setColor(0xFF000000); paintCirclePhantom.setStyle(Paint.Style.STROKE); paintCirclePhantom.setStrokeWidth((float) (32 * Zoom)); paintCircle.setShader(new SweepGradient(0, 0, arrColorCircle, null)); paintCircle.setStyle(Paint.Style.STROKE); paintCircle.setStrokeWidth((float) (32 * Zoom)); paintCenterShadow.setColor(0xFF000000); paintCenterShadow.setStrokeWidth((float) (5 * Zoom)); paintCenter.setColor(color); paintCenter.setStrokeWidth((float) (5 * Zoom)); paintGrayShadow.setColor(0xFF000000); paintGrayShadow.setStrokeWidth((float) (30 * Zoom)); arrColorGray = new int[]{0xFFFFFFFF, color, 0xFF000000}; paintGray.setStrokeWidth((float) (30 * Zoom)); paintLightShadow.setColor(0xFF000000); paintLightShadow.setStrokeWidth((float) (60 * Zoom)); paintLight.setStrokeWidth((float) (60 * Zoom)); mRedrawHSV = true; } @Override protected void onDraw(Canvas canvas) { canvas.translate(CenterX, CenterY); float r = CenterX - paintCircle.getStrokeWidth() * 0.5f; int color = paintCenter.getColor(); strColor = "#" Integer.toHexString(color).substring(2).toUpperCase(); if (mRedrawHSV) { arrColorGray[1] = color; paintGray.setShader(new LinearGradient(CenterX, -CenterY, CenterX, (float) (100 * Zoom), arrColorGray, null, Shader.TileMode.CLAMP)); } canvas.drawOval(new RectF(-r 3, -r 3, r 3, r 3), paintCirclePhantom); canvas.drawOval(new RectF(-r, -r, r, r), paintCircle); canvas.drawCircle(3, 3, CenterRadius, paintCenterShadow); canvas.drawCircle(0, 0, CenterRadius, paintCenter); canvas.drawRect(new RectF(CenterX (float) (18 * Zoom), -CenterY 3, CenterX (float) (48 * Zoom), (float) (103 * Zoom)), paintGrayShadow); canvas.drawRect(new RectF(CenterX (float) (15 * Zoom), -CenterY, CenterX (float) (45 * Zoom), (float) (100 * Zoom)), paintGray); if (IsPressCenter) { paintCenter.setStyle(Paint.Style.STROKE); if (IsMoveCenter) paintCenter.setAlpha(0xFF); else paintCenter.setAlpha(0x66); canvas.drawCircle(0, 0, CenterRadius paintCenter.getStrokeWidth(), paintCenter); paintCenter.setStyle(Paint.Style.FILL); paintCenter.setColor(color); } mRedrawHSV = true; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(CenterX * 2 50, CenterY * 2 23); } private int ave(int s, int d, float p) { return s java.lang.Math.round(p * (d - s)); } private int interpColor(int colors[], float unit) { if (unit <= 0) { return colors[0]; } if (unit >= 1) { return colors[colors.length - 1]; } float p = unit * (colors.length - 1); int i = (int) p; p -= i; int c0 = colors[i]; int c1 = colors[i 1]; int a = ave(Color.alpha(c0), Color.alpha(c1), p); int r = ave(Color.red(c0), Color.red(c1), p); int g = ave(Color.green(c0), Color.green(c1), p); int b = ave(Color.blue(c0), Color.blue(c1), p); if (l != null) { l.onColorBack(a, r, g, b); } return Color.argb(a, r, g, b); } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX() - CenterX; float y = event.getY() - CenterY; boolean inCenter = java.lang.Math.sqrt(x * x y * y) <= CenterRadius; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { IsPressCenter = inCenter; if (inCenter) { IsMoveCenter = true; invalidate(); break; } } case MotionEvent.ACTION_MOVE: { if (IsPressCenter) { if (IsMoveCenter != inCenter) { IsMoveCenter = inCenter; invalidate(); } } else if ((x >= -CenterX && x <= CenterX) && (y >= -CenterY && y <= CenterY)) { float angle = (float) java.lang.Math.atan2(y, x); float unit = angle / (2 * PI); if (unit < 0) unit = 1; paintCenter.setColor(interpColor(arrColorCircle, unit)); invalidate(); } else { int a, r, g, b, c0, c1; float p; if (y < 0) { c0 = arrColorGray[0]; c1 = arrColorGray[1]; p = (y 100) / 100; } else { c0 = arrColorGray[1]; c1 = arrColorGray[2]; p = y / 100; } a = ave(Color.alpha(c0), Color.alpha(c1), p); r = ave(Color.red(c0), Color.red(c1), p); g = ave(Color.green(c0), Color.green(c1), p); b = ave(Color.blue(c0), Color.blue(c1), p); paintCenter.setColor(Color.argb(a, r, g, b)); mRedrawHSV = false; if (l != null) { l.onColorBack(a, r, g, b); } invalidate(); } break; } case MotionEvent.ACTION_UP: { if (IsPressCenter) { IsPressCenter = false; invalidate(); } break; } } return true; } public Paint getpaintCirclePhantom() { return paintCirclePhantom; } public void setpaintCirclePhantom(Paint paintCirclePhantom) { this.paintCirclePhantom = paintCirclePhantom; } public Paint getPaintCircle() { return paintCircle; } public void setPaintCircle(Paint paintCircle) { this.paintCircle = paintCircle; } public Paint getPaintCenterShadow() { return paintCenterShadow; } public void setPaintCenterShadow(Paint paintCenterShadow) { this.paintCenterShadow = paintCenterShadow; } public Paint getPaintCenter() { return paintCenter; } public void setPaintCenter(Paint paintCenter) { this.paintCenter = paintCenter; } public Paint getPaintGrayShadow() { return paintGrayShadow; } public void setPaintGrayShadow(Paint paintGrayShadow) { this.paintGrayShadow = paintGrayShadow; } public Paint getPaintGray() { return paintGray; } public void setPaintGray(Paint paintGray) { this.paintGray = paintGray; } public int[] getArrColorGray() { return arrColorGray; } public void setArrColorGray(int[] arrColorGray) { this.arrColorGray = arrColorGray; } public boolean ismRedrawHSV() { return mRedrawHSV; } public void setmRedrawHSV(boolean mRedrawHSV) { this.mRedrawHSV = mRedrawHSV; } public boolean isIsPressCenter() { return IsPressCenter; } public void setIsPressCenter(boolean isPressCenter) { IsPressCenter = isPressCenter; } public boolean isIsMoveCenter() { return IsMoveCenter; } public void setIsMoveCenter(boolean isMoveCenter) { IsMoveCenter = isMoveCenter; } public int[] getArrColorCircle() { return arrColorCircle; } public String getStrColor() { return strColor; } public void setStrColor(String strColor) { this.strColor = strColor; } public double getZoom() { return Zoom; } public void setZoom(double zoom) { Zoom = zoom; } public void setOnColorBackListener(OnColorBackListener l) { this.l = l; } public interface OnColorBackListener { public void onColorBack(int a, int r, int g, int b); } }

实例下载地址

【Android】自定义控件-颜色取色器

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警