背景として?attr / selectableItemBackgroundを使用しているときにリップルカラーを変更するにはどうすればよいですか?


103

私はいくつかのSOの質問を見てきました、そして彼らは私が望むものを達成するためにいくつかの可能な方法を与えました。例えば:

  1. colorControlHighlightstyles.xmlで属性を使用します。

    これが私のstyles-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_insrc_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"View、layout.xml に追加します。

2016/8/26に更新 Nのリリース後、このメソッドを使用して、ある種のリップルカラーを設定できないことがありますView(たとえば、CardView)。今RippleDrawableでは、XMLでも宣言できるを使用する開発者に強くお勧めします。次に例を示します。

ユーザーがCardView上記のAPI21をタッチ/クリックしたときに波及効果を示したいのですが、もちろんLollipopの前に別の種類のフィードバックがあるはずです。だから私は書くべきです:

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

そして、selectable_item_backgrounddrawableフォルダ:

<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_backgrounddrawable-v21フォルダ:

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

最後に、ripple_blackdrawable(または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"。設定することを忘れないでくださいOnClickListenerOnTouchListenerそうでない場合リップルは表示されません、またはそれらのもののようなもの。


14
colorControlHighlight代わりに使用android:colorControlHighlightしてください。それ以外の場合は、v21以上の場合にのみ使用します
2015年

1
これは正しい答えではありません。以下の@harraneの答えを参照してください。
Jin

2
ClickListenerを設定していない場合は、ビューをクリック可能にするだけclickable="true"で、波及効果が機能します
hedisam

58

Pre-およびLollipop +デバイスでの波及効果

harraneとLiutingは正しいです。受け入れられた答えは最良の方法ではありません。ロリポップ以前のバージョン以降のリップルカラーを変更する方法をコードで示します

  1. AppThemeは、任意のAppCompatテーマから継承し、colorControlHighlight属性を含める必要があります(「android:」プレフィックスなし)。

    <!-- Application theme. -->
    <style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="colorControlHighlight">#40ffffff</item>
    </style>
  2. ビューにはclickable = "true"が含まれている必要があり(またはクリックリスナーがプログラムで設定されている必要があります)、背景は "?attr / selectableItemBackgroundBorderless"または "?attr / selectableItemBackground"である必要があります。

    <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また、リップルに関する未知の問題があり、それを理解できない場合にも、このアプローチが役立つことがあります。私の場合、レイアウト全体のリップル効果を台無しにしたサードパーティのスライディングライブラリを使用し、このテーマをすべてのクリック可能なビューに明示的に追加するとうまくいきました。


10

API +21のカラーでリップル効果を示し、API -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です。
android開発者


4

以下の手順を使用します。

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

-style属性は、作成したスタイルを呼び出します。

-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.xmldrawableフォルダーに作成し、次のようなコードを追加します

<?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?
HB。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.