2011-01-05 17 views
67

Le immagini (icone) hanno approssimativamente le stesse dimensioni, ma ho bisogno di ridimensionarle in modo che i pulsanti rimangano alla stessa altezza.Imposta dimensioni disegnabili a livello di programmazione

Come posso fare?

Button button = new Button(this); 
button.setText(apiEventObject.getTitle()); 
button.setOnClickListener(listener); 

/* 
* set clickable id of button to actual event id 
*/ 
int id = Integer.parseInt(apiEventObject.getId()); 
button.setId(id); 

button.setLayoutParams(new LayoutParams(
     android.view.ViewGroup.LayoutParams.FILL_PARENT, 
     android.view.ViewGroup.LayoutParams.WRAP_CONTENT)); 

Drawable drawable = LoadImageFromWebOperations(apiSizeObject.getSmall()); 
//?resize drawable here? drawable.setBounds(50, 50, 50, 50); 
button.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null); 
+0

Hai trovato il modo in cui ridimensionare il disegno (bitmap)? – Zelimir

+2

In ritardo, ma chiedendosi perché non stavi chiamando 'setCompoundDrawables()'? Intrinseca si riferisce alla dimensione originale dell'immagine in altri luoghi all'interno di Android, ad es. 'Drawable.getIntrinsicHeight()'. –

risposta

-32
Button button = new Button(this); 
Button = (Button) findViewById(R.id.button01); 

Usa Button.setHeight() o Button.setWeight() e impostare un valore.

+9

che imposta solo l'altezza del pulsante, non l'altezza del drawable. Voglio impostare la larghezza/altezza del drawable (specialmente se è più grande dell'altezza del pulsante impostato). –

+14

Sai che puoi cancellare la risposta, vero? –

27

Specifica il formato con setBounds(), ossia per un uso dimensioni 50x50

drawable.setBounds(0, 0, 50, 50); 

setBounds public void (int sinistra, int top, int destra, int inferiore)

+5

Aveva lo stesso problema, e questo non ha funzionato per me. –

+1

Dopo che le dimensioni di SetBounds rimangono invariate. Potrebbero essere necessari alcuni invalidi? – Kostadin

+1

stesso qui, rimane lo stesso – noloman

117

Procedimento setBounds() non funziona per ogni tipo di contenitore (ha funzionato per alcuni dei miei ImageView, tuttavia).

provare il metodo seguito per scalare la drawable stesso:

// Read your drawable from somewhere 
Drawable dr = getResources().getDrawable(R.drawable.somedrawable); 
Bitmap bitmap = ((BitmapDrawable) dr).getBitmap(); 
// Scale it to 50 x 50 
Drawable d = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap, 50, 50, true)); 
// Set your new, scaled drawable "d" 
+0

per me il problema qui è che disegna un rettangolo bianco attorno all'immagine estraibile – noloman

+8

Il costruttore BitmapDrawable (Bitmap) è deprecato. Usa: Drawable d = new BitmapDrawable (getResources(), Bitmap.createScaledBitmap (bitmap, 50, 50, true)); – Andy

+1

Ciò creerà la pixelizzazione durante il ridimensionamento dei drawable. Anche se sono vettoriali drawable. –

1

è possibile creare una sottoclasse del tipo di vista, e l'override del metodo onSizeChanged.

volevo avere ridimensionamento drawable composto sul mio punto di vista del testo che non mi richiedono di pasticciare con la definizione drawable bitmap in XML, ecc e lo ha fatto in questo modo:

public class StatIcon extends TextView { 

    private Bitmap mIcon; 

    public void setIcon(int drawableId) { 
    mIcon = BitmapFactory.decodeResource(RIApplication.appResources, 
      drawableId); 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     if ((w > 0) && (mIcon != null)) 
      this.setCompoundDrawablesWithIntrinsicBounds(
       null, 
       new BitmapDrawable(Bitmap.createScaledBitmap(mIcon, w, w, 
         true)), null, null); 

     super.onSizeChanged(w, h, oldw, oldh); 
    } 

} 

(Si noti che Ho usato w due volte, non h, perché in questo caso stavo mettendo l'icona sopra il testo, e quindi l'icona non dovrebbe avere la stessa altezza della vista testo)

Questo può essere applicato ai drawable in background, o qualsiasi altra cosa che desideri ridimensionare in relazione alle dimensioni della tua vista. onSizeChanged() viene chiamato la prima volta che viene creata la vista, quindi non è necessario alcun caso speciale per inizializzare la dimensione.

13

applicare Prima .setBounds (..) cercare di convertire Drawable corrente in ScaleDrawable

drawable = new ScaleDrawable(drawable, 0, width, height).getDrawable(); 

dopo che

drawable.setBounds(0, 0, width, height); 

funzionerà

3

utilizzare il metodo POST per ottenere l'effetto desiderato :

