Выполнить эффект ряби для длинных кликов - PullRequest
0 голосов
/ 30 августа 2018

В настоящее время я реализую приложение, в котором есть RecyclerView, в котором есть несколько пользовательских представлений. Из каждого из этих представлений пользователь может открыть контекстное меню (которое требует длинного щелчка), но это довольно сложно понять, как правило, они просто выполняют простой щелчок, а затем думают, что больше ничего к этому. Но если мне удастся дать некоторую обратную связь UI , это может быть намного яснее. Идея заключается в простой анимации пульсации, которая выделяет фон, который не может быть выполнен простым щелчком, но который проделывает весь путь для длительного действия щелчка.

Поскольку я застрял в этом в течение двух дней, я провел свое исследование и обнаружил некоторые SO вопросы, задающие одно и то же, например, этот один из Чеок Ян Ченга очень хорошо написан, и он даже опубликовал видео, показывающее желаемый эффект (мой вопрос почти такой же), но нет хороших ответов, так как первый говорит, что мы должны использовать ?attr/selectableItemBackground, но данный эффект отличается от того, к которому я стремлюсь, и Я попробовал второй, он ничего не делает для простого щелчка, когда вы запускаете анимацию в onLongClick.

РЕДАКТИРОВАТЬ:

Обратите внимание, что ожидаемое поведение не может быть достигнуто ни с помощью ?attr/selectableItemBackground, ни путем создания XML-файла ряби, а затем установить его в качестве фона, так как это даст обычную анимацию onClick и анимацию longClick, отличную от желаемой, посмотрите на это видео для просмотра желаемого эффекта.

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Попробуйте сначала сделать эффект ряби xml

ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:color="@color/light_gray"
tools:targetApi="lollipop">
<item android:id="@android:id/mask">
    <shape android:shape="rectangle">
        <solid android:color="@color/light_gray"/>
    </shape>
</item>
</ripple>

чем ваш адаптер decalr xml родительский макет как LinearLayout или если использовать RelativLayout установить фон как показано ниже

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple"
>......
0 голосов
/ 30 августа 2018

Попробуйте выполнить следующие действия, это может помочь:

Шаг 1:

Создать ripple.xml в Drawable: (Это для Android> = v21)

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:colorControlHighlight">
    <item android:id="@android:id/mask">
        <color android:color="@android:color/transparent" /> 
    </item>
</ripple>

В этой строке <color android:color="@android:color/transparent" /> сделает вашу кнопку прозрачной.

Шаг 2:

в вашем item.xml, где я использовал ConstraintLayout:

<Button
     android:id="@+id/btnItemClickOnRecyclerView"
     android:layout_width="0dp"
     android:layout_height="0dp"
     android:layout_centerInParent="true"
     android:layout_marginTop="16dp"
     android:background="@drawable/ripple"
     android:paddingBottom="4dp"
     android:text="@string/view_details"
     android:textColor="@color/White"
     android:textSize="14sp"
     android:textStyle="bold"
     app:layout_constraintEnd_toEndOf="parent"
     app:layout_constraintStart_toStartOf="parent"
     app:layout_constraintTop_toTopOf="parent"
     app:layout_constraintBottom_toBottomOf="parent" /> 

И это все.

Поскольку ваша кнопка будет полностью покрывать ваш Предмет и будет зависать над другим видом, она будет действовать как элемент.

Чтобы реализовать прослушиватель longClick на кнопке, обязательно зарегистрируйте его в держателе, а затем holder.button.setOnLongClick ......

Попробуйте, если есть сомнения, прокомментируйте.

0 голосов
/ 30 августа 2018

Создайте xml-файл с именем ripple.xml, а затем установите ripple.xml в качестве переднего плана вашего представления. Это будет работать как шарм !!!

<?xml version="1.0" encoding="utf-8"?>
<!-- An white rectangle ripple. -->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="#3fce29"
    tools:targetApi="lollipop">
    <item
        android:id="@android:id/mask"
        android:gravity="center">
        <shape android:shape="rectangle">
            <solid android:color="#3fce29"/>
        </shape>
    </item>
</ripple>
...