Изменение цвета FAB с эффектом пульсации

В Android, я хочу сделать что-то вроде этого (но с двумя чередующимися цветами черно-белые:

Изменение цвета с эффектом пульсации

Введите описание изображения здесь

Я попытался сделать так:

1) установить значение по умолчанию backgroundTint & ripple color через XML

app:backgroundTint="@android:color/black" app:rippleColor="@android:color/white" 

2) в методе onclick, изменил backgroundTint на белый и рябь цвета на черный

Установите строку для начального цвета, то есть high_color = "black" . тогда,

 fab.setOnClickListener(new View.OnClickListener() { @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onClick(View v) { if(high_color.equals("black")){ fab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(getApplicationContext(), R.color.white))); fab.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(getApplicationContext(), R.color.black))); fab.setRippleColor(ContextCompat.getColor(getApplicationContext(), R.color.black)); high_color = "white"; }else { fab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(getApplicationContext(), R.color.black))); fab.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(getApplicationContext(), R.color.white))); fab.setRippleColor(ContextCompat.getColor(getApplicationContext(), R.color.whites)); high_color = "black"; } } }); 

Теперь я получаю что-то вроде этого:

Я получаю это

Введите описание изображения здесь

Есть ли все-таки, чтобы это выглядело как первое? Например, замедляя скорость анимации пульсаций или что-то в этом роде?

Я думаю, что вы должны использовать селекторные селектора, которые легко изменяют фон.

Использовать селектора схожим образом

<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@android:color/white" state_enabled="true "/> <item android:color="@android:color/black" state_enabled="false "/> </selector>

Используйте это как фон FAB

app:background ="@drawable/selector"

Это сделает белый цвет в качестве фона, когда он будет затенен.Если это будет черным, в селекторах будет много других кодов android. Читайте о селекторах на Android-разработчиках. Ответьте мне, если это действительно помогло вам.

Ну, никогда не пробовал это на FAB, но я реализовал то же самое на ImageButton для простоты, как показано ниже, и это работает. Надеюсь, поможет. Это ориентировано на API, s больше 21 (Lollipop). У моего ImageButton по умолчанию по умолчанию 6dp, и при касании он будет увеличен до 18dp (6dp + 12dp), который вы можете изменить, если вам нужно в lift_on_touch.xml . Кроме того, я использую StateListAnimator, который изменяется в зависимости от изменения состояния ImageButton.

 <ImageButton android:id="@+id/share_fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="16dp" android:background="@drawable/ripples_on_touch" android:elevation="6dp" android:padding="16dp" android:src="@drawable/ic_share_white_24dp" android:stateListAnimator="@animator/lift_on_touch" tools:targetApi="lollipop" /> 

v21 / ripples_on_touch.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="#F83E0ACC" tools:targetApi="lollipop"> <item> <shape android:shape="oval"> <solid android:color="#FFFF6F00" /> </shape> </item> </ripple> 

v21 / lift_on_touch.xml

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <set> <objectAnimator android:duration="@android:integer/config_longAnimTime" android:propertyName="scaleX" android:valueTo="1.250" android:valueType="floatType" /> <objectAnimator android:duration="@android:integer/config_longAnimTime" android:propertyName="scaleY" android:valueTo="1.250" android:valueType="floatType" /> <objectAnimator android:duration="@android:integer/config_longAnimTime" android:propertyName="translationZ" android:valueTo="12dp" android:valueType="floatType" /> </set> </item> <item> <set> <objectAnimator android:duration="@android:integer/config_longAnimTime" android:propertyName="scaleX" android:valueTo="1.0" android:valueType="floatType" /> <objectAnimator android:duration="@android:integer/config_longAnimTime" android:propertyName="scaleY" android:valueTo="1.0" android:valueType="floatType" /> <objectAnimator android:duration="@android:integer/config_longAnimTime" android:propertyName="translationZ" android:valueTo="0dp" android:valueType="floatType" /> </set> </item> </selector>