2012-04-01 4 views
1

Ich versuche, einen Farbwähler zu machen, der den Benutzern erlaubt, Farbe zu wählen, einfach durch eine Berührungseingabe. Mein hueShade gibt dem Farbkreis den Farbton, während der saturationShade mir den Wittling aus der Mitte gibt. Der SweepGradient benötigt keinen Radius, aber der Radialverlauf erfordert dies. Allerdings rufe ich dies zum Zeitpunkt der Erstellung an, wenn es die tatsächlichen Werte der Breite und Höhe nicht erhalten kann. Stattdessen nimmt es die angegebenen Werte auf. Gibt es einen Zwischenschritt, in dem der Radius eingestellt werden kann, wenn diese Informationen verfügbar sind? Oder sollte ich einen anderen Ansatz versuchen?RadialGradient in der benutzerdefinierten Ansicht

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

Wenn es hilft, um herauszufinden, was ich zu erreichen, ich versuche diese Ansicht zur Verfügung zu stellen für unterschiedliche Größe Bildschirme zu verwenden. Deshalb brauche ich die Informationen vom Gerät.

+0

Problem gelöst. Gab es eine andere Funktion, die aufgerufen wurde, wenn onStart() aufgerufen wurde. – Arzeimuth

Antwort

0

Am besten rufen Sie dies in onLayout auf, da es normalerweise garantiert ist, wenn Änderungen in Größe oder Ausrichtung vorgenommen werden. Ich habe zuvor keine gewünschten Werte erhalten, aber das lag daran, dass ich von einer anderen Basisklasse als der Android.view.View-Klasse geerbt habe.