国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

ImageView 實現Android colorPikcer 選擇器的示例代碼

2019-10-22 18:25:30
字體:
來源:轉載
供稿:網友

本文介紹了ImageView 實現Android colorPikcer 選擇器的示例代碼,分享給大家,具體如下:

Android colorPikcer 選擇器

Android,colorPikcer,選擇器,color

環形的ColorPicker,主要思路是:

  1. Color 選在放在ImageView 的background上面,根據點擊的位置判斷選擇的顏色。
  2. 重寫onTouch,在onTouch 里面判斷點擊點的顏色。
  3. 根據當前選擇的顏色設置圖片的src.

獲取Bitmap

在 ColorPickerView 構造函數中初始化 Bitmap。因為getBackground有多種drawable,然后獲取Bitmap 的方式也不用,

void init(Context context, @Nullable AttributeSet attrs, int defStyleAttr){    Drawable drawable = getBackground();    if(drawable instanceof BitmapDrawable){      mBitmap = ((BitmapDrawable) drawable).getBitmap();    } else if(drawable instanceof VectorDrawable){      mBitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);      Canvas vectorCanvas = new Canvas(mBitmap);      drawable.setBounds(0, 0, vectorCanvas.getWidth(), vectorCanvas.getHeight());      drawable.draw(vectorCanvas);    }

重寫onTouch

根據Touch 事件的左邊獲取 Bitmap 對應點的顏色。

需要注意的是如果 View 的寬和高參數是 wrap_content, MotionEvent 的點擊的點一定在Bitmap 的坐標內。但是如果不是wrap_content, 需要對坐標轉換,利用矩陣Matrix 對點擊點轉換。

public boolean onTouch(View v, MotionEvent event) {    if (event.getAction() == MotionEvent.ACTION_DOWN && mBitmap != null) {        float scaleX = mBitmap.getWidth()*1.0f/v.getWidth();      float scaleY = mBitmap.getHeight()*1.0f/v.getHeight();      float[] touchPoint = new float[] { event.getX(), event.getY() };      Matrix matrix = new Matrix();      matrix.setScale(scaleX, scaleY);      matrix.mapPoints(touchPoint);      mSelectColor = mBitmap.getPixel((int) touchPoint[0], (int) touchPoint[1]);    }    return false;  }

完整的代碼:

public class ColorPickerView extends android.support.v7.widget.AppCompatImageView implements View.OnTouchListener{  private Bitmap mBitmap;  private int mSelectColor = -1;  private int mIndex = -1;  private int[] mDrawableSelects;  private int[] mColorArray;  private OnColorSelectedListener mOnColorSelectedListener;  public ColorPickerView(Context context) {    this(context, null);  }  public ColorPickerView(Context context, @Nullable AttributeSet attrs) {    this(context, attrs, 0);  }  public ColorPickerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    init(context, attrs, defStyleAttr);  }  void init(Context context, @Nullable AttributeSet attrs, int defStyleAttr){    Drawable drawable = getBackground();    if(drawable instanceof BitmapDrawable){      mBitmap = ((BitmapDrawable) drawable).getBitmap();    } else if(drawable instanceof VectorDrawable){      mBitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);      Canvas vectorCanvas = new Canvas(mBitmap);      drawable.setBounds(0, 0, vectorCanvas.getWidth(), vectorCanvas.getHeight());      drawable.draw(vectorCanvas);    }    TypedArray resTypeArray = context.obtainStyledAttributes(attrs, R.styleable.ColorPickerView);    int colorPickerArrayId = resTypeArray.getResourceId(R.styleable.ColorPickerView_cp_selected_drawable_array, 0);    resTypeArray.recycle();    if (colorPickerArrayId != 0) {      TypedArray typeArray = getResources().obtainTypedArray(colorPickerArrayId);      mDrawableSelects = new int[typeArray.length()];      for (int i = 0; i < typeArray.length(); i++) {        mDrawableSelects[i] = typeArray.getResourceId(i, 0);      }      typeArray.recycle();    }    setOnTouchListener(this);  }  @Override  public boolean onTouch(View v, MotionEvent event) {    if (event.getAction() == MotionEvent.ACTION_DOWN && mBitmap != null) {      if(event.getX() > v.getWidth() || event.getX() < 0){        return false;      }      if(event.getY() > v.getHeight() || event.getY() < 0){        return false;      }      float scaleX = mBitmap.getWidth()*1.0f/v.getWidth();      float scaleY = mBitmap.getHeight()*1.0f/v.getHeight();      float[] touchPoint = new float[] { event.getX(), event.getY() };      Matrix matrix = new Matrix();      matrix.setScale(scaleX, scaleY);      matrix.mapPoints(touchPoint);      mSelectColor = mBitmap.getPixel((int) touchPoint[0], (int) touchPoint[1]);      mIndex = getColorIndex(mSelectColor);      if(mDrawableSelects.length > 0 && mIndex >=0 && mIndex < mDrawableSelects.length) {        ((ImageView) v).setImageResource(mDrawableSelects[mIndex]);      }      if(mOnColorSelectedListener != null){        mOnColorSelectedListener.onColorSelected(mIndex, mSelectColor);      }    }    return false;  }  private int getColorIndex(int color){    for (int i = 0 ; i < mColorArray.length; i++){      if(color == mColorArray[i]){        return i;      }    }    return -1;  }  public void setSelectColorArray(int[] array) {    mColorArray = array;  }  public void setSelectDrawableIdArray(int[] idArray){    mDrawableSelects = idArray;  }  public int getIndex(){    return mIndex;  }  public int getSelectColor(){    return mSelectColor;  }  public void setOnColorSelectedListener(OnColorSelectedListener listener){    mOnColorSelectedListener = listener;  }  public interface OnColorSelectedListener{    void onColorSelected(int index , int color);  }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 涪陵区| 正镶白旗| 普陀区| 渝中区| 巨野县| 咸丰县| 疏附县| 穆棱市| 汝阳县| 镇平县| 介休市| 措勤县| 五莲县| 新蔡县| 临洮县| 桂阳县| 陆河县| 镇巴县| 青海省| 买车| 仁寿县| 库车县| 浦县| 瓮安县| 银川市| 海口市| 肥乡县| 札达县| 石台县| 慈利县| 盈江县| 大连市| 隆回县| 灵山县| 汨罗市| 宁海县| 石狮市| 青河县| 南靖县| 琼海市| 香河县|