Android LinearLayout ग्रेडिएंट बैकग्राउंड


247

मुझे एक रैखिक पृष्ठभूमि के लिए एक ढाल पृष्ठभूमि को लागू करने में परेशानी हो रही है।

यह जो मैंने पढ़ा है उससे अपेक्षाकृत सरल होना चाहिए, लेकिन यह सिर्फ काम नहीं करता है। संदर्भ के लिए मैं 2.1-अपडेट 1 पर विकास कर रहा हूं।

header_bg.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:angle="90"
        android:startColor="#FFFF0000"
        android:endColor="#FF00FF00"
        android:type="linear"/>
</shape>

main_header.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="50dip"
    android:orientation="horizontal"
    android:background="@drawable/header_bg">
</LinearLayout>

अगर मैं @ drawable / header_bg को एक रंग में बदलता हूं - जैसे # FF0000 तो यह पूरी तरह से ठीक काम करता है। क्या में यहां कुछ भूल रहा हूँ?


Android: BackgroundTint Android: BackgroundTintMode stackoverflow.com/a/43341289/3209132
प्रमोद गर्ग

जवाबों:


407

ठीक है मैं एक चयनकर्ता का उपयोग करके इसे हल करने में कामयाब रहा। नीचे देखें कोड:

main_header.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="50dip"
    android:orientation="horizontal"
    android:background="@drawable/main_header_selector">
</LinearLayout>

main_header_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape>
        <gradient
            android:angle="90"
            android:startColor="#FFFF0000"
            android:endColor="#FF00FF00"
            android:type="linear" />
    </shape>
</item>
</selector>

उम्मीद है कि यह कोई है जो एक ही समस्या है मदद करता है।


5
महान। FYI करें, अन्य प्रकार देखें: developer.android.com/reference/android/graphics/drawable/…
Bamaco

86

तीसरा रंग (केंद्र) होना भी संभव है। और विभिन्न प्रकार के आकार।

उदाहरण के लिए drawable / gradient.xml में:

<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:startColor="#000000"
        android:centerColor="#5b5b5b"
        android:endColor="#000000"
        android:angle="0" />
</shape>

यह आपको ब्लैक - ग्रे - ब्लैक (बाएं से दाएं) देता है जो कि मेरा पसंदीदा डार्क बैकग्राउंड है।

अपने लेआउट xml में पृष्ठभूमि के रूप में gradient.xml जोड़ना याद रखें:

android:background="@drawable/gradient"

इसके साथ घूमना भी संभव है:

कोण = "0"

आपको एक वर्टिकल लाइन देता है

और साथ

कोण = "90"

आपको एक क्षैतिज रेखा देता है

संभावित कोण हैं:

0, 90, 180, 270।

इसके अलावा कुछ अलग तरह के आकार हैं:

एंड्रॉयड: आकार = "आयत"

गोल आकार:

एंड्रॉयड: आकार = "अंडाकार"

और शायद कुछ और।

आशा है कि यह मदद करता है, चीयर्स!


40

XML ड्रा करने योग्य फ़ाइल में:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <gradient android:angle="90"
                android:endColor="#9b0493"
                android:startColor="#38068f"
                android:type="linear" />
        </shape>
    </item>
</selector>

आपकी लेआउट फ़ाइल में: android: background = "@ drawable / gradient_background"

  <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/gradient_background"
        android:orientation="vertical"
        android:padding="20dp">
        .....

</LinearLayout>

यहां छवि विवरण दर्ज करें


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

21

Android को हटाने का प्रयास करें: gradientRadius = "90"। यहाँ एक है जो मेरे लिए काम करता है:

<shape 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
>
    <gradient
        android:startColor="@color/purple"
        android:endColor="@color/pink"
        android:angle="270" />
</shape>

दुर्भाग्य से यह मेरे लिए काम नहीं कर रहा है। मैंने अभी जो कुछ भी है उसके साथ मूल प्रश्न को अपडेट किया है।
उत्पत्ति

