android - एक अलग रंग के साथ मानक एंड्रॉइड बटन




android-layout (12)

क्लाइंट के ब्रांडिंग से बेहतर मिलान करने के लिए मैं एक मानक एंड्रॉइड बटन का रंग बदलना चाहता हूं।

मुझे यह करने का सबसे अच्छा तरीका यह है कि Button को res/drawable/red_button.xml को res/drawable/red_button.xml में स्थित निम्न res/drawable/red_button.xml :

<?xml version="1.0" encoding="utf-8"?>    
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/red_button_pressed" />
    <item android:state_focused="true" android:drawable="@drawable/red_button_focus" />
    <item android:drawable="@drawable/red_button_rest" />
</selector>

लेकिन ऐसा करने के लिए आवश्यक है कि मैं वास्तव में प्रत्येक बटन के लिए तीन अलग-अलग ड्रॉबल्स तैयार करता हूं जिसे मैं कस्टमाइज़ करना चाहता हूं (एक बटन को आराम से, एक ध्यान केंद्रित करने पर, और दबाए जाने पर एक)। ऐसा लगता है कि मुझे इसकी तुलना में अधिक जटिल और गैर-DRY लगता है।

मैं वास्तव में करना चाहता हूं बटन पर कुछ प्रकार के रंग परिवर्तन को लागू करना है। क्या मैं बटन से रंग बदलने के बारे में जाने का कोई आसान तरीका है?


अब आप backgroundTint साथ appcompat-v7 के AppCompat बटन का भी उपयोग कर सकते हैं विशेषता विशेषता:

<android.support.v7.widget.AppCompatButton
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:backgroundTint="#ffaa00"/>

अब एक आसान तरीका है: android-holo-colors.com

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


आप इस पर अपने बटन का विषय सेट कर सकते हैं

<style name="AppTheme.ButtonBlue" parent="Widget.AppCompat.Button.Colored">
 <item name="colorButtonNormal">@color/HEXColor</item>
 <item name="android:textColor">@color/HEXColor</item>
</style>

इसे इस तरह प्रयोग करें:

buttonOBJ.getBackground().setColorFilter(Color.parseColor("#YOUR_HEX_COLOR_CODE"), PorterDuff.Mode.MULTIPLY);

जिस तरह से मैं एक अलग स्टाइल बटन करता हूं जो काफी अच्छी तरह से काम करता है वह बटन ऑब्जेक्ट को उप-वर्ग करना और रंग फ़िल्टर लागू करना है। यह बटन पर अल्फा लगाकर सक्षम और अक्षम राज्यों को भी संभालता है।

import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.LightingColorFilter;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.Button;

public class DimmableButton extends Button {

    public DimmableButton(Context context) {
        super(context);
    }

    public DimmableButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public DimmableButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @SuppressWarnings("deprecation")
    @Override
    public void setBackgroundDrawable(Drawable d) {
        // Replace the original background drawable (e.g. image) with a LayerDrawable that
        // contains the original drawable.
        DimmableButtonBackgroundDrawable layer = new DimmableButtonBackgroundDrawable(d);
        super.setBackgroundDrawable(layer);
    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    @Override
    public void setBackground(Drawable d) {
        // Replace the original background drawable (e.g. image) with a LayerDrawable that
        // contains the original drawable.
        DimmableButtonBackgroundDrawable layer = new DimmableButtonBackgroundDrawable(d);
        super.setBackground(layer);
    }

    /**
     * The stateful LayerDrawable used by this button.
     */
    protected class DimmableButtonBackgroundDrawable extends LayerDrawable {

        // The color filter to apply when the button is pressed
        protected ColorFilter _pressedFilter = new LightingColorFilter(Color.LTGRAY, 1);
        // Alpha value when the button is disabled
        protected int _disabledAlpha = 100;
        // Alpha value when the button is enabled
        protected int _fullAlpha = 255;

        public DimmableButtonBackgroundDrawable(Drawable d) {
            super(new Drawable[] { d });
        }

        @Override
        protected boolean onStateChange(int[] states) {
            boolean enabled = false;
            boolean pressed = false;

            for (int state : states) {
                if (state == android.R.attr.state_enabled)
                    enabled = true;
                else if (state == android.R.attr.state_pressed)
                    pressed = true;
            }

            mutate();
            if (enabled && pressed) {
                setColorFilter(_pressedFilter);
            } else if (!enabled) {
                setColorFilter(null);
                setAlpha(_disabledAlpha);
            } else {
                setColorFilter(null);
                setAlpha(_fullAlpha);
            }

            invalidateSelf();

            return super.onStateChange(states);
        }

        @Override
        public boolean isStateful() {
            return true;
        }
    }

}

टॉमसज़ के उत्तर के बाद, आप प्रोग्रामरिक रूप से पोर्टरडफ गुणा मोड का उपयोग करके पूरे बटन की छाया सेट कर सकते हैं। यह सिर्फ टिंट की बजाय बटन रंग बदल देगा।

यदि आप मानक ग्रे छायांकित बटन से शुरू करते हैं:

button.getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);

आपको एक लाल छायांकित बटन देगा,

button.getBackground().setColorFilter(0xFF00FF00, PorterDuff.Mode.MULTIPLY);

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

यह आपके रंग मूल्य से वर्तमान बटन रंग मान गुणा करके काम करता है। मुझे यकीन है कि आप इन तरीकों से भी बहुत कुछ कर सकते हैं।


