2015-01-05 2 views
26

मैं अपने लहर के लिए निम्न कोड है:एंड्रॉइड 5.0 लॉलीपॉप के साथ कोड (xml नहीं) में प्रोग्रामेटिक रूप से रिपलड्राउबल का उपयोग कैसे करें?

<?xml version="1.0" encoding="utf-8"?> 
<ripple xmlns:android="http://schemas.android.com/apk/res/android" 
    android:color="?android:colorControlHighlight"> 
    <item android:id="@+id/rip"> 

     <shape android:shape="oval"> 
      <solid android:color="?android:colorAccent"/> 
     </shape> 
    </item> 
</ripple> 

अब मैं उपयोगकर्ता संभावना स्वयं के रंग का चयन करने देना चाहते हैं, तो मैं प्रोग्राम के रूप में लहर बनाने के लिए की जरूरत है।
मुझे this मिला और मुझे लगता है कि यह करने का यह सही तरीका है, लेकिन मुझे नहीं पता कि इससे कैसे निपटना है।

लहर यहाँ उपयोग किया जाएगा:

<ImageButton 
    android:id="@+id/add_button" 
    android:layout_width="@dimen/diameter" 
    android:layout_height="@dimen/diameter" 
    android:layout_gravity="end|bottom" 
    android:layout_marginBottom="@dimen/add_button_margin" 
    android:layout_marginEnd="@dimen/add_button_margin" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentEnd="true" 
    android:src="@drawable/ic_action_add_person" 
    android:tint="@android:color/white" 
    android:background="@drawable/oval_ripple" 
    android:elevation="@dimen/elevation_low" 
    android:stateListAnimator="@anim/button_elevation" 
    android:contentDescription="Neuer Spieler" /> 

मैं एक RippleDrawable इस तरह की पृष्ठभूमि निर्धारित करने की आवश्यकता:

addButton.setBackground(ripple); 
+0

आप अपने एक्सएमएल संसाधन का उपयोग कहां करते हैं? – pskink

+0

@pskink मैंने पहली पोस्ट संपादित की :) – ich5003

+0

तो नया 'रिपल ड्रायबल' बनाने में समस्या क्या है? – pskink

उत्तर

44

यह है कि कैसे मैं इस लक्ष्य को हासिल करने में सक्षम था है।

ध्यान दें कि यह केवल एपीआई 21+ है, इसलिए यदि आप निम्न संस्करणों का समर्थन करते हैं तो आपको सामान्य ड्रायरेबल पर फ़ॉलबैक करना होगा।

public static RippleDrawable getPressedColorRippleDrawable(int normalColor, int pressedColor) 
{ 
    return new RippleDrawable(getPressedColorSelector(normalColor, pressedColor), getColorDrawableFromColor(normalColor), null); 
} 

public static ColorStateList getPressedColorSelector(int normalColor, int pressedColor) 
{ 
    return new ColorStateList(
     new int[][] 
      { 
       new int[]{android.R.attr.state_pressed}, 
       new int[]{android.R.attr.state_focused}, 
       new int[]{android.R.attr.state_activated}, 
       new int[]{} 
      }, 
     new int[] 
      { 
       pressedColor, 
       pressedColor, 
       pressedColor, 
       normalColor 
      } 
    ); 
} 

public static ColorDrawable getColorDrawableFromColor(int color) 
{ 
    return new ColorDrawable(color); 
} 

संपादित करें: मैं इस में कुछ और के साथ tinkered किया और पाया कि ColorStateList ऊपर समाधान के रूप में लगभग के रूप में जटिल होने की जरूरत नहीं है। मैंने इसे नीचे स्निपेट में सरल बना दिया है। (उपर्युक्त कोड ब्लॉक में बाकी सब कुछ वही है। मैंने केवल कलरस्टेटलिस्ट निर्माण को बदल दिया है।) यदि यह विधि किसी के लिए काम नहीं करती है, तो मैं उपरोक्त ब्लॉक को मूल के रूप में छोड़ दूंगा।

new ColorStateList(
    new int[][] 
     { 
      new int[]{} 
     }, 
    new int[] 
     { 
      pressedColor 
     } 
); 
+5

