RadialGradient в пользовательском представлении - PullRequest
1 голос
/ 01 апреля 2012

Я пытаюсь сделать палитру цветов, которая позволяет пользователям выбирать цвет, просто используя сенсорный ввод. Мой оттенок дает оттенок цветному кругу, а оттенок насыщенности - я белый из центра. SweepGradient не нуждается в радиусе, но радиальный градиент требует его. Однако я вызываю это во время создания, когда оно не может получить фактические значения ширины и высоты. Вместо этого он принимает указанные значения. Есть ли промежуточный шаг, где радиус может быть установлен при наличии этой информации? Или я должен попробовать другой подход?

private Paint mPaint;
private int[] mColors;

private int viewWidth = 120;
private int viewHeight = 120;
private int centerX = 60;
private int centerY = 60;
private int padding = 10;

public ColorWheelView(Context context) {
    super(context);
    onInitialize();
    // TODO Auto-generated constructor stub
}


private void onInitialize()
{

    mColors = new int[] {
            0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00,
            0xFFFFFF00, 0xFFFF0000
        };

        Shader totalShade = new SweepGradient(0, 0, mColors, null);
        Shader hueShade = new SweepGradient(0, 0, mColors, null);
        Shader saturationShade = new RadialGradient(0, 0, (float)viewWidth-padding, 0xFFFFFFFF, 0x00FFFFFF, Shader.TileMode.CLAMP);
        //Shader valueShade;

        totalShade = new ComposeShader(hueShade, saturationShade, PorterDuff.Mode.SCREEN);

        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setShader(totalShade);
        mPaint.setStyle(Paint.Style.FILL);
}

protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) 
{
    super.onSizeChanged(xNew, yNew, xOld, yOld);
    viewWidth = xNew;
    viewHeight = yNew;
    centerX = viewWidth / 2;
    centerY = viewHeight / 2;
}

protected void onLayout(boolean changed, int left, int top, int right, int bottom)
{
    super.onLayout(changed, left, top, right, bottom);
    viewWidth = right - left;
    viewHeight = bottom - top;
    centerX = viewWidth / 2;
    centerY = viewHeight / 2;
}

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int measuredHeight = measureHeight(heightMeasureSpec);
    int measuredWidth = measureWidth(widthMeasureSpec);
    setMeasuredDimension(measuredWidth, measuredHeight);
}

Если это поможет понять, чего я добиваюсь, я пытаюсь сделать это представление доступным для использования на экранах разных размеров. Вот почему мне нужна информация с устройства.

1 Ответ

0 голосов
/ 08 июня 2012

Лучше всего вызывать это в onLayout, так как обычно это гарантируется при любом изменении размера или ориентации.Ранее я не получал желаемых значений, но это потому, что я унаследовал от базового класса, отличного от класса Android.view.View.

...