Я создаю пользовательский вид кнопки, который имеет градиентную границу, закругленные углы и прозрачный фон. Я устанавливаю фон кнопки на Drawable сгенерирован следующий код:Получить эффект пульсации на прозрачный пользовательский вид кнопки
protected Drawable getBackgroundDrawable() {
GradientDrawable backgroundDrawable = new GradientDrawable(
mOrientation,
mGradientColors);
backgroundDrawable.setCornerRadius(getHeight()/2);
backgroundDrawable.setShape(GradientDrawable.RECTANGLE);
if (!mFilled) {
Bitmap background = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
Canvas backgroundCanvas = new Canvas(background);
backgroundCanvas.drawARGB(0, 0, 0, 0);
backgroundDrawable.setBounds(0, 0, getWidth(), getHeight());
backgroundDrawable.draw(backgroundCanvas);
Paint rectPaint = new Paint();
rectPaint.setAntiAlias(true);
rectPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
backgroundCanvas.drawRoundRect(new RectF(mStroke, mStroke,
getWidth() - mStroke,
getHeight() - mStroke),
getHeight()/2,
getHeight()/2,
rectPaint);
return new BitmapDrawable(getResources(), background);
} else {
return backgroundDrawable;
}
}
Единственная проблема, при нажатии на кнопке сейчас, у вас нет обратной связи. Как я могу добавить эффект пульсации в конце кнопки, когда я уже использую сгенерированный drawable в качестве фона? Нужно ли мне что-то делать с LayerDrawable?
Моя кнопка выглядит следующим образом:
То, что я действительно хочу, чтобы достичь
Создание Drawable программными, который имеет тот же результат, как этот XML Drawable, где этот пункт в элемент пульсации - мой сгенерированный Drawable на изображении выше:
<ripple android:color="@android:color/black" xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/background"></item>
</ripple>
Что я пробовал
Теперь я попытался сделать RippleDrawable в сочетании с GradientDrawable, чтобы воссоздать XML-код выше. Очень легко, я подумал:
GradientDrawable gradientDrawable = new GradientDrawable();
gradientDrawable.setColor(Color.TRANSPARENT);
gradientDrawable.setStroke(mStroke, Color.GREEN);
gradientDrawable.setCornerRadius(getHeight()/2);
ColorStateList rippleStateList = ColorStateList.valueOf(Color.BLUE);
return new RippleDrawable(rippleStateList, gradientDrawable, gradientDrawable);
Это возвращает простой переносимый с зеленым штрихом. Однако, когда вы нажимаете на нее, ничего не происходит. В отличие от XML, где вы четко видите эффект пульсации над границей. Когда я устанавливаю третий параметр на null
, тот же эффект. Когда я устанавливаю только второй параметр в null
, он возвращает пустой прозрачный прозрачный инструмент без каких-либо эффектов пульсации.
В кнопке XML вы пробовали «android: foreground =»? Android: attr/selectableItemBackground "' –
Это работает, шаг ближе к решению. Только проблема, пульсация игнорирует закругленные углы. –
Это связано с тем, что рябь идет к границам самой кнопки, не уверен, но есть ли способ обрезать границы во внешности градиентного штриха? –