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에서 실행되고 있으니, 확실히 가능합니다.
자세한 내용은 소스 코드를 확인하십시오.
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
'programing' 카테고리의 다른 글
SQL*Plus는 SQL Developer가 실행하는 SQL 스크립트를 실행하지 않습니다. (0) | 2023.08.07 |
---|---|
.env 값을 즉시 프로그래밍 방식으로 라벨로 설정하는 방법 (0) | 2023.08.07 |
git clone --mirror를 업데이트하는 방법은 무엇입니까? (0) | 2023.08.07 |
Google Analytics에 아직 동의하지 않은 사용자의 쿠키 사용을 금지하는 설정이 있습니까? (0) | 2023.08.07 |
MySQL JSON: 하위 배열에서 형제 요소의 값 찾기 (0) | 2023.08.07 |