2012-10-31 5 views
7

Ich muss eine Suchleiste erstellen, wo ich fast alles programmgesteuert ändern kann. Und jetzt habe ich ein Problem, den Daumen und die Balkengröße zu ändern. Alles funktioniert gut, wenn der Balken größer oder genauso groß wie der Daumen ist, aber wenn der Daumen größer ist als der Balken, kann ich nicht erreichen, dass der gesamte Daumen mit der richtigen Größe des Balkens angezeigt wird.Ändern Sie die Größe der Suchleiste programmgesteuert, aber kann nicht den Daumen größer als die Leiste sein

Hier ist mein Code, um den Daumen zu erstellen:

public void setSeekBarThumb(int width, int height, int rColor, int gColor, int bColor){ 

     ShapeDrawable thumb = new ShapeDrawable(new OvalShape()); 
     thumb.setIntrinsicHeight(height); 
     thumb.setIntrinsicWidth(width); 
     thumb.setBounds(new Rect(0, 0, width, height)); 


     StateListDrawable states = new StateListDrawable(); 
     states.addState(new int[] {android.R.attr.state_pressed},thumb );//add to the state list with the state pressed 

     thumb = new ShapeDrawable(new OvalShape()); 
     thumb.setIntrinsicHeight(height); 
     thumb.setIntrinsicWidth(width); 
     thumb.setBounds(new Rect(0, 0, width, height)); 

     states.addState(new int[] { },thumb);//add to the state list with no state 

     seekbar.setThumb(states); 
     seekbar.setThumbOffset(0); 
    } 

heren meinen Code, die Bar zu erstellen:

public void setSeekBarProgress(int width, int height, int rColor, int gColor, int bColor){ 
     GradientDrawable shape = new GradientDrawable(Orientation.BOTTOM_TOP, new int[]{Color.WHITE,Color.rgb(rColor, gColor, bColor)}); 
     shape.setCornerRadius(50); 
     shape.setSize(width, height); 
     shape.setBounds(0, 0, width, height); 
     ClipDrawable clip = new ClipDrawable(shape, Gravity.LEFT,ClipDrawable.HORIZONTAL); 

     shape = new GradientDrawable(Orientation.BOTTOM_TOP, new int[]{Color.WHITE, getResources().getColor(R.color.DimGray)}); 
     shape.setCornerRadius(50);//change the corners of the rectangle 
     shape.setSize(width, height); 
     shape.setBounds(0, 0, width, height); 

     LayerDrawable mylayer= new LayerDrawable(new Drawable[]{shape, clip,}); 

     seekbar.setProgressDrawable(mylayer); 
     seekbar.setProgress(50); 

    } 

Hier mein Code ist alles zusammen zu stellen, wo ich die Höhe des Satz Suchleiste:

public MySeekBar(Activity activity, AbsoluteLayout ParentLayout, SeekBarParameters parameters) 
    {   
     super(activity.getApplicationContext()); 



     seekbar =(SeekBar)activity.getLayoutInflater().inflate(R.layout.horizontal_seek_bar, ParentLayout,false); 
     seekbar.setMax(100);  
     setSeekBarThumb(parameters.widthThumb, parameters.heightThumb,0,100,0); 
     setSeekBarProgress(parameters.width, parameters.height,255,69,0); 

     int drawHeight; 
     if(parameters.height>parameters.heightThumb) drawHeight=parameters.height; 
     else drawHeight=parameters.heightThumb; 

     AbsoluteLayout.LayoutParams params = new AsoluteLayout.LayoutParams(parameters.width,drawHeight,parameters.xPosition, parameters.yPosition); 
     ParentLayout.addView(seekbar, params);      

    } 

Der XML-Code, wo ich die Bar aufpumpen aus:

Um die Größe der Suchleiste zu ändern, benutze ich ParentLayout.addView (seekbar, params).
Wenn ich die Ansicht hinzufüge, wenn ich die Höhe verwende, die ich zur Leiste haben möchte, wird der Daumen geschnitten. Wenn ich die Höhe des Daumens benutze, erreicht der Balken die gleiche Höhe des Daumens. Android ändert die Größe der Leiste auf die Größe, die ich zum Hinzufügen der Ansicht verwende.
Ich habe versucht, die Größe der GradientDrawable, die die Leiste mit s hape.setSize(width, height) ist, versuchte ich auch shape.setBounds(0, 0, width, height), und ich habe versucht, ein anderes Bild mit der richtigen Größe und Hinzufügen zu der LayerDrawable Mylayer. Aber nichts hat funktioniert.

Wenn Sie dies über XML erstellen, können Sie paddingTop und paddingBottom verwenden, um die Leiste auf die richtige Größe zu bringen. Aber ich weiß nicht, wie dies mit dem GradientDrawable programmatisch zu tun ist.

Antwort

15

gut, schade, es gab keine Antworten, aber ich konnte die Frage selbst beantworten. Die Antwort lautet InsetDrawable. Sie müssen das eine der Zeichen des Balkens in ein InsetDrawable setzen.

Das ist der Code:

public void setSeekBarProgress(int width, int height, int rColor, int gColor, int bColor){ 
     GradientDrawable shape2 = new GradientDrawable(Orientation.BOTTOM_TOP, new int[]{Color.WHITE,Color.rgb(rColor, gColor, bColor)}); 
     shape2.setCornerRadius(50);      
     ClipDrawable clip = new ClipDrawable(shape2, Gravity.LEFT,ClipDrawable.HORIZONTAL); 

     GradientDrawable shape1 = new GradientDrawable(Orientation.BOTTOM_TOP, new int[]{Color.WHITE, getResources().getColor(R.color.DimGray)}); 
     shape1.setCornerRadius(50);//change the corners of the rectangle  
     InsetDrawable d1= new InsetDrawable(shape1,5,5,5,5);//the padding u want to use   


     LayerDrawable mylayer = new LayerDrawable(new Drawable[]{d1,clip}); 


     seekbar.setProgressDrawable(mylayer); 

     seekbar.setProgress(50); 

    } 

Ich hoffe, das jemand anderes mit dem gleichen Problem helfen kann.

+0

guten job n Danke –