programing

Android 롤리팝 카드 보기에 미치는 파급 효과

newstyles 2023. 8. 7. 22:23

Android 롤리팝 카드 보기에 미치는 파급 효과

여기 Android Developers 페이지에 설명된 대로 Activity XML 파일에서 Android:backgound 속성을 설정하여 터치 시 파급 효과를 표시하도록 CardView를 시도하고 있지만 작동하지 않습니다.애니메이션은 전혀 없지만 onClick의 메서드가 호출됩니다.여기서 제안한 바와 같이 riple.xml 파일도 만들어 보았지만 결과는 같습니다.

활동의 XML 파일에 나타나는 CardView:

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="155dp"
    android:layout_height="230dp"
    android:elevation="4dp"
    android:translationZ="5dp"
    android:clickable="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:onClick="showNotices"
    android:background="?android:attr/selectableItemBackground"
    android:id="@+id/notices_card"
    card_view:cardCornerRadius="2dp">

</android.support.v7.widget.CardView> 

저는 안드로이드 개발에 비교적 익숙하지 않아서 몇 가지 명백한 실수를 했을 수도 있습니다.

당신은 추가합다니야에 해야 합니다.CardView:

android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"

저는 다음을 통해 카드 뷰에 대한 파급 효과를 얻을 수 있었습니다.

<android.support.v7.widget.CardView 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:clickable="true" 
    android:foreground="@drawable/custom_bg"/>

그리고 위의 코드에서 볼 수 있는 custom_bg의 경우, 롤리팝(drawable-v21 패키지) 및 pre-drawableipop(drawable 패키지) 장치 모두에 대한 xml 파일을 정의해야 합니다.drawable-v21 패키지의 custom_bg의 경우 코드는 다음과 같습니다.

<ripple 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:attr/colorControlHighlight">
<item
    android:id="@android:id/mask"
    android:drawable="@android:color/white"/>
</ripple>

그리기 가능 패키지의 custom_bg에 대해 코드는 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_pressed="true">
    <shape>
        <solid android:color="@color/colorHighlight"></solid>
    </shape>
</item>
<item>
    <shape>
        <solid android:color="@color/navigation_drawer_background"></solid>
    </shape>
</item>
</selector>

따라서 프리클릭팝 장치에서는 견고한 클릭 효과를 얻을 수 있고 막대사탕 장치에서는 카드 보기에 파급 효과를 가져올 수 있습니다.

당신이 사용하고 있는 앱 호환 지원 라이브러리에서 리플 효과가 누락되었습니다.리플을 보고 싶다면 Android L 버전을 사용하고 Android L 기기에서 테스트합니다.AppCompat v7 사이트별:

"왜 롤리팝 이전에는 파문이 없습니까?RippleDrawable을 원활하게 실행할 수 있는 많은 요소는 Android 5.0의 새로운 RenderThread입니다.이전 버전의 Android에서 성능을 최적화하기 위해 RippleDrawable은 일단 제외했습니다."

자세한 내용은 여기에서 이 링크를 확인하십시오.

이 ㅠㅠminSdkVersion현재 작업 중인 레벨 9는 다음과 같습니다.

android:foreground="?selectableItemBackground"
android:clickable="true"

대신 레벨 11부터 다음을 사용합니다.

android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"

설명서에서:

클릭 가능 - 이 보기가 클릭 이벤트에 반응하는지 여부를 정의합니다."true" 또는 "false" 부울 값이어야 합니다.

전경 - 내용 위로 그릴 그리기 테이블을 정의합니다.오버레이로 사용할 수 있습니다.중력이 채우기로 설정된 경우 전경 그리기 가능한 내용은 내용 패딩에 참여합니다.

재료 카드 보기를 대신 사용하면 카드 보기를 확장하고 기본 클릭 가능 효과를 포함한 여러 가지 새로운 기능을 제공합니다.

<com.google.android.material.card.MaterialCardView>

...

</com.google.android.material.card.MaterialCardView>

종속성(API 14까지 사용하여 이전 장치를 지원할 수 있음):

implementation 'com.google.android.material:material:1.0.0'

저의 경우, 추가.foreground로.CardView작동하지 않았습니다(이유를 알 수 없음:/)

동일한 것을 자식 레이아웃에 추가하면 효과가 있었습니다.

