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

首頁(yè) > 系統(tǒng) > Android > 正文

ImageView 實(shí)現(xiàn)Android colorPikcer 選擇器的示例代碼

2019-12-12 01:52:18
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

Android colorPikcer 選擇器

環(huán)形的ColorPicker,主要思路是:

  1. Color 選在放在ImageView 的background上面,根據(jù)點(diǎn)擊的位置判斷選擇的顏色。
  2. 重寫onTouch,在onTouch 里面判斷點(diǎn)擊點(diǎn)的顏色。
  3. 根據(jù)當(dāng)前選擇的顏色設(shè)置圖片的src.

獲取Bitmap

在 ColorPickerView 構(gòu)造函數(shù)中初始化 Bitmap。因?yàn)間etBackground有多種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

根據(jù)Touch 事件的左邊獲取 Bitmap 對(duì)應(yīng)點(diǎn)的顏色。

需要注意的是如果 View 的寬和高參數(shù)是 wrap_content, MotionEvent 的點(diǎn)擊的點(diǎn)一定在Bitmap 的坐標(biāo)內(nèi)。但是如果不是wrap_content, 需要對(duì)坐標(biāo)轉(zhuǎn)換,利用矩陣Matrix 對(duì)點(diǎn)擊點(diǎn)轉(zhuǎn)換。

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 云和县| 新疆| 翁牛特旗| 雅江县| 东山县| 田东县| 吴桥县| 长丰县| 兴业县| 伊宁市| 瑞安市| 长武县| 汶川县| 利辛县| 张北县| 兰坪| 墨竹工卡县| 达拉特旗| 宝丰县| 宜黄县| 图们市| 章丘市| 庆安县| 洪湖市| 青冈县| 云和县| 鄂伦春自治旗| 增城市| 文昌市| 泾川县| 安仁县| 渝中区| 大理市| 柳林县| 蒙阴县| 资溪县| 逊克县| 台山市| 图片| 九龙坡区| 漳平市|