2017-01-09 13 views
0

Я создаю пользовательский вид кнопки, который имеет градиентную границу, закругленные углы и прозрачный фон. Я устанавливаю фон кнопки на 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?

Моя кнопка выглядит следующим образом:

enter image description here

То, что я действительно хочу, чтобы достичь

Создание 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, он возвращает пустой прозрачный прозрачный инструмент без каких-либо эффектов пульсации.

+1

В кнопке XML вы пробовали «android: foreground =»? Android: attr/selectableItemBackground "' –

+1

Это работает, шаг ближе к решению. Только проблема, пульсация игнорирует закругленные углы. –

+0

Это связано с тем, что рябь идет к границам самой кнопки, не уверен, но есть ли способ обрезать границы во внешности градиентного штриха? –

ответ

2

В качестве фона вашей пользовательской кнопки вы должны использовать RippleDrawable. У слоя RippleDrawable есть слой маски, который вы ищите. Для этого в программе, вы можете создать RippleDrawable так:

float[] outerRadii = new float[8]; 
Arrays.fill(outerRadii, height/2); 

RoundRectShape shape = new RoundRectShape(outerRadii, null, null); 
ShapeDrawable mask = new ShapeDrawable(shape); 

ColorStateList stateList = ColorStateList.valueof(ContextCompat.getColor(getContext(), R.color.ripple)); 

setBackground(new RippleDrawable(stateList, getBackgroundDrawable(), mask); 

Имейте в виду, что RippleDrawable доступна только для уровня API 21+, так что если вы ищете для поддержки старых версий, а вам нужно будет падать назад к чему-то еще; возможно android.R.attr.selectableItemBackground или StateListDrawable, что даст вашей кнопке базовый «нажатый» фон для более старых версий платформы.

+0

Этот ответ лучше моих комментариев - должен быть принят как правильный ответ –

+0

Я думаю, что я хочу, я скоро проверю это! Благодаря! –

+0

Когда я использую эту пульсацию, это просто прозрачная пленка, и ничего не происходит, когда вы ее нажимаете. Я не могу понять, как работает RippleDrawable. –

 Смежные вопросы

  • Нет связанных вопросов^_^