Android实现颜色选取圆盘

本文实例为大家分享了Android实现颜色选取圆盘的具体代码,供大家参考,具体内容如下

先看效果图

xml布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 >
<TextView
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:text="@string/hello"
 android:id="@+id/tv_rgb"/>
<RelativeLayout android:id="@+id/relativeLayout1" android:layout_height="fill_parent" android:layout_width="fill_parent"> 

 <com.myview.ColorPickerView
  android:id="@+id/cpv"
  android:layout_width="230dp"
  android:layout_height="230dp"
  android:layout_centerInParent="true"
  android:scaleType="center"
  android:src="@drawable/rgb" /> 

</RelativeLayout>
</LinearLayout> 

ColorPickerView颜色选取圆盘

package com.myview; 

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView; 

public class ColorPickerView extends ImageView {
 Context context;
 private Bitmap iconBitMap;
 float iconRadius;// 吸管圆的半径
 float iconCenterX;
 float iconCenterY;
 PointF iconPoint;// 点击位置坐标 

 public ColorPickerView(Context context) {
  this(context, null);
 } 

 public ColorPickerView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  this.context = context;
  init();
 } 

 public ColorPickerView(Context context, AttributeSet attrs) {
  this(context, attrs, 0);
  init();
 } 

 Paint mBitmapPaint;
 Bitmap imageBitmap;
 float viewRadius;// 整个view半径
 float radius;// 图片半径 

 /**
  * 初始化画笔
  */
 private void init() {
  iconBitMap = BitmapFactory.decodeResource(context.getResources(),
    R.drawable.pickup);// 吸管的图片
  iconRadius = iconBitMap.getWidth() / 2;// 吸管的图片一半 

  mBitmapPaint = new Paint();
  iconPoint = new PointF(); 

  imageBitmap = ((BitmapDrawable) getDrawable()).getBitmap();
  radius = imageBitmap.getHeight() / 2;// 图片半径 

  // // 初始化
  iconPoint.x = radius;
  iconPoint.y = radius; 

 } 

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  // TODO Auto-generated method stub
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 } 

 Canvas canvas; 

 @Override
 protected void onDraw(Canvas canvas) {
  // TODO Auto-generated method stub
  super.onDraw(canvas);
  this.canvas = canvas; 

  viewRadius = this.getWidth() / 2;// 整个view半径 

  canvas.drawBitmap(iconBitMap, iconPoint.x - iconRadius, iconPoint.y
    - iconRadius, mBitmapPaint);
 } 

 @SuppressLint("ClickableViewAccessibility")
 @Override
 public boolean onTouchEvent(MotionEvent event) {
  float x = event.getX();
  float y = event.getY();
  int pixel;
  int r;
  int g;
  int b;
  switch (event.getAction()) {
  case MotionEvent.ACTION_MOVE:
   proofLeft(x, y);
   pixel = getImagePixel(iconPoint.x, iconPoint.y);
   r = Color.red(pixel);
   g = Color.green(pixel);
   b = Color.blue(pixel);
   if (mChangedListener != null) {
    mChangedListener.onMoveColor(r, g, b);
   }
   if (isMove) {
    isMove = !isMove;
    invalidate();
   }
   break;
  case MotionEvent.ACTION_UP:
   pixel = getImagePixel(iconPoint.x, iconPoint.y);
   r = Color.red(pixel);
   g = Color.green(pixel);
   b = Color.blue(pixel);
   if (mChangedListener != null) {
    mChangedListener.onColorChanged(r, g, b);
   }
   break; 

  default:
   break;
  }
  return true;
 } 

 public int getImagePixel(float x, float y) { 

  Bitmap bitmap = imageBitmap;
  // 为了防止越界
  int intX = (int) x;
  int intY = (int) y;
  if (intX < 0)
   intX = 0;
  if (intY < 0)
   intY = 0;
  if (intX >= bitmap.getWidth()) {
   intX = bitmap.getWidth() - 1;
  }
  if (intY >= bitmap.getHeight()) {
   intY = bitmap.getHeight() - 1;
  }
  int pixel = bitmap.getPixel(intX, intY);
  return pixel; 

 } 

 /**
  * R = sqrt(x * x + y * y)
  * point.x = x * r / R + r
  * point.y = y * r / R + r
  */
 private void proofLeft(float x, float y) { 

  float h = x - viewRadius; // 取xy点和圆点 的三角形宽
  float w = y - viewRadius;// 取xy点和圆点 的三角形长
  float h2 = h * h;
  float w2 = w * w;
  float distance = (float) Math.sqrt((h2 + w2)); // 勾股定理求 斜边距离
  if (distance > radius) { // 如果斜边距离大于半径,则取点和圆最近的一个点为x,y
   float maxX = x - viewRadius;
   float maxY = y - viewRadius;
   x = ((radius * maxX) / distance) + viewRadius; // 通过三角形一边平行原理求出x,y
   y = ((radius * maxY) / distance) + viewRadius;
  }
  iconPoint.x = x;
  iconPoint.y = y; 

  isMove = true;
 } 

 boolean isMove; 

 public void setOnColorChangedListenner(OnColorChangedListener l) {
  this.mChangedListener = l;
 } 

 private OnColorChangedListener mChangedListener; 

 // 内部接口 回调颜色 rgb值
 public interface OnColorChangedListener {
  // 手指抬起,确定颜色回调
  void onColorChanged(int r, int g, int b); 

  // 移动时颜色回调
  void onMoveColor(int r, int g, int b);
 }
} 