코드:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:focusable="true"
    android:clickable="true"
    card_view:cardCornerRadius="@dimen/card_corner_radius"
    card_view:cardUseCompatPadding="true">

    <LinearLayout
        android:id="@+id/card_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:foreground="?android:attr/selectableItemBackground"
        android:padding="@dimen/card_padding">

    </LinearLayout>
</android.support.v7.widget.CardView>

버튼, 선형 레이아웃 또는 CardView와 같은 모든 보기에 이 두 가지 코드 작업을 추가합니다. 이 두 줄만 입력하면 마법을 볼 수 있습니다.

android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"

다음을 xml에 추가합니다.

android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"

어댑터에 추가(사용자의 경우)

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            val attrs = intArrayOf(R.attr.selectableItemBackground)
            val typedArray = holder.itemView.context.obtainStyledAttributes(attrs)
            val selectableItemBackground = typedArray.getResourceId(0, 0)
            typedArray.recycle()

            holder.itemView.isClickable = true
            holder.itemView.isFocusable = true
            holder.itemView.foreground = holder.itemView.context.getDrawable(selectableItemBackground)
        }
    }

CardView에 어댑터 항목의 모든 구성 요소를 포함하는 RelativeLayout 또는 LinearLayout과 같은 루트 레이아웃이 있는 경우 해당 루트 레이아웃에서 배경 속성을 설정해야 합니다.예:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="122dp"
android:layout_marginBottom="6dp"
android:layout_marginLeft="6dp"
android:layout_marginRight="6dp"
card_view:cardCornerRadius="4dp">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/touch_bg"/>
</android.support.v7.widget.CardView>

프로그래밍 방식으로 생성된 CardView(또는 CardView를 확장하는 CardView 사용자 정의 보기)가 RecyclerView에 표시되는 경우 파급 효과가 작동하지 않는 문제에 대한 해결책을 찾는 사람들에게는 다음과 같은 방법이 효과적이었습니다.기본적으로 XML 레이아웃 파일에서 다른 답변에 언급된 XML 특성을 선언하는 것은 프로그래밍 방식으로 생성된 CardView 또는 사용자 지정 레이아웃에서 생성된 CardView에는 작동하지 않으므로(루트 뷰가 CardView이거나 병합 요소를 사용하더라도) 다음과 같이 프로그래밍 방식으로 설정해야 합니다.

private class MadeUpCardViewHolder extends RecyclerView.ViewHolder {
    private MadeUpCardView cardView;

    public MadeUpCardViewHolder(View v){
        super(v);

        this.cardView = (MadeUpCardView)v;

        // Declaring in XML Layout doesn't seem to work in RecyclerViews
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            int[] attrs = new int[]{R.attr.selectableItemBackground};
            TypedArray typedArray = context.obtainStyledAttributes(attrs);
            int selectableItemBackground = typedArray.getResourceId(0, 0);
            typedArray.recycle();

            this.cardView.setForeground(context.getDrawable(selectableItemBackground));
            this.cardView.setClickable(true);
        }
    }
}

어디에MadeupCardView extends CardView다음을 위한 이 대답에 대해 칭찬합니다.TypedArray일부.

안드로이드용 리플 이벤트Cardview컨트롤:

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:foreground="?android:attr/selectableItemBackground"
    android:clickable="true"
    android:layout_marginBottom="4dp"
    android:layout_marginTop="4dp" />
  android:foreground="?android:attr/selectableItemBackgroundBorderless"
   android:clickable="true"
   android:focusable="true"

작동 중인 api 21만 사용하고 이 목록 행 카드 보기 사용 안 함

AppCompat이 마음에 들지 않아 직접 CardView를 작성하고 리플을 백포트했습니다.여기 진저브레드와 함께 갤럭시S에서 실행되고 있으니, 확실히 가능합니다.

Demo of Ripple on Galaxy S

자세한 내용은 소스 코드를 확인하십시오.

Card 보기(Children)에 요소를 삽입하려면 다음을 사용할 수 있습니다.

<ImageView
android:background="?android:attr/selectableItemBackground"

그러나 전체 카드 보기가 필요한 경우 다음과 같이 하십시오.

android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"

둘 다 사용하면 나머지보다 색이 더 진합니다.

하지만 가장 쉬운 방법은

com.google.android.material.card.MaterialCardView

언급URL : https://stackoverflow.com/questions/26942434/ripple-effect-on-android-lollipop-cardview