在运行时绘制HSV圆形。

9
我希望我的应用程序中有一个颜色选择器,看起来像这样: 类似于此 我尝试了逐像素填充位图和使用带有drawArc()方法的画布。这两种方法都对性能不利。
有什么想法吗?

为什么颜色轮必须动态生成?为什么不直接使用你问题中显示的PNG图像呢? - mbeckish
不一定非得这样,我只是希望能够动态生成以确保坐标与颜色正确对应。 - Sergey Dmitriev
4
这是很多安卓程序员在尝试制作颜色选择器时的一个完全有效的编程问题。我非常不同意关闭它的版主们。这并不是一个狭窄的情况。你可以在http://www.buzzingandroid.com/2012/11/hsv-color-picker-dialog找到一个颜色选择器的代码示例。 - ilomambo
1个回答

4

这可能不完全是你想要的(与颜色、饱和度等相关),但这里有个东西开始看起来像你想要的样子...

import android.graphics.*;
import android.graphics.drawable.Drawable;

public class HSV_Circle extends Drawable {
    Paint p = new Paint();

    @Override
    public void draw(Canvas canvas) {
        int width = canvas.getWidth();
        int height = canvas.getHeight();
        int min = Math.min(width,height);

        RadialGradient radial_gradient = new RadialGradient(width/2, height/2, min/2, 0xFFFFFFFF,
            0x00FFFFFF, android.graphics.Shader.TileMode.CLAMP);

        int colors[] = new int[13];
        float hsv[] = new float[3];
        hsv[1]=1;
        hsv[2]=1;
        for (int i=0; i<12; i++) {
            hsv[0] = (360 / 12) * i;
            colors[i] = Color.HSVToColor(hsv);
        }
        colors[12] = colors[0];

        SweepGradient sweep_gradient = new SweepGradient(width/2, height/2, colors, null);

        ComposeShader shader = new ComposeShader(sweep_gradient, radial_gradient, PorterDuff.Mode.SRC_OVER);

        p.setDither(true);
        p.setShader(shader);

        canvas.drawCircle(width/2, height/2, min/2, p);
    }

    @Override
    public void setAlpha(int i) {
    }

    @Override
    public void setColorFilter(ColorFilter colorFilter) {
    }

    @Override
    public int getOpacity() {
        return PixelFormat.OPAQUE;
    }
}

就像我说的那样,我不确定颜色与位置的匹配情况。我认为色调还可以,但饱和度可能需要一些微调/思考...至少,速度很快.... :) - Matthieu
请注意,这在硬件加速视图中不起作用。只会绘制径向渐变。您必须使用"View.setLayerType"方法禁用硬件加速。 - David Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接