MyViewActivity主界面

package com.myview; 

import com.myview.ColorPickerView.OnColorChangedListener; 

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast; 

public class MyViewActivity extends Activity { 

 TextView tv_rgb; 

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main); 

  tv_rgb=(TextView)this.findViewById(R.id.tv_rgb); 

  ColorPickerView cpv=(ColorPickerView)this.findViewById(R.id.cpv);
  cpv.setOnColorChangedListenner(new OnColorChangedListener() {
   /**
    * 手指抬起,选定颜色时
    */
   @Override
   public void onColorChanged(int r, int g, int b) {
    if(r==0 && g==0 && b==0){
     return;
    }
    Toast.makeText(MyViewActivity.this, "选取 RGB:"+r+","+g+","+b, Toast.LENGTH_SHORT).show();
   } 

   /**
    * 颜色移动的时候
    */
   @Override
   public void onMoveColor(int r, int g, int b) {
    if(r==0 && g==0 && b==0){
     return;
    }
    tv_rgb.setText("RGB:"+r+","+g+","+b);
   }
  });
 }
} 

详细项目代码:

源码下载:Android实现颜色选取圆盘

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android自定义控件实现颜色选择器

    ColorPickerView 是之前一个智能家居项目实战中所写的自定义控件,主要用于取得RGB 0~255范围的值,然后转换成十六进制0~FF的值,发送给网关控制RGB彩灯.参考的是网上一个朋友的源码写的,多的不说了,先看效果图 activity_mian.xml文件: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas

  • Android自定义view实现图片选色器

    简介 本文介绍该自定义view的使用及实现的方法,主要实现以下几个功能: - 选取圆盘选色图片上的颜色,实时监听 - 可设置选色指示图片,跟随触摸位置.指示所选颜色,示例中为白色圆环 - 可自己设置选色图片(目前只支持圆形图片) github链接 使用效果 首先看下使用效果: 使用示例 在项目中导入该库 在工程的 build.gradle中加入: allprojects { repositories { ... maven { url "https://jitpack.io" } }

  • Android自定义View实现颜色选取器

    Android 自定义View 颜色选取器,可以实现水平.竖直选择颜色类似 SeekBar 的方式通过滑动选择颜色. 效果图 xml 属性 1.indicatorColor 指示点颜色 2.indicatorEnable 是否使用指示点 3.orientation 方向 horizontal 水平 vertical 竖直 使用 复制 \library\src-\ColorPickerView.java 和 \library\src\main\res\values\attrs.xml 文件到你的项

  • android自定义View实现圆环颜色选择器

    最近工作需要,自定了一个颜色选择器,效果图如下: 颜色种类是固定的,圆环上有个指示器,指示选中的颜色,这个定义起来应该是很简单了,直接上代码. public class MyColorPicker extends View { private int mThumbHeight; private int mThumbWidth; private String[] colors ; private int sections; //每个小块的度数 private int sectionAngle; p

  • Android支持国际化多语言那点事(支持8.0+)

    起因 我们在开发app可能会拓展国外市场,那么对包含英语在内的其它语言支持就很有必要了. 效果 思路 一:添加相关资源文件,并引用. 二:设置configuration,configuration里面指定语言类型. 三:在需要时候更换configuration即可. 实现 在res的values文件夹下新建相关语言类型的资源文件 右键新建资源文件,选择Locale,点击 >> 按钮 选择Language,以及地区(any region)即可 最后 文件名字和其他语言文件名字一样,strings

  • Android实现颜色选取圆盘

    本文实例为大家分享了Android实现颜色选取圆盘的具体代码,供大家参考,具体内容如下 先看效果图 xml布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android

  • jquery衣服颜色选取插件效果代码分享

    本文实例讲述了jquery衣服颜色选取插件效果.分享给大家供大家参考.具体如下: 这是一款基于jquery实现衣服颜色选取插件效果代码,有了这个插件可以为自己搭配衣服颜色,自己就是设计师,为自己设计独一无二的衣服,是一款非常实用的特效代码,值得大家学习. 运行效果图:-------------------查看效果 下载源码------------------- 小提示:浏览器中如果不能正常运行,可以尝试切换浏览模式. 为大家分享的jquery衣服颜色选取插件效果代码如下 <head> <

  • Android 设置颜色的方法总结

    Android 设置颜色的方法总结 Android中有几种设置界面背景及文字颜色的方法,下面由浅入深分别介绍Android中设置颜色的几种方法: 1.直接在布局文件中设置: android:backgound="#FFFFFFFF", android:textcolor="#00000000" 2.把颜色提取出来形成资源,放在资源文件下面(values/drawable/color.xml): <?xml version="1.0" enc

  • Android Color颜色过度计算实现代码

    Android Color颜色过度计算实现代码 在看自定义TypeEvaluator来计算属性动画的属性值时,用到了对颜色的过度计算,翻看了好多博客,找到了比较有优秀的解决方案,在此记录,以备后用. 实现效果图: 实现代码: /** * 根据fraction值来计算当前的颜色. */ private int getCurrentColor(float fraction, int startColor, int endColor) { int redCurrent; int blueCurrent

  • Android中颜色选择器和改变字体颜色的实例教程

    1.构建一张七彩图: 我们经常看到这种样子的颜色选择器吧.. 然后其实右边的亮度选择是: 这样我们的代码就可以进行啦... // 创建七彩图片 private void init() { int[] oc = { 0xffff0000, 0xffffff00, 0xff00ff00, 0xff00ffff, 0xff0000ff, 0xffff00ff, 0xffff0000 }; float[] op = { 0, 0.16667f, 0.33333f, 0.5f, 0.66667f, 0.8

  • Android实现颜色渐变动画效果

    目录 前言 一.Android中插值器TypeEvaluator 二.案例效果实现 1.利用Android自带的颜色插值器ArgbEvaluator 2.看看Android自带颜色插值器ArgbEvaluator核心代码 3.根据ArgbEvaluator的实现来自定义一个颜色插值器 4.使用自己定义的颜色插值器MyColorEvaluator 三.源码 本文实例为大家分享了Android颜色渐变动画效果的实现代码,供大家参考,具体内容如下 前言 案例效果的实现比较简单,利用Android自带的

  • android 字体颜色选择器(ColorPicker)介绍

    primary_text_yellow.xml 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2008 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this f

  • Android中的颜色表示的详解

    Android中的颜色表示 在Android中颜色用一个32位整数来表示,32位整数包含4个字节,其中第一个字节代表该颜色的透明度(Alpha),0表示完全透明,0xFF表示完全不透明.第2,3,4字节分别代表该颜色在RGB颜色空间中红色(R),绿色(G)和蓝色(B)三个颜色分量的值,0代表没有该颜色分量,0xFF代表该颜色分量达到最大.例如0xCCFF0000表示80%透明度的红色. XML中的颜色表示 在XML中用#加颜色值来表示一个颜色,例如#FFA1A100.如果透明度为0xFF,即完全

随机推荐