it-roy-ru.com

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

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

<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: фон на Android: передний план, который не работал.
  2. Конфигурирование другого прозрачного ImageView поверх этого, но так как оно было прозрачным, не показывалось.

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

14
Jjang

У меня есть галерея изображений (построена с RecyclerView и GridLayoutManager). Изображение установлено с помощью Пикассо. Чтобы добавить рябь к изображению я обернул 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 drawable в 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 drawable with ripple в res/drawable-v21:

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

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

Android:foreground="?android:attr/selectableItemBackground"
26
Albert Vila Calvo

Вы можете достичь этого, оборачивая нарисованное в 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)

;

5
Gabriele Mariotti

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

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

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

в 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;
}
2
amalBit

С круговым эффектом попробуйте это:

<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:color="@color/colorTema3"
tools:targetApi="Lollipop">
<item Android:id="@Android:id/mask">
    <shape Android:shape="rectangle">
        <solid Android:color="@color/colorPurpleBarra" />
    </shape>
</item>
<item
    Android:id="@Android:id/background"
    Android:drawable="@Android:color/transparent" />

0
Álvaro Agüero