首页 > 系统 > Android > 正文

Android实现颜色选取圆盘

2019-10-22 18:10:18
字体:
来源:转载
供稿:网友

本文实例为大家分享了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实现颜色选取圆盘

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


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表