{your view}.post(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      Drawable image = context.getResources().getDrawable({drawable image resource id}); 
      image.setBounds(0, 0, {width amount in pixels}, {height amount in pixels}); 
      {your view}.setCompoundDrawables(image, null, null, null); 
     } 
    }); 
3

Probabilmente un po 'tardi. Ma ecco la soluzione che alla fine ha funzionato per me in ogni situazione.

L'idea è quella di creare un drawable personalizzato con dimensione intrinica fissa e passare il lavoro di disegno sul drawable originale.

Drawable icon = new ColorDrawable(){ 
     Drawable iconOrig = resolveInfo.loadIcon(packageManager); 

     @Override 
     public void setBounds(int left, int top, int right, int bottom){ 
      super.setBounds(left, top, right, bottom);//This is needed so that getBounds on this class would work correctly. 
      iconOrig.setBounds(left, top, right, bottom); 
     } 

     @Override 
     public void draw(Canvas canvas){ 
      iconOrig.draw(canvas); 
     } 

     @Override 
     public int getIntrinsicWidth(){ 
      return mPlatform.dp2px(30); 
     } 

     @Override 
     public int getIntrinsicHeight(){ 
      return mPlatform.dp2px(30); 
     } 
    }; 
1

Per utilizzare

textView.setCompoundDrawablesWithIntrinsicBounds() 

tuo minSdkVersion dovrebbe essere 17 in build.gradle

defaultConfig { 
    applicationId "com.example..." 
    minSdkVersion 17 
    targetSdkVersion 25 
    versionCode 1 
    versionName "1.0" 
} 

Per cambiare dimensione drawable:

TextView v = (TextView)findViewById(email); 
    Drawable dr = getResources().getDrawable(R.drawable.signup_mail); 
    Bitmap bitmap = ((BitmapDrawable) dr).getBitmap(); 
    Drawable d = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap, 80, 80, true)); 

    //setCompoundDrawablesWithIntrinsicBounds (image to left, top, right, bottom) 
    v.setCompoundDrawablesWithIntrinsicBounds(d,null,null,null); 
2

non ho avuto il tempo per capire perché il metodo setBounds() non funziona il bitmap drawable come previsto, ma ho poco ottimizzato @ soluzione androbean-studio a fare quello che dovrebbero fare setBounds ...

/** 
* Created by ceph3us on 23.05.17. 
* file belong to pl.ceph3us.base.android.drawables 
* this class wraps drawable and forwards draw canvas 
* on it wrapped instance by using its defined bounds 
*/ 
public class WrappedDrawable extends Drawable { 

    private final Drawable _drawable; 
    protected Drawable getDrawable() { 
     return _drawable; 
    } 

    public WrappedDrawable(Drawable drawable) { 
     super(); 
     _drawable = drawable; 
    } 

    @Override 
    public void setBounds(int left, int top, int right, int bottom) { 
     //update bounds to get correctly 
     super.setBounds(left, top, right, bottom); 
     Drawable drawable = getDrawable(); 
     if (drawable != null) { 
      drawable.setBounds(left, top, right, bottom); 
     } 
    } 

    @Override 
    public void setAlpha(int alpha) { 
     Drawable drawable = getDrawable(); 
     if (drawable != null) { 
      drawable.setAlpha(alpha); 
     } 
    } 

    @Override 
    public void setColorFilter(ColorFilter colorFilter) { 
     Drawable drawable = getDrawable(); 
     if (drawable != null) { 
      drawable.setColorFilter(colorFilter); 
     } 
    } 

    @Override 
    public int getOpacity() { 
     Drawable drawable = getDrawable(); 
     return drawable != null 
       ? drawable.getOpacity() 
       : PixelFormat.UNKNOWN; 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     Drawable drawable = getDrawable(); 
     if (drawable != null) { 
      drawable.draw(canvas); 
     } 
    } 

    @Override 
    public int getIntrinsicWidth() { 
     Drawable drawable = getDrawable(); 
     return drawable != null 
       ? drawable.getBounds().width() 
       : 0; 
    } 

    @Override 
    public int getIntrinsicHeight() { 
     Drawable drawable = getDrawable(); 
     return drawable != null ? 
       drawable.getBounds().height() 
       : 0; 
    } 
} 

di utilizzo:

// get huge drawable 
final Drawable drawable = resources.getDrawable(R.drawable.g_logo); 
// create our wrapper   
WrappedDrawable wrappedDrawable = new WrappedDrawable(drawable); 
// set bounds on wrapper 
wrappedDrawable.setBounds(0,0,32,32); 
// use wrapped drawable 
Button.setCompoundDrawablesWithIntrinsicBounds(wrappedDrawable ,null, null, null); 

risultati

prima: enter image description here dopo: enter image description here

Problemi correlati