栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android实现颜色选取圆盘

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android实现颜色选取圆盘

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

先看效果图

xml布局

 
 
 
 
 
  
 
 
 

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; 
 
 } 
 
  
 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; 
  
  
 @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实现颜色选取圆盘

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/156074.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号