Android实现颜色选取圆盘

 更新时间:2018年06月02日 08:51:09   作者:ZhengJingLe  
这篇文章主要为大家详细介绍了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实现颜色选取圆盘

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

相关文章

  • 详解Flutter中Dart集合使用教程

    详解Flutter中Dart集合使用教程

    集合是应用程序中最为常见的数据结构,Dart一共支持四种集合,其中核心的List, Map和Set在基础框架中。本文将详细讲解Dart集合的最佳实践,需要的可以参考一下
    2022-05-05
  • Android使用文件进行数据存储的方法

    Android使用文件进行数据存储的方法

    这篇文章主要介绍了Android使用文件进行数据存储的方法,较为详细的分析了Android基于文件实现数据存储所涉及的相关概念与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • Android9.0 SystemUI 网络信号栏定制修改的流程解析

    Android9.0 SystemUI 网络信号栏定制修改的流程解析

    这篇文章主要介绍了Android9.0 SystemUI 网络信号栏定制修改的流程,本文通过图文实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • android自定义开关控件-SlideSwitch的实例

    android自定义开关控件-SlideSwitch的实例

    本篇文章主要介绍了android自定义开关控件-SlideSwitch的实例,实现了手机控件开关的功能,感兴趣的小伙伴们可以参考一下。
    2016-11-11
  • Kotlin浅析null操作方法

    Kotlin浅析null操作方法

    Kotlin对比于Java的一个最大的区别就是它致力于消除空引用所带来的危险。在Java中,如果我们尝试访问一个空引用的成员可能就会导致空指针异常NullPointerException(NPE)的出现。在Kotlin语言中就解决了这个问题,下面来看看它是如何做到的
    2022-08-08
  • android 仿微信demo——登录功能实现(服务端)

    android 仿微信demo——登录功能实现(服务端)

    这系列文章主要介绍了微信小程序-阅读小程序实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能给你们提供帮助
    2021-06-06
  • 使用RoundedBitmapDrawable生成圆角图片的方法

    使用RoundedBitmapDrawable生成圆角图片的方法

    由于RoundedBitmapDrawable类没有直接提供生成圆形图片的方法,所以生成圆形图片首先需要对原始图片进行裁剪,将图片裁剪成正方形,最后再生成圆形图片,具体实现方法,可以参考下本文
    2016-09-09
  • Android开发Jetpack组件DataBinding用例详解

    Android开发Jetpack组件DataBinding用例详解

    这篇文章主要为大家介绍了Android开发Jetpack组件DataBinding的使案用例详解说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • Android 优化之卡顿优化的实现

    Android 优化之卡顿优化的实现

    这篇文章主要介绍了Android 优化之卡顿优化的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • flutter 微信聊天输入框功能实现

    flutter 微信聊天输入框功能实现

    这篇文章主要介绍了flutter 微信聊天输入框功能实现,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03

最新评论