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);
			}
		});
    }
}


详细项目代码:

http://download.csdn.net/detail/zhengjingle/9460618

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android屏幕坐标色彩指的是以屏幕左上角为原点的坐标系中,每个像素点所对应的颜色值。在Android中,可以通过获取屏幕上某一点的颜色值来实现一些特定的功能,比如颜色取色、拾色等。 实现颜色选取可以借助自定义View来完成。具体步骤如下: 1. 自定义一个View,继承自View类,重写onDraw()方法。 2. 在onDraw()方法中,绘制一个渐变的色带,可以使用LinearGradient类来实现。同时,绘制一个小圆圈,表示当前选中的颜色。 3. 为View设置一个触摸事件,当手指按下、移动、抬起时,获取当前手指所在点的坐标,计算出对应的颜色值,并更新小圆圈的位置和颜色。 4. 在View的回调方法中,通知外部监听当前选中的颜色值,以便外部进行相应的处理。 下面是一个示例代码,可以用来实现一个简单的颜色选取: ``` public class ColorPickerView extends View { private Paint mPaint; private Paint mCirclePaint; private int mCurrentColor; private float mCurrentX; private float mCurrentY; private OnColorChangeListener mListener; public ColorPickerView(Context context) { super(context); init(); } public ColorPickerView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ColorPickerView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setStyle(Paint.Style.FILL); mPaint.setStrokeWidth(0); mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG); mCirclePaint.setStyle(Paint.Style.STROKE); mCirclePaint.setStrokeWidth(5); mCirclePaint.setColor(Color.BLACK); mCurrentColor = Color.RED; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int[] colors = {Color.RED, Color.YELLOW, Color.GREEN, Color.CYAN, Color.BLUE, Color.MAGENTA, Color.RED}; float[] positions = {0, 1f / 6, 2f / 6, 3f / 6, 4f / 6, 5f / 6, 1}; LinearGradient gradient = new LinearGradient(0, 0, getWidth(), getHeight(), colors, positions, Shader.TileMode.CLAMP); mPaint.setShader(gradient); canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint); canvas.drawCircle(mCurrentX, mCurrentY, 15, mCirclePaint); } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: mCurrentX = x; mCurrentY = y; int pixel = getPixelColor((int) x, (int) y); mCurrentColor = pixel; invalidate(); if (mListener != null) { mListener.onColorChanged(pixel); } return true; case MotionEvent.ACTION_UP: return true; } return super.onTouchEvent(event); } private int getPixelColor(int x, int y) { Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); draw(canvas); return bitmap.getPixel(x, y); } public int getCurrentColor() { return mCurrentColor; } public void setOnColorChangeListener(OnColorChangeListener listener) { mListener = listener; } public interface OnColorChangeListener { void onColorChanged(int color); } } ``` 在使用时,可以将该View添加到布局文件中,并设置一个监听,监听可以获取到当前选中的颜色值。 ``` ColorPickerView colorPickerView = (ColorPickerView) findViewById(R.id.color_picker_view); colorPickerView.setOnColorChangeListener(new ColorPickerView.OnColorChangeListener() { @Override public void onColorChanged(int color) { // do something with the color } }); ``` 这样,就可以通过自定义View来实现一个颜色选取

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值