जैसा दिखता है, आपके लिए बहुत बहुत धन्यवाद :) (आपको एक अपवर्तित नहीं दे सकता है, पर्याप्त प्रतिष्ठा नहीं है)। – ich5003

+0

निश्चित बात; यह पता लगाने में दर्द था इसलिए मुझे साझा करने में खुशी हुई। :) क्या यह आपके काम आया? मैंने इसके साथ कुछ और tinkered और सीखा है कि मैं ColorStateList को बहुत सरल बना सकता हूं और एक ही परिणाम प्राप्त कर सकता हूं इसलिए मैंने अपना जवाब भी शामिल करने के लिए संपादित किया। – kdenney

+9

आप इसे 'ColorStateList.valueOf (रिपपलकॉलर) का उपयोग करके भी कर सकते हैं; ' – milosmns

19
public static Drawable getAdaptiveRippleDrawable(
    int normalColor, int pressedColor) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     return new RippleDrawable(ColorStateList.valueOf(pressedColor), 
       null, getRippleMask(normalColor)); 
    } else { 
     return getStateListDrawable(normalColor, pressedColor); 
    } 
} 

private static Drawable getRippleMask(int color) { 
    float[] outerRadii = new float[8]; 
    // 3 is radius of final ripple, 
    // instead of 3 you can give required final radius 
    Arrays.fill(outerRadii, 3); 

    RoundRectShape r = new RoundRectShape(outerRadii, null, null); 
    ShapeDrawable shapeDrawable = new ShapeDrawable(r); 
    shapeDrawable.getPaint().setColor(color); 
    return shapeDrawable; 
} 

public static StateListDrawable getStateListDrawable(
    int normalColor, int pressedColor) { 
    StateListDrawable states = new StateListDrawable(); 
    states.addState(new int[]{android.R.attr.state_pressed}, 
     new ColorDrawable(pressedColor)); 
    states.addState(new int[]{android.R.attr.state_focused}, 
     new ColorDrawable(pressedColor)); 
    states.addState(new int[]{android.R.attr.state_activated}, 
     new ColorDrawable(pressedColor)); 
    states.addState(new int[]{}, 
     new ColorDrawable(normalColor)); 
    return states; 
} 

आप drawable हो और view.setDrawable उपयोग कर किसी भी दृश्य पर लागू कर सकते हैं।
लॉलीपॉप + उपकरणों के लिए आपको लहर मिल जाएगी अन्यथा यह दृश्य का रंग बदल देगा।

+0

यह अच्छा है। मुझे लगता है कि एक कमी, यह है कि प्री-लॉलीपॉप डिवाइस पर लागू होने पर गोलाकार कोनों को खोला जा सकता है, क्योंकि 'स्टेटलिस्ट ड्रेवेबल' में 'कलरड्रावेबल' का कोई आकार नहीं है। हम आकार रखने के बजाय रंगीन 'आकार बदलने योग्य' प्रदान कर सकते हैं। लेकिन शायद यह थोड़ा भारी पाने के लिए शुरू हो जाएगा।उस स्थिति में, एक और समाधान एक "setCateDrawable" को एक "setColor" विधि के साथ बनाना होगा जिससे आप राज्य सूची के लिए आवश्यक सभी ऑब्जेक्ट को फिर से चालू कर सकें। – John

+0

यहां कुछ नज़दीकी पाया गया: https://github.com/gabrielemariotti/colorpickercollection/blob/master/ColorPicker/src/it/gmariotti/android/example/colorpicker/calendarstock/ColorStateDrawable.java – John

2

असल में, आपको एक नई रिपल ड्रायबल ऑब्जेक्ट बनाने की आवश्यकता है। प्री-लॉलीपॉप उपकरणों के लिए, आप एक स्टेटलिस्ट ड्रायबल (जैसा कि पहले से ही सुझाए गए हैं) चाहते हैं। मैं ड्रॉएबल और रंग से संबंधित उपयोगी तरीकों में से एक समूह के साथ कुछ हद तक एक साधन संपन्न GIST लिखा है: https://gist.github.com/milosmns/6566ca9e3b756d922aa5

सबसे अधिक संभावना आपको लगता है कि सिंगलटन से #getBackgroundDrawable() उपयोग करना चाहते हैं जाएगा।

संबंधित मुद्दे