Attr / selectableItemBackground'u arka plan olarak kullanırken dalgalanma rengini nasıl değiştirebilirim?


103

Bazı SO soruları gördüm ve istediğimi elde etmek için bazı olası yöntemler verdiler. Örneğin:

  1. colorControlHighlightStyles.xml'de özniteliği kullanın .

    İşte stillerim-v21.xml:

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

    Ve widget'ım:

    <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"/>

    Ve çalışmıyor. Ben de eklemeye çalıştık parent="Theme.AppCompat"SelectableItemBackground" tarzı, ya da değişikliği colorControlHighlight(no android: prefix)", ya da değişim ?android:attr/selectableItemBackground, ne yararlıdır.

  2. Düzende backgroundTintözniteliği kullanın .

    Yani eklemek android:backgroundTint="#5677FC"kardeşime karşı TextView. Hala işe yaramaz. Sonra değiştirmeye çalıştı android:backgroundTintModeetmek src_inve src_atop, ve bir fark yaratmak asla.

Peki, ?attr/selectableItemBackgroundarka plan olarak kullandığımda dalgalanma rengini nasıl değiştirebilirim ? Ben sadece Lollipop ve üstüne odaklanıyorum. Şimdiden teşekkür ederim!

Yanıtlar:


154

Sonunda çözümü buldum: android:colorControlHighlightDoğrudan temada kullanmak yerine SelectableItemBackgroundbaşka bir stil yazmalıyım:

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

Sonra:

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

Son olarak eklemek style="@style/SelectableItemBackground"için ViewLayout.xml içinde.

2016/8/26 TARİHİNDE GÜNCELLENMİŞ N'nin yayımlanmasından sonra, bazen bu yöntemi bir tür View(örneğin, CardView) için dalgalanma rengini ayarlamak için kullanamayacağımızı fark ettim . Şimdi RippleDrawable, geliştiricilere xml olarak da ifade edilebilen kullanmalarını şiddetle tavsiye ediyorum . İşte bir örnek:

Kullanıcı CardViewyukarıdaki API21'e dokunduğunda / tıkladığında bir dalgalanma efekti göstermek istiyorum ve tabii ki Lollipop'tan önce başka türden bir geri bildirim olmalı. Bu yüzden yazmalıyım:

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

ve selectable_item_backgroundde drawableklasörden:

<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_backgroundiçinde drawable-v21klasörün:

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

son olarak, ripple_blackin drawable(veya drawable-v21) klasörü:

<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-->

Bu kadar. Diğer görünümler için belki kullanmalısınız android:background="@drawable/selectable_item_background". Bir set unutmayın OnClickListener, OnTouchListenergörünmez aksi dalgalanma, onlar için olduğu gibi ya da bir şey.


14
Benim için daha iyi işler colorControlHighlightyerine kullanın android:colorControlHighlight, yoksa yalnızca v21 + için
Liuting

1
Bu doğru cevap değil, lütfen aşağıdaki @ harrane cevabına bakınız.
Jin

2
Bir ClickListener ayarlamadıysanız, görünümü tıklanabilir hale getirin clickable="true"ve dalgalanma efekti işe yarayacak
hedisam

58

Pre- ve Lollipop + cihazlarında dalgalanma etkisi

harrane ve Liuting haklı. Kabul edilen cevap en iyi yol değil. Lollipop öncesi ve üstü sürümler için dalgalanma renginin nasıl değiştirileceğini kodda göstermeme izin verin

  1. AppTheme'iniz herhangi bir AppCompat temasından miras almalı ve colorControlHighlight niteliği içermelidir ('android:' öneki olmadan)

    <!-- Application theme. -->
    <style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="colorControlHighlight">#40ffffff</item>
    </style>
  2. Görünümünüz clickable = "true" içermeli (veya programlı olarak ayarlanmış bir tıklama dinleyicisine sahip olmalıdır) ve arka plan "? Attr / selectableItemBackgroundBorderless" veya "? Attr / selectableItemBackground" olmalıdır:

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

Not: Ebeveyn görünümünüzün arka planı beyazsa, beyaz olduğu için dalgalanma etkisini görmezsiniz. Farklı bir renk için colorControlHighlight değerini değiştirin

Ayrıca, farklı etkinliklerde farklı dalga renkleri istiyorsanız, Manifest dosyasındaki her etkinlik için kişisel tema ayarlayabilirsiniz, örneğin:

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

Aynı aktivitede farklı parçalar için farklı dalgalanma renkleri?

Çalışma zamanındaki her parça için Etkinlik Temasının niteliklerini değiştirebilirsiniz. Parça, özel stilinizle şişirilmeden önce bunların üzerine yazın ve mevcut bir Temaya uygulayın:

içinde değerleri / styles.xml

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

Ardından, enflasyondan önceki parçanızda 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;
    }

Bu tarz sadece bu parça için çalışacak


Farklı Görünümler için farklı dalgalanma rengi? (Lolipop +)

colorControlHighlightÖzniteliği kullanarak her görünüm için dalga rengini ayrı ayrı değiştirebilirsiniz, bunları doğrudan bir görünüme uygularsanız çalışmaz :

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

bunu bir tema olarak uygulamalısın:

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

Not: Bazen bu yaklaşım, dalgalanma ile ilgili bilinmeyen sorunlarınız varsa ve çözemiyorsanız yardımcı olur. Benim durumumda, tüm düzen için dalgalanma efektlerini bozan ve bu temayı benim için çalışılan tüm tıklanabilir görünümlere açıkça ekleyen 3. taraf sürgülü kitaplık kullandım.


10

API +21'de renkle dalgalanma efekti ve API -21 için baskıda basit gri arka plan gösteriyor. Bu stili ekleyin:

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

Ve görünüme ayarlayın:

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

3
Bunun gerçekten de yazdığınız gibi android:themeve insanların genellikle kullandığı şey olmadığını fark etmek önemlidir style.
android geliştiricisi


5

Aşağıdaki adımları kullanın:

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"/>

-Stil niteliği, yarattığımız stili çağırır.

-Foreground niteliği, andorid'in varsayılan seçilebilir niteliğini çağırır.

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

Bu kod benim için bir dalgalanma oluşturmak için çalışıyor:

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 niteliğini değiştirmenin herhangi bir yolunu bulamadım. Bu yüzden yukarıdaki gibi yaptım.


0

Koyu siyah temada (veya başka herhangi bir) uygulamada aşağıdaki gibi kullanmaya çalışın önce klasörde oluşturun ripple_effect.xmlve aşağıdaki drawablegibi kod ekleyin

<?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>

ardından Herhangi bir görünümünüze arka planı ayarlayın, Linear layout, Button, TextViewvb.

 <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

Ön plan niteliğini selectableItemBackground olarak ve arka plan niteliğini istediğiniz renk olarak kullanın.

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

1
Böyle yaparak dalgalanma efekti rengini değiştirme seçeneğiniz olmayacak. Soru -How can I modify ripple color when using ?attr/selectableItemBackground as background?
HB.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.