Modifica della dimensione del seekbar a livello di programmazione, ma i cant ottenere il pollice, per essere più grande che il bar

Devo fare una seekbar dove posso cambiare quasi tutto a livello di programmazione. E ora sto avendo un problema per modificare il pollice e la dimensione della barra. Tutto funziona alla grande se la barra è più grande o la stessa dimensione come il pollice, ma se il pollice è più grande rispetto al bar, non riesco a visualizzare l’intero pollice con la dimensione corretta del bar.

Ecco il mio codice per creare il pollice:

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

heres il mio codice per creare il bar:

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

  }

Ecco il mio codice per mettere tutto insieme, dove ho impostato l’altezza della barra di ricerca:

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

  }

Il codice XML in cui ho gonfiare il bar da:

  <SeekBar xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:gravity="center"
      android:layout_gravity="center"
      android:max="100"
      android:progress="0"
      android:secondaryProgress="0"
      android:maxHeight="10000dip"
      android:id="@+id/slider"
   />

Per modificare le dimensioni della barra di ricerca io uso ParentLayout.addView(seekbar, params).

Quando l’aggiunta di vista, se io uso l’altezza che voglio il bar, il pollice viene tagliato. Se io uso l’altezza del pollice, la barra arriva alla stessa altezza del pollice. Android ridimensiona il bar per la risoluzione che uso io per aggiungere la vista.

Ho cercato di impostare la dimensione del GradientDrawable che è il bar con shape.setSize(width, height), ho provato anche shape.setBounds(0, 0, width, height), e ho cercato di creare un’altra immagine con la giusta dimensione e aggiungendo alla LayerDrawable mylayer. Ma niente ha funzionato.

Durante la creazione di questo tramite XML è possibile utilizzare paddingTop e paddingBottom per ottenere la barra per la giusta dimensione. Ma non so come fare per il GradientDrawable a livello di programmazione.

InformationsquelleAutor Alan | 2012-10-31



One Reply
  1. 15

    bene, peccato che non c’erano risposte ma sono stato in grado di rispondere alla domanda a me stesso. La risposta è utilizzare InsetDrawable. Devi mettere quello del drawables del bar in una InsetDrawable.

    Questo è il codice:

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

    Spero sia utile a qualcuno con lo stesso problema.

    • buon lavoro n Grazie

Lascia un commento