प्रोग्राम योग्य आकार सेट करें


90

छवियां (चिह्न) लगभग एक ही आकार में आते हैं, लेकिन बटन को समान ऊंचाई पर बने रहने के लिए मुझे उनका आकार बदलने की आवश्यकता है।

मैं यह कैसे करु?

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

क्या आपने ड्रा करने योग्य (बिटमैप) का आकार बदलने का तरीका ढूंढ लिया है?
ज़ेलिमिर

2
रास्ता देर से, लेकिन सोच क्यों तुम फोन नहीं कर रहे थे setCompoundDrawables()? आंतरिक, एंड्रॉइड के भीतर अन्य स्थानों में मूल छवि आकार को संदर्भित करता है, जैसे Drawable.getIntrinsicHeight()
विलियम टी। मल्लार्ड

जवाबों:


159

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"

मेरे लिए यहाँ समस्या यह है कि यह एक
आकर्षक

8
BitmapDrawable (Bitmap) कंस्ट्रक्टर को पदावनत कर दिया जाता है। उपयोग करें: ड्राएबल डी = नया बिटमैपड्राएबेबल (getResources), Bitmap.createScaledBitmap (बिटमैप, 50, 50, सच));
एंडी

1
यह ड्राबेल को स्केल करते समय पिक्सेलेशन बनाएगा। भले ही वे वेक्टर ड्रॉबल हों।
साकेत बेर्डे

शायद उपयोग करना चाहते हैंContextCompat.getDrawable(context, resourceid)
पियरे

एक साइड नोट के रूप में, आप StateListDrawableप्रोग्रामेटिक रूप से बना सकते हैं और addStateउस "कन्वर्ट किए गए ड्रॉबल" के साथ विधि का उपयोग कर सकते हैं ताकि यह selector's itemउपयोग किए गए आकार के लिए काम कर सके setPasswordVisibilityToggleDrawable
फल

31

setBounds()50x50 आकार के उपयोग के साथ आकार निर्दिष्ट करें

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

सार्वजनिक शून्य सेटबॉइड (इंट लेफ्ट, इंट टॉप, इंट राइट, इंट बॉटम)


2
सेटबाउंड्स के बाद आकार समान रहता है। क्या कुछ अमान्य हो सकते हैं?
कोस्तादीन

6
दरअसल, सेटबाउंड्स ग्रेडिएंटड्रॉबल्स के लिए काम करता है। यह सिर्फ इमेज ड्राबल्स के लिए काम नहीं करता है।
ग्रैग्म जूल

मेरे लिए यह तब काम आया जब मैं छवि को एक बटन में रख रहा था, लेकिन तब नहीं जब मैंने इसे एक ImageView में डाला। ओपी एक बटन का उपयोग कर रहा था, लेकिन setCompoundDrawables()फ़ंक्शन के आंतरिक स्वाद को भी बुला रहा था ।
विलियम टी। मल्लार्ड

@ स्पेक्ट्रम दिलचस्प है, आप सेटसाइज़ () का उपयोग करके ग्रेडिएंड्रावेबल के लिए आकार भी सेट कर सकते हैं।
6

12

लागू करने से पहले .setBounds (..) वर्तमान ड्राएबल को स्केलड्रेबल में बदलने का प्रयास करें

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

उसके बाद

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

काम करेगा


2
इस कदम की आवश्यकता क्यों है? ScaleDrawableनॉन रैपिंग के विकल्प में क्या रैपिंग है ?
अजीजबेकियन

10

मेरे पास यह खोदने का समय नहीं था कि सेटबाउंड्स () पद्धति बिटमैप पर क्यों अपेक्षित रूप से काम नहीं कर रही है, लेकिन मेरे पास थ्रोबड-थ्रू समाधान बहुत कम है।

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

परिणाम

पहले: के यहाँ छवि विवरण दर्ज करें बाद:यहाँ छवि विवरण दर्ज करें


कैसे पैडिंग जोड़ने के लिए छोड़ दिया?
रीगन 29

8

काम में लाना

textView.setCompoundDrawablesWithIntrinsicBounds()

आपका minSdkVersion build.gradle में 17 होना चाहिए

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

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

mPlatform क्या है?
बटशेवा

@batsheva यह केवल कुछ है जो वह dp से px में रूपांतरण के लिए उपयोग करता है ...
android डेवलपर

2

jkhouw1 उत्तर सही है, लेकिन इसमें कुछ विवरणों का अभाव है, नीचे देखें:

यह कम से कम एपीआई> 21 के लिए बहुत आसान है। मान लें कि हमारे पास संसाधनों से वेक्टरड्राएबल है (इसे पुनः प्राप्त करने के लिए उदाहरण कोड):

val iconResource = context.resources.getIdentifier(name, "drawable", context.packageName)
val drawable = context.resources.getDrawable(iconResource, null)

