2012-04-01 3 views
1

J'essaie de faire un sélecteur de couleur qui permet aux utilisateurs de choisir la couleur en ayant simplement une entrée tactile. Mon hueShade donne la teinte au cercle de couleur, tandis que le saturationShade donne moi le merlan hors du centre. Le SweepGradient n'a pas besoin de rayon, mais le Radial Gradient l'exige. Cependant, je l'appelle au moment de la création quand il ne peut pas obtenir les valeurs réelles de la largeur et de la hauteur. Au lieu de cela, il prend les valeurs indiquées. Y a-t-il une étape intermédiaire où le rayon peut être défini quand cette information est disponible? Ou devrais-je essayer une approche différente?RadialGradient dans Custom View

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

Si elle aide à comprendre ce que je réalise, je suis en train de faire ce point de vue disponible à utiliser pour les écrans de taille différente. C'est pourquoi j'ai besoin des informations de l'appareil.

+0

Problème résolu. A donné une autre fonction qui a été appelée quand onStart() a été appelé. – Arzeimuth

Répondre

0

Il est préférable de l'appeler dans onLayout, car il est généralement garanti lorsqu'un changement de taille ou d'orientation est effectué. Je n'obtenais pas les valeurs souhaitées précédemment, mais c'était parce que j'ai hérité d'une classe de base autre que la classe Android.view.View.