Установите эффект пульсации на изображение

Получил следующий вид изображения:

<ImageView android:id="@+id/header" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:scaleType="centerCrop" app:layout_collapseMode="parallax" android:clickable="true" android:focusable="true" android:background="?android:attr/selectableItemBackground"/> 

Ripple отлично работает, если я не настрою растровое изображение на изображение. Но как только я установил такое растровое изображение, эффект пульсации исчезнет:

 ImageView iv=((ImageView)rootView.findViewById(R.id.header)); iv.setImageBitmap(myBitmap); 

Это мой ripple.xml:

 <ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="?android:colorControlHighlight"> <item android:id="@android:id/mask"> <shape android:shape="oval"> <solid android:color="?android:colorAccent" /> </shape> </item> </ripple> 

Я думаю, что растровое изображение скрывает эффект пульсации, как я могу сделать его видимым? Уже пробовал:

  1. Изменение андроида: фон для android: передний план, который не работал.
  2. Конфигурирование другого прозрачного ImageView поверх этого, но поскольку это была прозрачная пульсация, не было показано.

Есть идеи? Я видел, что Lollipop Contacts сделали это.

У меня есть галерея изображений (построена с помощью RecyclerView и GridLayoutManager ). Изображение устанавливается с помощью Picasso. Чтобы добавить рябь к изображению, я обернул ImageView с помощью FrameLayout . Элемент макета:

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="120dp" android:foreground="@drawable/ripple" android:clickable="true" android:focusable="true" > <ImageView android:id="@+id/grid_item_imageView" android:layout_width="match_parent" android:layout_height="120dp" android:layout_gravity="center" android:scaleType="centerInside" /> </FrameLayout> 

Обратите внимание на android:foreground . Это не то же самое, что android:background . Я пробовал без android:clickable="true" и android:focusable="true" и он также работает , но это не повредит.

Затем добавьте ripple.xml в res/drawable :

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape android:shape="rectangle"> <solid android:color="#7FF5AC8E" /> </shape> </item> <item> <shape android:shape="rectangle"> <solid android:color="@android:color/transparent" /> </shape> </item> </selector> 

Обратите внимание, что при выборе элемента отображается полупрозрачный цвет поверх изображения (для устройств с версией старше Android 5.0). Вы можете удалить его, если вы этого не хотите.

Затем добавьте ripple.xml с возможностью пульсации в res/drawable-v21 :

 <ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/coral"> </ripple> 

Вы можете использовать эффект ripple.xml по умолчанию вместо настраиваемого ripple.xml , но его действительно трудно увидеть поверх изображения, потому что оно серое:

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

Вы можете добиться этого, обернув извлечение в RippleDrawable.

 ImageView iv=((ImageView)rootView.findViewById(R.id.header)); Drawable image = .... // your image. RippleDrawable rippledImage = new RippleDrawable(ColorStateList.valueOf(rippleColor), image, null); iv.setImageDrawable(rippledImage) 

;

Для ленивых людей, таких как я:

Android: передний план = "андроид: атр / selectableItemBackground"

И настройте цвет пульсации в вашем стиле.

В значениях / 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; }