उस वेक्टरड्राइव के लिए बस वांछित आकार निर्धारित करें:

drawable.setBounds(0, 0, size, size)

और बटन में दिखाने योग्य:

button.setCompoundDrawables(null, drawable, null, null)

बस। लेकिन setCompoundDrawables (आंतरिक संस्करण नहीं) का उपयोग करने के लिए ध्यान दें!


0

आप दृश्य प्रकार का उपवर्ग बना सकते हैं, और 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);
    }

}

(ध्यान दें कि मैंने दो बार डब्ल्यू का उपयोग किया था, एच का नहीं, क्योंकि इस मामले में मैं टेक्स्ट के ऊपर आइकन डाल रहा था, और इस तरह से टेक्स्ट की दृष्टि के समान आइकन नहीं होना चाहिए)

इसे बैकग्राउंड ड्रॉबल्स पर लागू किया जा सकता है, या कुछ और जिसे आप अपने दृश्य आकार के सापेक्ष बदलना चाहते हैं। onSizeChanged () को पहली बार व्यू कहा जाता है, इसलिए आपको आकार को प्रारंभ करने के लिए किसी विशेष मामलों की आवश्यकता नहीं है।


0

आप कोशिश कर सकते हैं button.requestLayout()। जब पृष्ठभूमि का आकार बदल जाता है, तो इसे हटाने और लेआउट करने की आवश्यकता होती है, लेकिन यह ऐसा नहीं करेगा


0

LayerDrawable का उपयोग करके इस कार्य को प्राप्त करें:

fun getResizedDrawable(drawable: Drawable, scale: Float) =
    LayerDrawable(arrayOf(drawable)).also { it.setLayerSize(0, (drawable.intrinsicWidth * scale).toInt(), (drawable.intrinsicHeight * scale).toInt()) }

fun getResizedDrawable(drawable: Drawable, scalex: Float, scaleY: Float) =
    LayerDrawable(arrayOf(drawable)).also { it.setLayerSize(0, (drawable.intrinsicWidth * scalex).toInt(), (drawable.intrinsicHeight * scaleY).toInt()) }

fun getResizedDrawableUsingSpecificSize(drawable: Drawable, newWidth: Int, newHeight: Int) =
    LayerDrawable(arrayOf(drawable)).also { it.setLayerSize(0, newWidth, newHeight) }

उदाहरण:

val drawable = AppCompatResources.getDrawable(this, android.R.drawable.sym_def_app_icon)!!
val resizedDrawable = getResizedDrawable(drawable, 3f)
textView.setCompoundDrawablesWithIntrinsicBounds(resizedDrawable, null, null, null)
imageView.setImageDrawable(resizedDrawable)

-1

आप LayerDrawable का उपयोग केवल एक लेयर और setLayerInset विधि से कर सकते हैं:

Drawable[] layers = new Drawable[1];
layers[0] = application.getResources().getDrawable(R.drawable.you_drawable);

LayerDrawable layerDrawable = new LayerDrawable(layers);
layerDrawable.setLayerInset(0, 10, 10, 10, 10);

-1

यह सवाल पूछे जाने के बाद से कुछ समय हो गया है
लेकिन अभी भी बहुत से लोगों के लिए यह स्पष्ट नहीं है कि इस सरल कार्य को कैसे किया जाए।

यह उस मामले में बहुत सरल है, जब आप एक TextView (बटन) पर एक यौगिक के रूप में एक ड्रॉबल का उपयोग करते हैं।

तो 2 चीजें आपको करनी हैं:

1. सेट सीमा:

drawable.setBounds(left, top, right, bottom)

2. उचित रूप से ड्रा करने योग्य (आंतरिक सीमा के उपयोग के बिना):

button.setCompoundDrawablesRelative(drawable, null, null, null)
  • Bitmaps का उपयोग करने की कोई आवश्यकता नहीं है
  • कोई वर्कअराउंड जैसे ScaleDrawable ColorDrawableयाLayerDrawable (निश्चित रूप से अन्य प्रयोजनों के लिए क्या बनाया जाता है)
  • कस्टम दराज में कोई ज़रूरत नहीं है!
  • साथ कोई वर्कअराउंड नहीं post
  • यह एक देशी और सरल उपाय है, बस एंड्रॉइड आपको कैसे करने की उम्मीद करता है।

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

मान का उपयोग करें Button.setHeight()या Button.setWeight()सेट करें ।


9
यह सिर्फ बटन की ऊँचाई निर्धारित करता है, न कि खींचने योग्य की ऊँचाई। मैं दराज की चौड़ाई / ऊंचाई सेट करना चाहता हूं (विशेषकर यदि यह सेट बटन की ऊंचाई से बड़ा है)।

21
आप जानते हैं कि आप उत्तर को हटा सकते हैं, क्या नहीं?
इरोहब अल असिमी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.