前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android实现颜色选取圆盘

Android实现颜色选取圆盘

作者头像
砸漏
发布2020-11-05 10:21:21
9990
发布2020-11-05 10:21:21
举报
文章被收录于专栏:恩蓝脚本

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

先看效果图

xml布局

代码语言:javascript
复制
<?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颜色选取圆盘

代码语言:javascript
复制
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主界面

代码语言:javascript
复制
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实现颜色选取圆盘

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档