क्या यह तब भी काम नहीं करता है जब आप लेआउट में एक विजेट जोड़ते हैं (उदाहरण के लिए एक
TextView

सही - यह अभी भी लेआउट के अंदर एक TextView के साथ काम नहीं करता है। फिर, अगर मैं एक ड्रिबल के बजाय एक स्थिर रंग लागू करता हूं तो यह ठीक काम करता है। एक चीज जिस पर मैंने गौर किया है, वह यह है कि मैं (कभी-कभी) इसे चयनकर्ता का उपयोग करके काम करने के लिए प्राप्त कर सकता हूं लेकिन यह मेरी समझ से आवश्यक नहीं होना चाहिए।
उत्पत्ति

6

मेरी समस्या थी .xml एक्सटेंशन को नई बनाई गई XML फ़ाइल के फ़ाइल नाम में नहीं जोड़ा गया था। .Xml एक्सटेंशन जोड़ने से मेरी समस्या ठीक हो गई।


3

कोटलिन के साथ आप ऐसा सिर्फ 2 लाइनों में कर सकते हैं

सरणी में रंग मान बदलें

                  val gradientDrawable = GradientDrawable(
                        GradientDrawable.Orientation.TOP_BOTTOM,
                        intArrayOf(Color.parseColor("#008000"),
                                   Color.parseColor("#ADFF2F"))
                    );
                    gradientDrawable.cornerRadius = 0f;

                   //Set Gradient
                   linearLayout.setBackground(gradientDrawable);

परिणाम

यहां छवि विवरण दर्ज करें


1

मुझे नहीं पता कि यह किसी की मदद करेगा, लेकिन मेरी समस्या यह थी कि मैं एक ImageView की "src" संपत्ति के लिए ढाल सेट करने की कोशिश कर रहा था:

<ImageView 
    android:id="@+id/imgToast"
    android:layout_width="wrap_content"
    android:layout_height="60dp"
    android:src="@drawable/toast_bg"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"/>

100% निश्चित नहीं है कि यह काम क्यों नहीं किया, लेकिन अब मैंने इसे बदल दिया और इमेजव्यू के माता-पिता की "पृष्ठभूमि" संपत्ति में ड्रॉबल को डाल दिया, जो मेरे मामले में एक RelativeLayout है, जैसे: (यह सफलतापूर्वक काम किया)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:id="@+id/custom_toast_layout_id"
    android:layout_height="match_parent"
    android:background="@drawable/toast_bg">

0

मैं आपके ग्रेडिएंट रंगों पर आपके अल्फा चैनल की जाँच करूँगा। मेरे लिए, जब मैं अपने कोड का परीक्षण कर रहा था तो मेरे पास अल्फा चैनल रंगों पर गलत था और यह मेरे लिए काम नहीं करता था। एक बार जब मैंने अल्फा चैनल प्राप्त किया तो यह सब काम कर गया!


0

आप ऐसा करने के लिए एक कस्टम दृश्य का उपयोग कर सकते हैं। इस समाधान के साथ, यह आपकी परियोजनाओं में सभी रंगों के ढाल आकार को समाप्त कर रहा है:

class GradientView(context: Context, attrs: AttributeSet) : View(context, attrs) {

    // Properties
    private val paint: Paint = Paint()
    private val rect = Rect()

    //region Attributes
    var start: Int = Color.WHITE
    var end: Int = Color.WHITE
    //endregion

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        // Update Size
        val usableWidth = width - (paddingLeft + paddingRight)
        val usableHeight = height - (paddingTop + paddingBottom)
        rect.right = usableWidth
        rect.bottom = usableHeight
        // Update Color
        paint.shader = LinearGradient(0f, 0f, width.toFloat(), 0f,
                start, end, Shader.TileMode.CLAMP)
        // ReDraw
        invalidate()
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        canvas.drawRect(rect, paint)
    }

}

मैं इस कस्टम दृश्य के साथ एक ओपन सोर्स प्रोजेक्ट GradientView भी बनाता हूं :

https://github.com/lopspower/GradientView

implementation 'com.mikhaellopez:gradientview:1.1.0'

दिलचस्प लग रहा है। क्या यह एंड्रॉइड के बाद के संस्करणों के साथ काम करता है। मैं अन्य उत्तर के साथ मुद्दों कर रहा था के रूप में वे अब पदावनत हो रहे हैं: issuetracker.google.com/issues/37114374
trees_are_great
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.