उपयोग करते समय मैं रिपल रंग कैसे संशोधित कर सकता हूं? पृष्ठभूमि के रूप में Attr / selectableItemBackground?


103

मैंने कुछ SO प्रश्न देखे हैं और जो मैं चाहता हूं उसे प्राप्त करने के लिए उन्होंने कुछ संभावित तरीके दिए हैं। उदाहरण के लिए:

  1. colorControlHighlightStyle.xml में विशेषता का उपयोग करें ।

    यहाँ मेरी शैलियों- v21.xml है:

    <style name="SelectableItemBackground">
        <item name="android:colorControlHighlight">#5677FC</item>
        <item name="android:background">?attr/selectableItemBackground</item>
    </style>

    और मेरा विजेट:

    <TextView
        android:id="@+id/tv_take_photo_as_bt"
        android:layout_width="280dp"
        android:layout_height="48dp"
        android:text="@string/act_take_photo"
        style="@style/SelectableItemBackground"/>

    और यह काम नहीं करता है। मैंने parent="Theme.AppCompat"SelectableItemBackground" शैली को जोड़ने , या बदलने या बदलने के लिए भी प्रयास colorControlHighlight(no android: prefix)"किया?android:attr/selectableItemBackground , न तो उपयोगी है।

  2. उपयोग backgroundTintलेआउट में विशेषता का ।

    इसलिए मैं android:backgroundTint="#5677FC"अपने को जोड़ता हूं TextView। फिर भी बेकार है। तब मैं बदलने की कोशिश की android:backgroundTintModeकरने के लिए src_inऔरsrc_atop है, और वे एक अंतर कभी नहीं बनाते हैं।

इसलिए, जब मैं ?attr/selectableItemBackgroundपृष्ठभूमि के रूप में उपयोग करता हूं तो मैं रिपल रंग कैसे बदल सकता हूं । मैं केवल लॉलीपॉप और इसके बाद के संस्करण पर ध्यान केंद्रित करता हूं। आपका अग्रिम में ही बहुत धन्यवाद!

जवाबों:


154

अंत में मुझे समाधान मिल गया: android:colorControlHighlightसीधे विषय में उपयोग करने के बजाय SelectableItemBackground, मुझे एक और शैली लिखनी चाहिए:

<style name="SelectableItemTheme">
    <item name="colorControlHighlight">@color/ripple_color</item>
</style>

फिर:

<style name="SelectableItemBackground">
    <item name="android:theme">@style/SelectableItemTheme</item>
    <item name="android:background">?attr/selectableItemBackground</item>
</style>

अंत में जोड़ने style="@style/SelectableItemBackground"के लिए Viewlayout.xml में।

2016/8/26 पर अद्यतन एन की रिहाई के बाद, मैंने पाया कि कभी-कभी हम इस विधि का उपयोग कुछ प्रकार के लिए तरंग रंग सेट करने के लिए नहीं कर सकते हैं View(उदाहरण के लिए, CardView)। अब मैं अत्यधिक डेवलपर्स का उपयोग करने की सलाह देता हूंRippleDrawable , जिसे xml में भी घोषित किया जा सकता है। यहाँ एक उदाहरण है:

जब उपयोगकर्ता CardViewAPI21 से ऊपर / छुआ / क्लिक करता है , तो मैं एक लहर प्रभाव दिखाना चाहता हूं, और निश्चित रूप से लॉलीपॉप से ​​पहले एक अन्य प्रकार की प्रतिक्रिया होनी चाहिए। इसलिए मुझे लिखना चाहिए:

<android.support.v7.widget.CardView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:foreground="@drawable/selectable_item_background"/>

और selectable_item_backgroundमें drawableफ़ोल्डर:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false" android:drawable="@android:color/transparent" />
    <item android:drawable="@color/color_clicked" />
</selector>

selectable_item_backgroundमें drawable-v21फ़ोल्डर:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ripple_black" />
</selector>

अंत में, ripple_blackमें drawable(या drawable-v21) फ़ोल्डर:

<ripple
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="@color/color_clicked"
    tools:ignore="NewApi" /> <!--you can remove this line if it's in v21 folder-->

बस। अन्य विचारों के लिए, शायद आपको उपयोग करना चाहिए android:background="@drawable/selectable_item_background"। एक सेट करने के लिए मत भूलना OnClickListener, OnTouchListenerया उनके लिए ऐसा कुछ, अन्यथा लहर नहीं दिखाएंगे।


