私はいくつかのSO質問を見てきましたが、彼らは私が望むものを達成するためのいくつかの可能な方法を与えました。例えば:
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
に変更しようとしましたが、どちらも役に立ちません。
レイアウトでbackgroundTint
属性を使用します。
そこで、Android:backgroundTint="#5677FC"
をTextView
に追加します。まだ役に立たない。それからAndroid:backgroundTintMode
をsrc_in
とsrc_atop
に変更しようとしましたが、違いはありません。
したがって、?attr/selectableItemBackground
を背景として使用する場合、どのようにリップルの色を変更できますか。 Lollipop以上にのみ焦点を当てています。前もって感謝します!
最後に、解決策を見つけました。テーマSelectableItemBackground
でAndroid: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"
を使用する必要があります。 OnClickListener
、OnTouchListener
、またはそれらのようなものを設定することを忘れないでください。そうしないと、リップルは表示されません。
ハラーンとリウティングは正しい。受け入れられた答えは最善の方法ではありません。 pre-Lollipopバージョン以上のリップルカラーを変更する方法をコードで示します
AppThemeはAppCompatテーマを継承し、colorControlHighlight属性を含む必要があります(「Android:」プレフィックスなし)
<!-- Application theme. -->
<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="colorControlHighlight">#40ffffff</item>
</style>
ビューに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"/>
追伸また、リップルに関する未知の問題があり、それを把握できない場合にも、このアプローチが役立つ場合があります。私の場合、サードパーティのスライディングライブラリを使用してレイアウト全体の波及効果を台無しにし、このテーマをすべてのクリック可能なビューに明示的に追加しました。
受け入れられた答えは間違っています。
正しい使用方法は、Liutingがコメントで述べたことです。デフォルトのcolorControlHighlight
をcolorControlHighlight
から変更するには、Android:colorControlHighlight
の代わりにAppCompat
を使用します
* http://Android-developers.blogspot.co.uk/2014/10/appcompat-v21-material-design-for-pre.html を参照してください=テーマセクションで*
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" />
このコードは、波紋を作成するのに役立ちます:
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属性を変更する方法が見つかりませんでした。それが私が上記のようにした理由です。
ダークブラックテーマ(またはその他)のアプリでは、最初に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" />
前景属性をselectableItemBackgroundとして使用し、背景属性を希望の色として使用します。
Android:foreground="?attr/selectableItemBackground"
Android:layout_height="wrap_content"
Android:layout_width="match_parent"
Android:background="@color/white"