2011-01-05 3 views
67

Изображения (значки) имеют примерно одинаковый размер, но мне нужно изменить их размер, чтобы кнопки оставались одинаковой высоты.Программный программный размер с выдвижным размером

Как это сделать?

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

Вы нашли способ изменения размера рисунка (растрового изображения)? – Zelimir

+2

Поздно, но интересно, почему вы не вызывали 'setCompoundDrawables()'? Intrinsic относится к исходному размеру изображения в других местах Android, например. 'Drawable.getIntrinsicHeight()'. –

ответ

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

Использование Button.setHeight() или Button.setWeight() и установить значение.

+9

, который просто устанавливает высоту кнопки, а не высоту рисунка. Я хочу установить ширину/высоту рисунка (особенно если она больше высоты установленной кнопки). –

+14

Вы знаете, что можете удалить ответ, не так ли? –

27

Укажите размер с setBounds(), то есть для размера 50х50

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

общественных недействительные SetBounds (INT влево, внутр сверху, внутр право, внутр снизу)

+5

Имел ту же проблему, и это не сработало для меня. –

+1

После того, как размер SetBounds останется прежним. Может быть какое-то недействительное необходимо? – Kostadin

+1

То же самое здесь, он остается тем же – noloman

117

setBounds() метод не работает для каждого типа контейнера (например, работала для некоторых из моих ImageView).

Попробуйте метод ниже, чтобы масштабировать рисуем себя:

// 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

для меня проблема здесь в том, что она рисует белый прямоугольник вокруг рисованного изображения. – noloman

+8

Конструктор BitmapDrawable (Bitmap) устарел. Use: Drawable d = new BitmapDrawable (getResources(), Bitmap.createScaledBitmap (bitmap, 50, 50, true)); – Andy

+1

Это создаст пикселизацию при масштабировании чертежей. Даже если они являются векторными чертежами. –

1

Вы можете создать подкласс типа представления, и переопределить метод onSizeChanged.

Я хотел бы иметь масштабирование составной на моем вводимый коэффициент взглядах текста, которые не требуют мне возиться с определением растрового в XML вводимого коэффициента, и т.д., и сделал это так:

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

} 

(Обратите внимание, что Я использовал w дважды, а не h, так как в этом случае я помещал значок над текстом, и, следовательно, значок не должен иметь ту же высоту, что и текстовый вид).

Это может быть применено к рисункам фона, или что-либо еще, что вы хотите изменить размер относительно размера вашего вида. onSizeChanged() вызывается при первом просмотре представления, поэтому вам не нужны специальные случаи для инициализации размера.

13

Перед нанесение .setBounds (..) попытаться преобразовать текущую вытяжку в ScaleDrawable

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

после этого

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

будет работать

3

Используйте метод поста для достижения желаемого эффекта :

{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

Возможно, немного поздно. Но вот решение, которое, наконец, работало для меня в любой ситуации.

Идея состоит в том, чтобы создать пользовательский чертеж с фиксированным внутренним размером и передать задание на чертеж исходному чертежу.

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

Чтобы использовать

textView.setCompoundDrawablesWithIntrinsicBounds() 

Ваш minSdkVersion должен быть 17 в build.gradle

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

Чтобы изменить вытяжке размер:

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

я не успел выкопать, почему метод setBounds() не работает на битме ар вытяжке, как и ожидалось, но я немного подправили @ androbean-студии решение делать то, что должен делать 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; 
    } 
} 

использования:

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

результаты

перед: enter image description here после: enter image description here