2012-04-01 4 views
1

Я пытаюсь сделать подборщик цветов, который позволяет пользователям выбирать цвет, просто используя сенсорный ввод. Мой hueShade дает оттенок цветовому кругу, в то время как saturationShade дает me whiting out of the center. SweepGradient не нуждается в радиусе, но радиальный градиент этого требует. Тем не менее, я называю это во время создания, когда он не может получить фактические значения ширины и высоты. Вместо этого он поднимает указанные значения. Есть ли промежуточный шаг, когда радиус может быть установлен, когда эта информация доступна? Или я должен попробовать другой подход?RadialGradient в пользовательском представлении

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

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

+0

Проблема решена. Дала ему еще одну функцию, которая вызывалась при вызове onStart(). – Arzeimuth

ответ

0

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

Смежные вопросы