14
का प्रयोग करें colorControlHighlightके बजाय android:colorControlHighlightमेरे लिए बेहतर काम करता है, अन्यथा यह + V21 के लिए ही है
लिउतिंग

1
यह सही उत्तर नहीं है, कृपया नीचे दिए गए है हार्नर का उत्तर देखें।
जिन

2
यदि आपने एक ClickListener सेट नहीं किया है, तो बस दृश्य को क्लिक करने योग्य बनाएं clickable="true"और तरंग प्रभाव काम करेगा
hedisam

58

पूर्व और लॉलीपॉप + उपकरणों पर तरंग प्रभाव

हार्नर और लियूटिंग सही है। स्वीकृत उत्तर सबसे अच्छा तरीका नहीं है। मुझे कोड दिखाते हैं कि प्री-लॉलीपॉप संस्करणों और उच्चतर के लिए तरंग रंग को कैसे बदलना है

  1. आपके AppTheme को किसी भी AppCompat विषय से वारिस होना चाहिए और उसमें ColorControlHighlight विशेषता (बिना 'android: preef) के होना चाहिए

    <!-- Application theme. -->
    <style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="colorControlHighlight">#40ffffff</item>
    </style>
  2. आपके विचार में क्लिक करने योग्य = "सत्य" होना चाहिए (या प्रोग्रामर पर एक क्लिक श्रोता सेट होना चाहिए) और पृष्ठभूमि होनी चाहिए "?

    <LinearLayout
    ...
    android:clickable="true"
    android:background="?attr/selectableItemBackgroundBorderless"/>

ध्यान दें: यदि आपके माता-पिता के दृश्य में सफेद पृष्ठभूमि है, तो आप सफेद होने के बाद लहर प्रभाव नहीं देखेंगे। एक अलग रंग के लिए colorControlHighlight मान बदलें

इसके अलावा, यदि आप अलग-अलग गतिविधियों के लिए अलग-अलग रंग चाहते हैं, तो आप मेनिफेस्ट फ़ाइल में प्रत्येक गतिविधि के लिए व्यक्तिगत विषय निर्धारित कर सकते हैं, उदाहरण के लिए:

       <activity
        android:name="com.myapp.GalleryActivity"
        android:theme="@style/RedRippleTheme"
        />

एक ही गतिविधि में अलग-अलग टुकड़ों के लिए अलग-अलग तरंग रंग?

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

में मूल्यों / styles.xml

    <style name="colorControlHighlight_blue">
       <item name="colorControlHighlight">@color/main_blue_alpha26</item>
    </style>

फिर, मुद्रास्फीति से पहले आपके टुकड़े में onCreateView():

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       getContext().getTheme().applyStyle(R.style.colorControlHighlight_blue, true); //blue ripple color
       View view = inflater.inflate(R.layout.my_fragment_layout, container, false);
       return view;
    }

यह शैली केवल इस टुकड़े के लिए काम करेगी


अलग-अलग दृश्यों के लिए अलग-अलग तरंग रंग? (लॉलीपॉप +)

आप colorControlHighlightविशेषता का उपयोग करते हुए प्रत्येक दृश्य के लिए तरंग रंग को बदल सकते हैं , यदि आप उन्हें सीधे दृश्य पर लागू करते हैं तो यह काम नहीं करता है :

    <TextView
     ...
     colorControlHighlight="#40ffffff"/> <!-- DOESN'T WORK -->

आपको इसे एक विषय के रूप में लागू करना चाहिए:

<TextView
  ...
  android:theme="@style/colorControlHighlight_blue"/>

PS इसके अलावा, कभी-कभी यह दृष्टिकोण मदद करता है अगर आपके पास लहर के साथ अज्ञात समस्याएं हैं और आप इसका पता नहीं लगा सकते हैं। मेरे मामले में, मैंने 3rd पार्टी स्लाइडिंग लिब का इस्तेमाल किया जिसने पूरे लेआउट के लिए लहर प्रभाव को गड़बड़ कर दिया और इस विषय को स्पष्ट रूप से जोड़कर मेरे लिए काम किए गए सभी क्लिक करने योग्य विचारों को जोड़ा।


10

यह एपीआई ++ पर रंग के साथ लहर प्रभाव दिखा रहा है, और एपीआई -21 के लिए प्रेस पर सरल ग्रे पृष्ठभूमि है। इस शैली को जोड़ें:

