颜色选择器

简介

基于SeekBar控件打造自定义颜色选择器,可以选择黑、白、赤、橙、黄、绿、青、蓝、紫以及它们之间的颜色,废话不多说,先上图
在这里插入图片描述

原理

通过设置SeekBar的setProgressDrawable方法将颜色值与拖动条绑定,再监听setOnSeekBarChangeListener实时获取颜色值,部分代码如下

xml中定义seekbar
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <SeekBar
        android:id="@+id/sb_color"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="15dp"
        android:max="100"
        android:maxHeight="3dp"
        />

    <com.lonelypluto.colorpickerdemo.ColorSizePreView
        android:id="@+id/colorsizepreview"
        android:layout_width="@dimen/color_size_preview_width"
        android:layout_height="@dimen/color_size_preview_height"
        />

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="选择的颜色"
        android:textSize="20sp"
        />
</LinearLayout>
activity中
public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();
    private SeekBar sb_colorPicker;// 拖动条
    private ColorSizePreView colorSizePreView;// 预览图
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    private void initView(){

        sb_colorPicker = (SeekBar)findViewById(R.id.sb_color);
        //设置初始值
        sb_colorPicker.setProgress(10);
        Drawable thumb = sb_colorPicker.getThumb();
        thumb.setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);

        colorSizePreView = (ColorSizePreView)findViewById(R.id.colorsizepreview);
        tv = (TextView)findViewById(R.id.tv);

        // seekbar拖动监听事件
        sb_colorPicker.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                float radio = (float) progress / sb_colorPicker.getMax();

                int mColor = ColorPickerGradientUtil.getColor(radio);
                // 设置文字颜色
                tv.setTextColor(Color.parseColor("#"+ColorPickerGradientUtil.getHexString(mColor)));
                // 设置拖动按钮随颜色的改变而改变
                Drawable thumb = sb_colorPicker.getThumb();
                thumb.setColorFilter(mColor, PorterDuff.Mode.SRC_IN);
                // 设置预览view颜色
                colorSizePreView.setPaintColor(mColor);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

        ShapeDrawable.ShaderFactory shaderFactory = new ShapeDrawable.ShaderFactory() {
            @Override
            public Shader resize(int width, int height) {
                LinearGradient linearGradient = new LinearGradient(0, 0, width, height,
                        ColorPickerGradientUtil.PICKCOLORBAR_COLORS, ColorPickerGradientUtil.PICKCOLORBAR_POSITIONS, Shader.TileMode.REPEAT);
                return linearGradient;
            }
        };

        PaintDrawable paint = new PaintDrawable();
        paint.setShape(new RectShape());
        paint.setCornerRadius(10);
        paint.setShaderFactory(shaderFactory);
        sb_colorPicker.setProgressDrawable(paint);
    }
}

工具类
public class ColorPickerGradientUtil {
    //设置的颜色
    public static final int[] PICKCOLORBAR_COLORS = new int[]{0xFFFFFFFF,0xFFFF3030, 0xFFF4A460,
            0xFFFFFF00, 0xFF66CD00,
            0xFF458B00, 0xFF0000EE,
            0xFF912CEE,0xFF000000};
    //每个颜色的位置
    public static final float[] PICKCOLORBAR_POSITIONS = new float[]{0f, 0.1f, 0.2f, 0.3f, 0.5f, 0.65f,0.8f,0.9f,1f};

    private static int[] mColorArr = PICKCOLORBAR_COLORS;
    private static float[] mColorPosition = PICKCOLORBAR_POSITIONS;

    public ColorPickerGradientUtil(int[] colorArr) {
        this.mColorArr = colorArr;
    }

    public ColorPickerGradientUtil() {
    }

    /**
     * 获取某个百分比位置的颜色
     * @param radio 取值[0,1]
     * @return
     */
    public static int getColor(float radio) {
        int startColor;
        int endColor;
        if (radio >= 1) {
            return mColorArr[mColorArr.length - 1];
        }
        for (int i = 0; i < mColorPosition.length; i++) {
            if (radio <= mColorPosition[i]) {
                if (i == 0) {
                    return mColorArr[0];
                }
                startColor = mColorArr[i - 1];
                endColor = mColorArr[i];
                float areaRadio = getAreaRadio(radio,mColorPosition[i-1],mColorPosition[i]);
                return getColorFrom(startColor,endColor,areaRadio);
            }
        }
        return -1;
    }

    private static float getAreaRadio(float radio, float startPosition, float endPosition) {
        return (radio - startPosition) / (endPosition - startPosition);
    }

    /**
     *  取两个颜色间的渐变区间 中的某一点的颜色
     * @param startColor
     * @param endColor
     * @param radio
     * @return
     */
    private static int getColorFrom(int startColor, int endColor, float radio) {
        int redStart = Color.red(startColor);
        int blueStart = Color.blue(startColor);
        int greenStart = Color.green(startColor);
        int redEnd = Color.red(endColor);
        int blueEnd = Color.blue(endColor);
        int greenEnd = Color.green(endColor);

        int red = (int) (redStart + ((redEnd - redStart) * radio + 0.5));
        int greed = (int) (greenStart + ((greenEnd - greenStart) * radio + 0.5));
        int blue = (int) (blueStart + ((blueEnd - blueStart) * radio + 0.5));
        return Color.argb(255, red, greed, blue);
    }
    /**
     * 将十进制颜色值转换成十六进制。
     */
    public static String getHexString(int value) {
        String hexString = Integer.toHexString(value);
        if (hexString.length() == 1) {
            hexString = "0" + hexString;
        }
        return hexString;
    }
}
预览view
public class ColorSizePreView extends View {

	private int viewWidth;
	private int viewHeigt;
	private int size = 20;// 大小
	private Paint mPaint;// 画笔

	public ColorSizePreView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mPaint = new Paint();
		mPaint.setAntiAlias(true);
		mPaint.setColor(Color.RED);

		viewWidth = (int) getResources()
				.getDimension(R.dimen.color_size_preview_width);
		viewHeigt = (int) getResources().getDimension(
				R.dimen.color_size_preview_height);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		// 绘制成一个圆
		canvas.drawCircle(viewWidth / 2, viewHeigt / 2, size, mPaint);
	}

	/**
	 * 设置view的颜色
	 * @param color
	 */
	public void setPaintColor(int color) {
		mPaint.setColor(color);
		invalidate();
	}

没什么复杂的代码,附上了一些注释,上面可直接复制粘贴,也可直接下载demo
下载地址:ColorPickerDemo
github地址:ColorPickerDemo

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤独的冥王星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值