ImageView 实现Android colorPikcer 选择器的示例代码

本文介绍了ImageView 实现Android colorPikcer 选择器的示例代码,分享给大家,具体如下:

Android colorPikcer 选择器

环形的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);
  }
}

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

(0)

相关推荐

  • Android开发中实现IOS风格底部选择器(支持时间 日期 自定义)

    本文Github代码链接 https://github.com/AndroidMsky/AndoirdIOSPicker 先上图吧: 这是笔者最近一个项目一直再用的一个选择器库,自己也在其中做了修改,并决定持续维护下去. 先看使用方法: 日期选择: private void showDateDialog(List<Integer> date) { DatePickerDialog.Builder builder = new DatePickerDialog.Builder(this); bui

  • android 字体颜色选择器(ColorPicker)介绍

    primary_text_yellow.xml 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2008 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this f

  • Android仿微信照片选择器实现预览查看图片

    好了下面进入正题,我们先看一下实现效果吧: 下面来介绍一下代码: 本思路就是: 1.先到手机中扫描jpeg和png的图片 2.获取导图片的路径和图片的父路径名也就是文件夹名 3.将图片路径和文件夹名分别添加导数据源中 4.数据源有了就是显示了,文件夹显示是利用的popwindow,而图片显示则是GridView 看一下具体代码: 首先开启一个线程去扫描图片 /** * 利用ContentProvider扫描手机中的图片,此方法在运行在子线程中 完成图片的扫描,最终获得jpg最多的那个文件夹 */

  • 浅谈谈Android 图片选择器

    ImageSelector 简介 Android自定义相册,实现了拍照.图片选择(单选/多选).ImageLoader无绑定 任由开发者选择 https://github.com/YancyYe/ImageSelector Demo Download Apk 更新内容 UI重改 所有功能可配置 解决OOM情况 图片手动选择 支持汉语和英语 截图展示 使用说明 步骤一: 通过Gradle抓取 dependencies { compile 'com.yancy.imageselector:image

  • Android时间选择器、日期选择器实现代码

    本文为大家分享了两款选择器,一款可以针对时间进行选择.一款可以针对日期进行选择,供大家参考,具体内容如下 一.时间选择器 1.1.布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.and

  • Android自定义可循环的滚动选择器CycleWheelView

    最近碰到个项目要使用到滚动选择器,原生的NumberPicker可定制性太差,不大符合UI要求. 网上开源的WheelView是用ScrollView写的,不能循环滚动,而且当数据量很大时要加载的Item太多,性能非常低. 然后,还是自己写一个比较靠谱,用的是ListView实现的.写完自己体验了一下,性能不错,再大的数据也不怕了. 感觉不错,重新封装了一下,提供了一些接口可以直接按照自己的需求定制,调用方法在MainActivity中. 补个图片: 不多说了,直接上代码: CycleWheel

  • Android selector背景选择器的使用详解

    在开发应用中,很多情况下要设计listview或button控件的背景,下面总结一下android的selector的用法:1.在drawable中配置Android的selector.将如下的XML文件保存成你自己命名的.xml文件(比如item_bg.xml),并将该文件放置在drawable文件中,在系统使用时根据ListView中的列表项的状态来使用相应的背景图片. 复制代码 代码如下: <?xml version="1.0" encoding="utf-8&q

  • 基于android背景选择器selector的用法汇总

    一.创建xml文件,位置:drawable/xxx.xml,同目录下记得要放相关图片 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">    <!-- 没有焦点时的背景图片 -->    <item android:dr

  • ImageView 实现Android colorPikcer 选择器的示例代码

    本文介绍了ImageView 实现Android colorPikcer 选择器的示例代码,分享给大家,具体如下: Android colorPikcer 选择器 环形的ColorPicker,主要思路是: Color 选在放在ImageView 的background上面,根据点击的位置判断选择的颜色. 重写onTouch,在onTouch 里面判断点击点的颜色. 根据当前选择的颜色设置图片的src. 获取Bitmap 在 ColorPickerView 构造函数中初始化 Bitmap.因为g

  • Android 滚动时间选择的示例代码

    效果图 复制代码直接用!!!! 1.导入依赖 implementation 'com.bigkoo:pickerview:2.1.0' 2.三个bean类 PickerViewData public class PickerViewData implements IPickerViewData { private String content; public PickerViewData(String content) { this.content = content; } public voi

  • Android 曲线图的绘制示例代码

    本文介绍了Android 曲线图的绘制示例代码,分享给大家,具体如下: 效果展示 效果展示.gif 使用方式 // 初始化数据表格相关 with(mTableView) { // 配置坐标系 setupCoordinator("日", "人", /*这里是横坐标的值*/0f, 5f, 10f, 15f, 20f, 25f, 30f) // 添加曲线, 确保纵坐标的数值位数相等 addWave(ContextCompat.getColor(this@MainActiv

  • Android进程间通信实践的示例代码

    本文介绍了Android进程间通信实践的示例代码,分享给大家,具体如下: 因为线程间的内存是共享的,所以它们之间的通信简单,比如可以通过共享变量等方式实现.而进程间想要通信就要麻烦许多了.要想实现进程间通信,我们需要在不同进程之间定义一套它们可以共同理解的接口描述语言,也即 IDL.比较常用的 IDL 有 JSON.Protocol Buffers 等.而 Android 不同进程之间的通信也有个特别的语言,叫 AIDL(Android Interface Definition Language

  • 基于WPF实现用户头像选择器的示例代码

    目录 实现思路 核心代码 参考资料 实现思路 制作一个用户头像选择器仿 WeGame 制作一个用户头像选择Canvas为父控件所实现,展示图片使用Image,Path当作上方的蒙版; Canvas:主要用途方便移动Image,设置ClipToBounds="True"裁剪为一个正方形200x200做为主要展示区域; Image:展示需要裁剪的图片: Path:CombinedGeometry[1]绘制蒙版大小200x200效果如下: 当选择一个本地图片的时候判断宽与高谁更大,谁小就将它

  • Android实现图片压缩示例代码

    核心思想是通过BitmapFactory.Options来缩放图片,主要是用到了它的inSampleSize参数(采样率) 当inSampleSize为1的时候,采样后的图片大小为图片的原始大小: 当inSampleSize为2的时候,采样后的图片的宽和高是原来的1/2,也就是说,它的像素点是原来的1/4,占的内存自然就是原来的1/4了.以此类推. 当inSampleSize小于1的时候,效果和等于1的时候是一样的. 压缩流程如下: 1.BitmapFactory.Options 的inJust

  • android异步生成图片的示例代码

    下面来说说在Android上如果异步生成图片,通过xml布局用View排版好图片样式,在子线程生成一张图片,以满足生成用来分享的图片等需求(生成图片前设置可变元素,如用户的头像,昵称等). 效果 点击按钮生成图片: 特性 通过布局和View的方式设计图片样式. 在子线程中生成和保存图片. 封装好工具类,直接使用即可. 核心代码 private Bitmap createBitmap(View view) { int widthSpec = View.MeasureSpec.makeMeasure

  • vue与bootstrap实现时间选择器的示例代码

    一.下载bootstrap-datetimepicker时间选择器js,css文件. 1. github地址:bootstrap-datetimepicker 2. 官方网站地址:官网bootstrap-datetimepicker地址,有具体的例子与解释 二.在vue项目文件中引入 import './assets/css/bootstrap.min.css' import "./assets/css/bootstrap-datetimepicker.min.css" import

  • Android解析json数据示例代码(三种方式)

    Json数据 复制代码 代码如下: [{"code":"110000","sheng":"11","di":"00","xian":"00","name":"北京市","level":1},{"code":"659004","sheng&q

  • Android支付宝支付的示例代码

    上一篇,我们已经详细讲解了Android微信支付,今天接着为大家带来支付宝支付,支付宝支付相对微信支付要简单一些,吐槽一下,而且支付宝文档确实比微信的文档好了不少,下面开始讲解支付流程. 1.首先给出官方文档的地址 Android集成支付宝流程 2.在开始集成和开发前,首先了解一下常用的接入方式和架构建议: 支付流程.png 在开始下一步之前,给大家看看网上的很多操作. 网上的代码.png 这一大堆代码,后面还有,百来行吧,而且支付宝Demo貌似也是这么干的,估计一些新司机就有点懵逼了,至于吗?

随机推荐