मुझे @conjugatedirection और @Tomasz से पिछले उत्तरों में रंग फ़िल्टर सुझाव पसंद है; हालांकि, मैंने पाया कि अब तक प्रदान किया गया कोड जितना संभव था उतना आसानी से लागू नहीं किया गया था।

सबसे पहले, यह नहीं बताया गया था कि रंग फ़िल्टर को लागू और साफ़ करें। यह संभव है कि ऐसा करने के लिए अन्य अच्छी जगहें हों, लेकिन मेरे लिए क्या ध्यान आया एक OnTouchListener था।

मूल प्रश्न के मेरे पढ़ने से, आदर्श समाधान वह होगा जिसमें कोई भी छवि शामिल न हो। @emmby से custom_button.xml का उपयोग कर स्वीकृत उत्तर संभवतः रंग फ़िल्टर से बेहतर फिट है यदि यह आपका लक्ष्य है। मेरे मामले में, मैं एक यूआई डिजाइनर से एक पीएनजी छवि के साथ शुरू कर रहा हूं कि बटन कैसा दिखता है। अगर मैं इस छवि पर बटन पृष्ठभूमि सेट करता हूं, तो डिफ़ॉल्ट हाइलाइट फीडबैक पूरी तरह से खो जाता है। यह कोड प्रोग्रामिंग अंधेरे प्रभाव के साथ उस व्यवहार को प्रतिस्थापित करता है।

button.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 0x6D6D6D sets how much to darken - tweak as desired
                setColorFilter(v, 0x6D6D6D);
                break;
            // remove the filter when moving off the button
            // the same way a selector implementation would 
            case MotionEvent.ACTION_MOVE:
                Rect r = new Rect();
                v.getLocalVisibleRect(r);
                if (!r.contains((int) event.getX(), (int) event.getY())) {
                    setColorFilter(v, null);
                }
                break;
            case MotionEvent.ACTION_OUTSIDE:
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:
                setColorFilter(v, null);
                break;
        }
        return false;
    }

    private void setColorFilter(View v, Integer filter) {
        if (filter == null) v.getBackground().clearColorFilter();
        else {
            // To lighten instead of darken, try this:
            // LightingColorFilter lighten = new LightingColorFilter(0xFFFFFF, filter);
            LightingColorFilter darken = new LightingColorFilter(filter, 0x000000);
            v.getBackground().setColorFilter(darken);
        }
        // required on Android 2.3.7 for filter change to take effect (but not on 4.0.4)
        v.getBackground().invalidateSelf();
    }
});

मैंने इसे कई बटनों पर एप्लिकेशन के लिए एक अलग वर्ग के रूप में निकाला - केवल विचार प्राप्त करने के लिए अनाम आंतरिक कक्षा के रूप में दिखाया गया।


मूल्यों \ styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<style name="RedAccentButton" parent="ThemeOverlay.AppCompat.Light">
    <item name="colorAccent">#ff0000</item>
</style>

फिर:

<Button
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="text" />

<Button
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:enabled="false"
    android:text="text" />

<Button
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="text"
    android:theme="@style/RedAccentButton" />

<Button
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:enabled="false"
    android:text="text"
    android:theme="@style/RedAccentButton" />


मैंने पाया कि यह सब एक फ़ाइल में काफी आसानी से किया जा सकता है। custom_button.xml नाम की फ़ाइल में निम्न कोड की तरह कुछ custom_button.xml और फिर अपने बटन दृश्य में background="@drawable/custom_button" सेट करें:

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

    <item android:state_pressed="true" >
        <shape>
            <gradient
                android:startColor="@color/yellow1"
                android:endColor="@color/yellow2"
                android:angle="270" />
            <stroke
                android:width="3dp"
                android:color="@color/grey05" />
            <corners
                android:radius="3dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>

    <item android:state_focused="true" >
        <shape>
            <gradient
                android:endColor="@color/orange4"
                android:startColor="@color/orange5"
                android:angle="270" />
            <stroke
                android:width="3dp"
                android:color="@color/grey05" />
            <corners
                android:radius="3dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>

    <item>        
        <shape>
            <gradient
                android:endColor="@color/blue2"
                android:startColor="@color/blue25"
                android:angle="270" />
            <stroke
                android:width="3dp"
                android:color="@color/grey05" />
            <corners
                android:radius="3dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
</selector>

यदि आप एक्सएमएल के साथ रंग बटन बना रहे हैं तो आप फोकस और दबाए गए राज्य को एक अलग फ़ाइल में निर्दिष्ट करके कोड को थोड़ा क्लीनर बना सकते हैं और उनका पुन: उपयोग कर सकते हैं। मेरा हरा बटन इस तरह दिखता है:

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

    <item android:state_focused="true" android:drawable="@drawable/button_focused"/>
    <item android:state_pressed="true" android:drawable="@drawable/button_pressed"/>

    <item>
        <shape>
            <gradient android:startColor="#ff00ff00" android:endColor="#bb00ff00" android:angle="270" />
            <stroke android:width="1dp" android:color="#bb00ff00" />
            <corners android:radius="3dp" />
            <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
        </shape>
    </item>

</selector>

DroidUX घटक लाइब्रेरी में एक ColorButton विजेट है जिसका रंग आसानी से बदला जा सकता है, दोनों एक्सएमएल परिभाषा के माध्यम से और प्रोग्रामेटिक रूप से रन टाइम पर, ताकि आप उपयोगकर्ता को बटन के रंग / थीम को सेट करने दे सकें यदि आपका ऐप इसे अनुमति देता है।


<Button> android:background="#33b5e5" उपयोग करें android:background="#33b5e5" । या बेहतर android:background="@color/navig_button"







android-layout