मैं एक बटन पर कैसे आकर्षित कर सकता हूं?


87

मैं एक बटन को कैसे छोटा कर सकता हूं? आइकन बहुत बड़ा है, वास्तव में बटन की तुलना में अधिक है। यह वह कोड है जिसका मैं उपयोग कर रहा हूं:

    <Button
    android:background="@drawable/red_button"
    android:drawableLeft="@drawable/s_vit"
    android:id="@+id/ButtonTest"
    android:gravity="left|center_vertical" 
    android:text="S-SERIES CALCULATOR"
    android:textColor="@android:color/white"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_marginLeft="25dp"
    android:layout_marginRight="25dp"
    android:drawablePadding="10dp">
    </Button>

ऊपरी यह है कि यह कैसा दिखना चाहिए, निचला यह अभी कैसा दिखता है।

ऊपरी यह है कि यह कैसा दिखना चाहिए, निचला यह अभी कैसे दिखता है।

मैंने यह कोशिश की, लेकिन कोई छवि प्रदर्शित नहीं हुई है। :-(

    Resources res = getResources();
    ScaleDrawable sd = new ScaleDrawable(res.getDrawable(R.drawable.s_vit), 0, 10f, 10f);
    Button btn = (Button) findViewById(R.id.ButtonTest);
    btn.setCompoundDrawables(sd.getDrawable(), null, null, null);

बेहतर होगा कि आप जो प्राप्त कर रहे हैं उसकी एक छवि अपलोड करें और आप क्या करने की कोशिश कर रहे हैं। धन्यवाद।
ललित पोपटानी

आप अपने कस्टम बटन को ड्राबल्स के आकार को परिभाषित करने के लिए परिभाषित कर सकते हैं। मेरा जवाब यहाँ देखें stackoverflow.com/a/31916731/2308720
Oleksandr

मुझे पता है कि यह 2011 से है ... लेकिन मैं वास्तव में बटन की सीमा से कैमरे को तोड़ने के साथ बटन के लुक को पसंद करता हूं - मैंने इसे वैसे ही छोड़ दिया होगा जैसे ... बस ':)
किलार्कोवुक

जवाबों:


70

आपको एक ImageButton का उपयोग करना चाहिए और छवि को निर्दिष्ट करना चाहिए android:srcऔर इसमें सेट android:scaletypeकरना होगाfitXY


कोड में स्केलेबल ड्रॉबल सेट करना

Drawable drawable = getResources().getDrawable(R.drawable.s_vit);
drawable.setBounds(0, 0, (int)(drawable.getIntrinsicWidth()*0.5), 
                         (int)(drawable.getIntrinsicHeight()*0.5));
ScaleDrawable sd = new ScaleDrawable(drawable, 0, scaleWidth, scaleHeight);
Button btn = findViewbyId(R.id.yourbtnID);
btn.setCompoundDrawables(sd.getDrawable(), null, null, null); //set drawableLeft for example

यदि आप ड्रॉबल को कोड में सेट करते हैं, तो आप इसे बटन ऊंचाई के आधार पर आकार बदल सकते हैं और फिर सेट कर सकते हैं।
रॉनी

अब छवि प्रदर्शित होती है, लेकिन इसका आकार बदला नहीं जाता है! मैंने 0.1f और 10f के बीच मूल्यों की कोशिश की। कोई उपाय? आपकी मदद के लिए धन्यवाद ...
रेटो

यह कोशिश करोdrawable.setBounds(0, 0, drawable.getIntrinsicWidth()*0.5, drawable.getIntrinsicHeight()*0.5);
रोनी

यदि यह ड्रॉबल का आकार बदल देता है, तो आप स्केल किए गए हिस्से को हटा सकते हैं और ड्रॉबल को सीधे उपयोग कर सकते हैं।
रॉनी

2
क्या हम पैमाना और पैमाना के लिए अपना मान निर्धारित करने वाले हैं? क्या वे सिर्फ वर्णनात्मक हैं?
समेटसहिन

89

मुझे एक बहुत ही सरल और प्रभावी XML समाधान मिला है जिसकी आवश्यकता नहीं है ImageButton

नीचे दिए गए अनुसार अपनी छवि के लिए एक ड्रा करने योग्य फ़ाइल बनाएं और इसके लिए उपयोग करें android:drawableLeft

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
    android:id="@+id/half_overlay"
    android:drawable="@drawable/myDrawable"
    android:width="40dp"
    android:height="40dp"
    />

</layer-list>

आप छवि का आकार android:widthऔर android:heightगुणों के साथ सेट कर सकते हैं।

इस तरह से आप कम से कम अलग-अलग स्क्रीन के लिए एक ही आकार पा सकते हैं।

दोष यह है कि यह बिल्कुल fitXY की तरह नहीं है जो कि चित्र की चौड़ाई को X में फिट करने के लिए स्केल करेगा और तदनुसार छवि की ऊँचाई को मापेगा।


9
यह स्वीकृत उत्तर होना चाहिए। यदि कोई एक ImageButton नहीं चाहता है (जैसे कि वे पाठ, आदि चाहते हैं) तो यह उत्तर पाठ प्लस शून्य कोड के साथ एक बटन के भीतर छवियों को आकार देने की अनुमति देता है।
पुनर्नवीनीकरण स्टील

3
मैंने इस तरह एक नया योग्‍य बनाया और फिर android:drawableTopमैंने नया योग्‍य बनाया। इससे कोई फर्क नहीं पड़ता कि मैंने जो चौड़ाई / ऊँचाई तय की है, वह मुझे डिफ़ॉल्ट दिखाता है।
बहाव 1187

9
लॉलीपॉप के नीचे के एंड्रॉइड वर्जन के लिए काम नहीं करता है।
ज्योतिमन सिंह

32
ऊंचाई, चौड़ाई केवल एपीआई स्तर 23 और उच्चतर में काम करती है। पिछड़े का समर्थन नहीं किया।
पलक दरजी

मैं मानता हूं, यह अब तक का सबसे अच्छा समाधान है
सेनजो मलिंगा

10

बटन अपनी आंतरिक छवियों का आकार नहीं बदलते हैं।

मेरे समाधान में कोड हेरफेर की आवश्यकता नहीं है।

यह TextView और ImageView के साथ एक लेआउट का उपयोग करता है।

लेआउट की पृष्ठभूमि में लाल 3 डी दराज होना चाहिए।

आपको एंड्रॉइड को परिभाषित करने की आवश्यकता हो सकती है : स्केल टाइप xml विशेषता।

उदाहरण:

<LinearLayout
    android:id="@+id/list_item"
    android:layout_width="fill_parent"
    android:layout_height="50dp"
    android:padding="2dp" >

    <ImageView
        android:layout_width="50dp"
        android:layout_height="fill_parent"
        android:src="@drawable/camera" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:lines="1"
        android:gravity="center_vertical"
        android:text="Hello - primary" />

</LinearLayout>

Btw:

  1. अलग-अलग रिज़ॉल्यूशन के आइकॉन पर गिनने से नॉन प्रेडिक्टेबल UI (आइकन बहुत बड़ा या बहुत छोटा) हो सकता है
  2. टेक्स्टव्यू (बटनों सहित) में पाठ घटक को नहीं भरता है। यह एक Android समस्या है और मुझे नहीं पता कि इसे कैसे हल किया जाए।
  3. आप इसे शामिल के रूप में उपयोग कर सकते हैं।

सौभाग्य


पुन: TextViews, अगर मैं चाहता हूं कि दृश्य जितना छोटा हो सके, मैं इसके लिए पैडिंग को शून्य पर सेट कर दूं। यह अन्यथा डिफ़ॉल्ट पैडिंग प्रतीत होता है।
विलियम टी। मल्लार्ड

6

अभिनव के रूप में एक स्केलड्राएबल का उपयोग करें का सुझाव दिया।

समस्या यह है कि ड्रॉबल तब दिखाई नहीं देता - यह स्केलड्राबल्स में किसी प्रकार का बग है। आपको "स्तर" को प्रोग्रामेटिक रूप से बदलना होगा। यह हर बटन के लिए काम करना चाहिए:

// Fix level of existing drawables
Drawable[] drawables = myButton.getCompoundDrawables();
for (Drawable d : drawables) if (d != null && d instanceof ScaleDrawable) d.setLevel(1);
myButton.setCompoundDrawables(drawables[0], drawables[1], drawables[2], drawables[3]);

अच्छा लगा। मुझे लगता है कि मैं निकट भविष्य में इसका इस्तेमाल कर सकता हूं!
अभिनव

@zeh, अब मैंने पाया कि यदि आप setContentView से पहले उपरोक्त कोड चलाते हैं तो यह काम करता है, अन्यथा यह काम नहीं करता है। इसे आप अपनी पोस्ट में जोड़ सकते हैं तो बेहतर होगा।
बडी

किसी कारण से, मेरा उपरोक्त समाधान सभी Android संस्करणों पर काम नहीं करता है।
बडी

6

मेरा डिप्लोमाएस्केलर, जो पूरी तरह से काम करता है:

import android.content.Context;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ScaleDrawable;
import android.widget.Button;

public class DisplayHelper {

  public static void scaleButtonDrawables(Button btn, double fitFactor) {
        Drawable[] drawables = btn.getCompoundDrawables();

        for (int i = 0; i < drawables.length; i++) {
            if (drawables[i] != null) {
                if (drawables[i] instanceof ScaleDrawable) {
                    drawables[i].setLevel(1);
                }
                drawables[i].setBounds(0, 0, (int) (drawables[i].getIntrinsicWidth() * fitFactor),
                    (int) (drawables[i].getIntrinsicHeight() * fitFactor));
                ScaleDrawable sd = new ScaleDrawable(drawables[i], 0, drawables[i].getIntrinsicWidth(), drawables[i].getIntrinsicHeight());
                if(i == 0) {
                    btn.setCompoundDrawables(sd.getDrawable(), drawables[1], drawables[2], drawables[3]);
                } else if(i == 1) {
                    btn.setCompoundDrawables(drawables[0], sd.getDrawable(), drawables[2], drawables[3]);
                } else if(i == 2) {
                    btn.setCompoundDrawables(drawables[0], drawables[1], sd.getDrawable(), drawables[3]);
                } else {
                    btn.setCompoundDrawables(drawables[0], drawables[1], drawables[2], sd.getDrawable());
                }
            }
        }
    }
}

4

आप setBoundsछवि के आकार को संशोधित करने के लिए "यौगिक" ड्रॉबल्स पर कॉल कर सकते हैं ।

अपने बटन के योग्‍य को स्‍वचालित करने के लिए इस कोड को आज़माएं:

DroidUtils.scaleButtonDrawables((Button) findViewById(R.id.ButtonTest), 1.0);

इस फ़ंक्शन द्वारा परिभाषित:

public final class DroidUtils {

    /** scale the Drawables of a button to "fit"
     *  For left and right drawables: height is scaled 
     *  eg. with fitFactor 1 the image has max. the height of the button.
     *  For top and bottom drawables: width is scaled: 
     *  With fitFactor 0.9 the image has max. 90% of the width of the button 
     *  */
    public static void scaleButtonDrawables(Button btn, double fitFactor) {
        Drawable[] drawables = btn.getCompoundDrawables();

        for (int i = 0; i < drawables.length; i++) {
            if (drawables[i] != null) {
                int imgWidth = drawables[i].getIntrinsicWidth();
                int imgHeight = drawables[i].getIntrinsicHeight();
                if ((imgHeight > 0) && (imgWidth > 0)) {    //might be -1
                    float scale;
                    if ((i == 0) || (i == 2)) { //left or right -> scale height
                        scale = (float) (btn.getHeight() * fitFactor) / imgHeight;
                    } else { //top or bottom -> scale width
                        scale = (float) (btn.getWidth() * fitFactor) / imgWidth;                    
                    }
                    if (scale < 1.0) {
                        Rect rect = drawables[i].getBounds();
                        int newWidth = (int)(imgWidth * scale);
                        int newHeight = (int)(imgHeight * scale);
                        rect.left = rect.left + (int)(0.5 * (imgWidth - newWidth)); 
                        rect.top = rect.top + (int)(0.5 * (imgHeight - newHeight));
                        rect.right = rect.left + newWidth;
                        rect.bottom = rect.top + newHeight;
                        drawables[i].setBounds(rect);
                    }
                }
            }
        }
    }
}

ज्ञात हो, कि इसे onCreate()गतिविधि में नहीं कहा जा सकता है , क्योंकि बटन की ऊँचाई और चौड़ाई वहाँ उपलब्ध नहीं है (अभी तक)। इस पर कॉल करें onWindowFocusChanged()या फ़ंक्शन को कॉल करने के लिए इस समाधान का उपयोग करें

संपादित:

इस फ़ंक्शन के पहले अवतार ने सही तरीके से काम नहीं किया। यह छवि को स्केल करने के लिए userSeven7s कोड का उपयोग ScaleDrawable.getDrawable() करता है , लेकिन लौटने पर काम नहीं लगता है (न ही वापस लौटता हैScaleDrawable मेरे ) ।

संशोधित कोड setBoundsछवि के लिए सीमा प्रदान करने के लिए उपयोग करता है। एंड्रॉइड इमेज को इन सीमा में फिट करता है।


धन्यवाद कि आपने कहा कि इसे अंदर मत बुलाओ onCreate()
द्विअर्थी


1

मैं इसे नीचे की तरह कर रहा हूं। यह इनपुट छवि से स्वतंत्र बटन में 100x100 आकार की छवि बनाता है।

drawable.bounds = Rect(0,0,100,100)
button.setCompoundDrawables(drawable, null, null, null)

ScaleDrawableदोनों का उपयोग नहीं। button.setCompoundDrawablesRelativeWithIntrinsicBounds()मेरी समस्या को हल करने का उपयोग नहीं कर रहा है, जैसा कि आपके द्वारा निर्धारित सीमा के बजाय आंतरिक सीमा (स्रोत छवि आकार) का उपयोग करना प्रतीत होता है।


0

आप विभिन्न आकार के ड्रॉबल्स का उपयोग कर सकते हैं जो विभिन्न स्क्रीन घनत्वों / आकारों आदि के साथ उपयोग किए जाते हैं, ताकि आपकी छवि सभी उपकरणों पर सही दिखे।

यहां देखें: http://developer.android.com/guide/practices/screens_support.html#support


मैं एक ही छवि का उपयोग विभिन्न स्थानों पर करता हूं। यही कारण है कि मैं इसे आकार नहीं दे सकता, इसे मेरे इच्छित आकार में प्रदर्शित किया जाना चाहिए।
रीटो

0

क्या आपने अपनी छवि को स्केलड्रेबल में लपेटने की कोशिश की और फिर अपने बटन में इसका उपयोग किया?


2
बस यह कोशिश की, हालांकि मेरा स्केलडबल प्रदर्शित नहीं होता है। :-( एक ImageView में भी नहीं। मैंने सैंपल कोड लिया और बस ड्रॉबल को बदल दिया। किसी भी विचार से यह काम क्यों नहीं करता?
Reto

मुझे भी यही समस्या थी। ScaleDrawableसही होगा, लेकिन यह बस काम नहीं करता है। ऐसा लगता है कि "स्तरों" के साथ कुछ करना है। यहाँ अधिक जानकारी (और कुछ वर्कअराउंड जो एकदम सही से कम हैं): stackoverflow.com/questions/5507539/…
zeh

(एडिट) ने इसे कुछ सामान्य कोड के साथ तय किया! यहाँ समाधान है कि अभी भी आप ScaleDrawables का उपयोग करने की अनुमति देता है: stackoverflow.com/a/13706836/439026
15

0

यहाँ जो फ़ंक्शन मैंने वेक्टर ड्राबल्स स्केलिंग के लिए बनाया है। मैंने इसका उपयोग TextView कंपाउंड ड्रॉबल सेट करने के लिए किया।

/**
 * Used to load vector drawable and set it's size to intrinsic values
 *
 * @param context Reference to {@link Context}
 * @param resId   Vector image resource id
 * @param tint    If not 0 - colour resource to tint the drawable with.
 * @param newWidth If not 0 then set the drawable's width to this value and scale 
 *                 height accordingly.
 * @return On success a reference to a vector drawable
 */
@Nullable
public static Drawable getVectorDrawable(@NonNull Context context,
                                         @DrawableRes int resId,
                                         @ColorRes int tint,
                                         float newWidth)
{
    VectorDrawableCompat drawableCompat =
            VectorDrawableCompat.create(context.getResources(), resId, context.getTheme());
    if (drawableCompat != null)
    {
        if (tint != 0)
        {
            drawableCompat.setTint(ResourcesCompat.getColor(context.getResources(), tint, context.getTheme()));
        }

        drawableCompat.setBounds(0, 0, drawableCompat.getIntrinsicWidth(), drawableCompat.getIntrinsicHeight());

        if (newWidth != 0.0)
        {
            float scale = newWidth / drawableCompat.getIntrinsicWidth();
            float height = scale * drawableCompat.getIntrinsicHeight();
            ScaleDrawable scaledDrawable = new ScaleDrawable(drawableCompat, Gravity.CENTER, 1.0f, 1.0f);
            scaledDrawable.setBounds(0,0, (int) newWidth, (int) height);
            scaledDrawable.setLevel(10000);
            return scaledDrawable;
        }
    }
    return drawableCompat;
}

0
  • "BATCH DRAWABLE IMPORT" फीचर का उपयोग करके आप अपनी आवश्यकता के अनुसार कस्टम आकार आयात कर सकते हैं उदाहरण 20dp * 20dp

    • अब आयात करने के बाद अपने बटन के लिए drawable_source के रूप में आयातित drawable_image का उपयोग करें

    • यह इस तरह सरल है यहाँ छवि विवरण दर्ज करें


आप वहाँ कैसे पहुंचे?
Android डेवलपर

यह एक प्लगइन है जो मुझे लगता है। plugins.jetbrains.com/plugin/7658-android-drawable-importer
जियोमिंट

0

यह इसलिए है क्योंकि आपने नहीं किया setLevel। आप के बाद setLevel(1), यह यू के रूप में प्रदर्शित किया जाएगा


0

कोटलिन एक्सटेंशन का उपयोग करना

val drawable = ContextCompat.getDrawable(context, R.drawable.my_icon)
// or resources.getDrawable(R.drawable.my_icon, theme)
val sizePx = 25
drawable?.setBounds(0, 0, sizePx, sizePx)
//                            (left,     top,  right, bottom)
my_button.setCompoundDrawables(drawable, null, null, null)

मेरा सुझाव है कि पुन: उपयोग के लिए TextView ( बटन इसे विस्तारित करता है ) पर एक एक्सटेंशन फ़ंक्शन बना रहा है ।

button.leftDrawable(R.drawable.my_icon, 25)

// Button extends TextView
fun TextView.leftDrawable(@DrawableRes id: Int = 0, @DimenRes sizeRes: Int) {
    val drawable = ContextCompat.getDrawable(context, id)
    val size = context.resources.getDimensionPixelSize(sizeRes)
    drawable?.setBounds(0, 0, size, size)
    this.setCompoundDrawables(drawable, null, null, null)
}

सवाल बटन के बारे में था, टेक्स्टव्यू के बारे में नहीं।
फिरोजेन

1
आपको जवाब पढ़ना चाहिए था। एक बटन TextView का विस्तार करता है, इसलिए आप इसे दोनों के लिए उपयोग कर सकते हैं। या केवल एक बटन का विस्तार करने के लिए विस्तार को बदलें
गिबोल्ट

-1

मैंने इस पोस्ट की तकनीकों की कोशिश की, लेकिन उनमें से किसी को भी इतना आकर्षक नहीं पाया। मेरा समाधान इमेजव्यू और टेक्स्टव्यू का उपयोग करना था और इमेजव्यू को टेक्स्टव्यू के ऊपर और नीचे संरेखित करना था। इस तरह मुझे वांछित परिणाम मिला। यहाँ कुछ कोड है:

<RelativeLayout
    android:id="@+id/relativeLayout1"
    android:layout_width="match_parent"
    android:layout_height="48dp" >


    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignTop="@+id/textViewTitle"
        android:layout_alignBottom="@+id/textViewTitle"
        android:src="@drawable/ic_back" />

    <TextView
        android:id="@+id/textViewBack"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textViewTitle"
        android:layout_alignBottom="@+id/textViewTitle"
        android:layout_toRightOf="@+id/imageView1"
        android:text="Back"
        android:textColor="@color/app_red"
        android:textSize="@dimen/title_size" />
</RelativeLayout>

-1

मैंने इसे प्राप्त करने के लिए एक कस्टम बटन वर्ग बनाया।

CustomButton.java

public class CustomButton extends android.support.v7.widget.AppCompatButton {

    private Drawable mDrawable;

    public CustomButton(Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray a = context.getTheme().obtainStyledAttributes(
                attrs,
                R.styleable.CustomButton,
                0, 0);

        try {
            float mWidth = a.getDimension(R.styleable.CustomButton_drawable_width, 0);
            float mHeight = a.getDimension(R.styleable.CustomButton_drawable_width, 0);

            Drawable[] drawables = this.getCompoundDrawables();
            Drawable[] resizedDrawable = new Drawable[4];

            for (int i = 0; i < drawables.length; i++) {
                if (drawables[i] != null) {
                    mDrawable = drawables[i];
                }
                resizedDrawable[i] = getResizedDrawable(drawables[i], mWidth, mHeight);
            }

            this.setCompoundDrawables(resizedDrawable[0], resizedDrawable[1], resizedDrawable[2], resizedDrawable[3]);
        } finally {
            a.recycle();
        }
    }

    public Drawable getmDrawable() {
        return mDrawable;
    }

    private Drawable getResizedDrawable(Drawable drawable, float mWidth, float mHeight) {
        if (drawable == null) {
            return null;
        }

        try {
            Bitmap bitmap;

            bitmap = Bitmap.createBitmap((int)mWidth, (int)mHeight, Bitmap.Config.ARGB_8888);

            Canvas canvas = new Canvas(bitmap);
            drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
            drawable.draw(canvas);
            return drawable;
        } catch (OutOfMemoryError e) {
            // Handle the error
            return null;
        }
    }
}

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CustomButton">
        <attr name="drawable_width" format="dimension" />
        <attr name="drawable_height" format="dimension" />
    </declare-styleable>
</resources>

एक्सएमएल में उपयोग

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.MainActivity">

     <com.example.CustomButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:drawableTop="@drawable/ic_hero"
            android:text="Avenger"
            custom:drawable_height="10dp"
            custom:drawable_width="10dp" />

</RelativeLayout>

1
यदि आप एक क्यों बना सकता हूँ Canvasमें getResizedDrawableऔर अगर आप इसके साथ कुछ भी करने को नहीं जा रहे हैं इसे में आकर्षित? पूरे समारोह को कम किया जा सकता है drawable.setBounds(0, 0, mWidth, mHeight)
एंटीमोनिट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.