Android實(shí)現(xiàn)顏色選取圓盤
本文實(shí)例為大家分享了Android實(shí)現(xiàn)顏色選取圓盤的具體代碼,供大家參考,具體內(nèi)容如下
先看效果圖

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;// 點(diǎn)擊位置坐標(biāo)
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;// 整個(gè)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;// 整個(gè)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點(diǎn)和圓點(diǎn) 的三角形寬
float w = y - viewRadius;// 取xy點(diǎn)和圓點(diǎn) 的三角形長(zhǎng)
float h2 = h * h;
float w2 = w * w;
float distance = (float) Math.sqrt((h2 + w2)); // 勾股定理求 斜邊距離
if (distance > radius) { // 如果斜邊距離大于半徑,則取點(diǎn)和圓最近的一個(gè)點(diǎn)為x,y
float maxX = x - viewRadius;
float maxY = y - viewRadius;
x = ((radius * maxX) / distance) + viewRadius; // 通過(guò)三角形一邊平行原理求出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;
// 內(nèi)部接口 回調(diào)顏色 rgb值
public interface OnColorChangedListener {
// 手指抬起,確定顏色回調(diào)
void onColorChanged(int r, int g, int b);
// 移動(dòng)時(shí)顏色回調(diào)
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() {
/**
* 手指抬起,選定顏色時(shí)
*/
@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();
}
/**
* 顏色移動(dòng)的時(shí)候
*/
@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);
}
});
}
}
詳細(xì)項(xiàng)目代碼:
源碼下載:Android實(shí)現(xiàn)顏色選取圓盤
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android高仿抖音照片電影功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android高仿抖音照片電影功能的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
Android實(shí)現(xiàn)的數(shù)字格式化用法示例
這篇文章主要介紹了Android實(shí)現(xiàn)的數(shù)字格式化用法,結(jié)合實(shí)例形式分析了Android數(shù)學(xué)運(yùn)算中數(shù)字格式化輸出的相關(guān)技巧,需要的朋友可以參考下2016-08-08
android藍(lán)牙簡(jiǎn)單開發(fā)示例教程
大家好,本篇文章主要講的是android藍(lán)牙簡(jiǎn)單開發(fā)示例教程,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2021-12-12
Android手機(jī)注冊(cè)登錄時(shí)獲取驗(yàn)證碼之后倒計(jì)時(shí)功能(知識(shí)點(diǎn)總結(jié))
這篇文章主要介紹了Android手機(jī)注冊(cè)登錄時(shí)獲取驗(yàn)證碼之后倒計(jì)時(shí)(知識(shí)點(diǎn)總結(jié))功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-01-01
Adapter模式實(shí)戰(zhàn)之重構(gòu)鴻洋集團(tuán)的Android圓形菜單建行
這篇文章主要介紹了Adapter模式實(shí)戰(zhàn)之重構(gòu)鴻洋集團(tuán)的Android圓形菜單建行的相關(guān)資料,需要的朋友可以參考下2016-03-03
android中ViewPager結(jié)合Fragment進(jìn)行無(wú)限滑動(dòng)
本篇文章中主要介紹了android中ViewPager結(jié)合Fragment進(jìn)行無(wú)限滑動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
SimpleCommand實(shí)現(xiàn)上傳文件或視頻功能(四)
這篇文章主要介紹了SimpleCommand實(shí)現(xiàn)上傳文件或視頻功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Android編程基于自定義view實(shí)現(xiàn)公章效果示例【附源碼下載】
這篇文章主要介紹了Android編程基于自定義view實(shí)現(xiàn)公章效果,結(jié)合實(shí)例形式分析了Android使用自定義view進(jìn)行圖形繪制的相關(guān)操作技巧,并附帶完整實(shí)例源碼供讀者下載參考,需要的朋友可以參考下2017-11-11

