web-dev-qa-db-ja.com

?attr / selectableItemBackgroundを背景として使用する場合、どのようにリップルカラーを変更できますか?

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

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

    ここに私の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:backgroundTintModesrc_insrc_atopに変更しようとしましたが、違いはありません。

したがって、?attr/selectableItemBackgroundを背景として使用する場合、どのようにリップルの色を変更できますか。 Lollipop以上にのみ焦点を当てています。前もって感謝します!

83
ywwynm

最後に、解決策を見つけました。テーマSelectableItemBackgroundAndroid:colorControlHighlightを直接使用する代わりに、別のスタイルを作成する必要があります。

<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"をlayout.xmlのViewに追加します。

2016/8/26に更新 Nのリリース後、このメソッドを使用して、ある種のView(たとえば、CardView )。ここで、XMLでも宣言できるRippleDrawableを使用する開発者を強くお勧めします。以下に例を示します。

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

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

drawableフォルダー内のselectable_item_background

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

最後に、drawable(またはripple_black)フォルダーの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、またはそれらのようなものを設定することを忘れないでください。そうしないと、リップルは表示されません。

114
ywwynm

Pre-およびLollipop +デバイスでのリップル効果

ハラーンとリウティングは正しい。受け入れられた答えは最善の方法ではありません。 pre-Lollipopバージョン以上のリップルカラーを変更する方法をコードで示します

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

同じアクティビティ内の異なるフラグメントの異なる波紋色?

実行時にフラグメントごとにアクティビティテーマの属性を変更できます。フラグメントがカスタムスタイルで拡張される前にそれらを上書きし、現在のテーマに適用します。

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

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

51
Kirill Karmazin

受け入れられた答えは間違っています。

正しい使用方法は、Liutingがコメントで述べたことです。デフォルトのcolorControlHighlightcolorControlHighlightから変更するには、Android:colorControlHighlightの代わりにAppCompatを使用します

* http://Android-developers.blogspot.co.uk/2014/10/appcompat-v21-material-design-for-pre.html を参照してください=テーマセクションで*

5
harrane

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" />
2
Mahdi Khansari

このコードは、波紋を作成するのに役立ちます:

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
Mika

ダークブラックテーマ(またはその他)のアプリでは、最初にdrawableフォルダーにripple_effect.xmlフォルダーを作成し、次のようなコードを追加してください。

<?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などのように、Anyビューに背景を設定します。

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

前景属性をselectableItemBackgroundとして使用し、背景属性を希望の色として使用します。

Android:foreground="?attr/selectableItemBackground"
    Android:layout_height="wrap_content"
    Android:layout_width="match_parent"
    Android:background="@color/white"
0
Titto Jose