? attr / selectableItemBackground를 배경으로 사용할 때 잔물결 색상을 어떻게 수정할 수 있습니까?


103

나는 몇 가지 질문을 보았고 내가 원하는 것을 달성하기 위해 가능한 몇 가지 방법을 제공했습니다. 예를 들면 :

  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:backgroundTintModesrc_in하고 src_atop, 그들은 변화를하지 않습니다.

그래서 ?attr/selectableItemBackground배경으로 사용할 때 잔물결 색상을 어떻게 바꿀 수 있습니까 ? 나는 Lollipop 이상에만 집중합니다. 미리 감사드립니다!

답변:


154

마지막으로 해결책을 찾았습니다. android:colorControlHighlighttheme 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"Viewlayout.xml에.

2016년 8월 26일 갱신 N의 출시 후, 나는 가끔 우리는 어떤 종류의 리플 색상을 설정하려면이 방법을 사용할 수 없습니다 발견 View(예를 들어,을 CardView). 이제는 RippleDrawablexml로 선언 할 수 있는를 사용 하는 개발자를 적극 권장 합니다. 다음은 예입니다.

사용자가 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_background에서 drawable폴더 :

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

마지막으로 ripple_blackin drawable(또는 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표시되지 않습니다 달리 리플, 그들을 위해 것과 같은 또는 뭔가를.


14
colorControlHighlight대신 사용하면 android:colorControlHighlight더 잘 작동합니다. 그렇지 않으면 v21 +에만 적용됩니다.
Liuting

1
이것은 정답이 아닙니다. 아래 @harrane의 답변을 참조하십시오.
Jin

2
당신이에 ClickListener를 설정하지 한 경우에는 바로보기 클릭을 clickable="true"하고 파급 효과가 작동합니다
hedisam

58

사전 및 Lollipop + 기기의 파급 효과

harrane과 Liuting이 옳습니다. 받아 들여진 대답은 최선의 방법이 아닙니다. 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 값 변경

또한 다른 활동에 대해 다른 잔물결 색상을 원하는 경우 Manifest 파일의 각 활동에 대해 개인 테마를 설정할 수 있습니다. 예를 들면 다음과 같습니다.

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

추신 또한 때때로이 접근 방식은 리플과 관련하여 알려지지 않은 문제가있어이를 파악할 수없는 경우에 도움이됩니다. 제 경우에는 전체 레이아웃에 대한 파급 효과를 엉망으로 만든 타사 슬라이딩 라이브러리를 사용하고이 테마를 모든 클릭 가능한 뷰에 명시 적으로 추가했습니다.


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.
안드로이드 개발자


5

아래 단계를 사용하십시오.

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

-스타일 속성은 우리가 만든 스타일을 호출합니다.

-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.xml에서 먼저 아래와 같은 drawable폴더를 만들고 다음과 같은 코드를 추가하십시오.

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

그런 다음 배경을 Any view 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.