<style name="AppTheme.MyRipple">
   <item name="colorControlHighlight">@color/your_color</item>
   <item name="android:background">?selectableItemBackgroundBorderless</item>
</style>

और इसे देखने के लिए सेट करें:

<Button
   ...
   android:theme="@style/AppTheme.MyRipple" />

3
यह ध्यान रखना महत्वपूर्ण है कि यह वास्तव में है जैसा कि आपने लिखा था android:themeऔर न कि लोग जो आमतौर पर उपयोग करते हैं style
एंड्रॉयड डेवलपर

6

स्वीकृत उत्तर गलत है।

उपयोग करने का सही तरीका टिप्पणी में उल्लिखित है। से डिफ़ॉल्ट बदलने colorControlHighlightके android:colorControlHighlightलिए उपयोग करेंcolorControlHighlightAppCompat

* कृपया खंड में http://android-developers.blogspot.co.uk/2014/10/appcompat-v21-material-design-for-pre.html देखें *


5

नीचे दिए गए चरणों का उपयोग करें:

1. Make changes to button view in your layout.xml
2. Add new styles in styles.xml

your_layout.xml

<Button
                        android:id="@+id/setup_submit_button"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="16dp"
                        android:text="@string/action_sign_in"
                        android:textStyle="bold"
                        android:background="@color/colorPrimary"
                        android:textColor="@color/white"
                        style="@style/SelectableItemBackground"
                        android:foreground="?android:attr/selectableItemBackground"/>

-शैली की विशेषता उस शैली को कहती है जिसे हमने बनाया था।

-Foreground विशेषता andorid की डिफ़ॉल्ट चयन करने योग्य विशेषता कॉल करता है।

styles.xml

 <style name="SelectableItemTheme">
        <item name="colorControlHighlight">@color/white</item>
    </style>


    <style name="SelectableItemBackground">
        <item name="android:theme">@style/SelectableItemTheme</item>
        <item name="android:background">?attr/selectableItemBackground</item>
    </style>

0

यह कोड मेरे लिए रिपल बनाने का काम करता है:

public static void setRippleDrawable(View view, int normalColor, int touchColor) {
    try {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            RippleDrawable rippleDrawable = new RippleDrawable(ColorStateList.valueOf(touchColor), view.getBackground(), null);
            view.setBackground(rippleDrawable);
        } else {
            StateListDrawable stateListDrawable = new StateListDrawable();
            stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, new ColorDrawable(touchColor));
            stateListDrawable.addState(new int[]{android.R.attr.state_focused}, new ColorDrawable(touchColor));
            stateListDrawable.addState(new int[]{}, new ColorDrawable(normalColor));
            view.setBackground(stateListDrawable);
            }
    } catch (Exception e) {
        Log.e(LOG_TAG, "" + e);
    }
}

मुझे SelectableItemBackground विशेषता को संशोधित करने का कोई तरीका नहीं मिला। इसलिए मैंने इसे ऊपर की तरह किया।


0

गहरे काले रंग की थीम (या किसी अन्य) में नीचे दिए गए फोल्डर ripple_effect.xmlमें पहली बार उपयोग करने की कोशिश करें drawableऔर जैसे कोड जोड़ें

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#f5f5f5">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="#f5f5f5" />

        </shape>
    </item>

</ripple>

फिर अपने किसी भी दृश्य जैसे Linear layout, Button, TextViewआदि के लिए पृष्ठभूमि सेट करें

 <TextView
                    android:id="@+id/tvApply"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/ripple_effect"
                    android:clickable="true"
                    android:text="APPLY"
                    android:textColor="#FFFFFF"
                    android:gravity="center"
                    android:textSize="@dimen/_8sdp"
                    android:padding="@dimen/_8sdp"
                    android:focusable="true" />

-1

अग्रभूमि विशेषता का चयन SelectableItemBackground और पृष्ठभूमि विशेषता के रूप में उस रंग के रूप में करें जो आप चाहते हैं।

android:foreground="?attr/selectableItemBackground"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:background="@color/white"

1
इसे इस तरह करने से आपके पास रिपल इफेक्ट कलर को बदलने का विकल्प नहीं होगा। प्रश्न -How can I modify ripple color when using ?attr/selectableItemBackground as background?
एचबी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.