Есть ли способ добавить эффект свечения к виду, например, кнопке или изображению?

#android #android-studio #android-layout #android-xml

Вопрос:

Например, эта кнопка:

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

Я хочу, чтобы он так сиял:

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

Как я могу это сделать без использования кнопки внешней библиотеки?
Кроме того, я бы очень хотел знать, как это сделать и в режиме просмотра изображений. Все, что я смог найти, — это использование внешних кнопок и представлений изображений из библиотек, что в моем случае не подходит.

Заранее большое спасибо!

XML-код кнопки:

 <com.google.android.material.button.MaterialButton
    android:id="@ id/btAddMyCard"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/add_another_my_card"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="24dp"
    android:layout_below="@id/topAppBar"
    style="@style/Widget.App.Button.OutlinedButton" />
 

Ответ №1:

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

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

Возможно, вам потребуется внести некоторые коррективы в вашу ситуацию.

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

Если вы действительно не видите свечение, вот увеличение:

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

Это изображение было создано из пользовательского представления, основанного на кнопке MaterialButton.

 class MyMaterialGlowButton @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null
) : MaterialButton(context, attrs) {
    private val mPaddedRect = RectF()
    private val mBlurRadius = strokeWidth.toFloat() * BLUR_RADIUS_FACTOR

    private val mLinePaint = Paint().apply {
        isAntiAlias = true
        strokeWidth = this@MyMaterialGlowButton.strokeWidth.toFloat()
        style = Paint.Style.STROKE
        color = ROUNDED_RECT_COLOR
    }

    private val mBlurPaint = Paint().apply {
        isAntiAlias = true
        strokeWidth = this@MyMaterialGlowButton.strokeWidth.toFloat()
        style = Paint.Style.STROKE
        color = ROUNDED_RECT_COLOR
        maskFilter = BlurMaskFilter(mBlurRadius, BlurMaskFilter.Blur.NORMAL)
    }

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        val halfStrokeWidth = strokeWidth.toFloat() / 2f
        mPaddedRect.left = halfStrokeWidth   mBlurRadius
        mPaddedRect.top = halfStrokeWidth   mBlurRadius
        mPaddedRect.right = w.toFloat() - halfStrokeWidth - mBlurRadius
        mPaddedRect.bottom = h.toFloat() - halfStrokeWidth - mBlurRadius
    }

    override fun onDrawForeground(canvas: Canvas?) {
        super.onDrawForeground(canvas)
        val corners = cornerRadius.toFloat()
        canvas?.drawRoundRect(mPaddedRect, corners, corners, mBlurPaint)
        canvas?.drawRoundRect(mPaddedRect, corners, corners, mLinePaint)
    }

    private companion object {
        const val ROUNDED_RECT_COLOR = 0xFF2b86e6.toInt()
        const val BLUR_RADIUS_FACTOR = 1.0f
    }
}
 

Используемый XML:

 <androidx.constraintlayout.widget.ConstraintLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.example.blurredline.MyMaterialGlowButton
        android:id="@ id/btAddMyCard"
        style="@style/Widget.App.Button.OutlinedButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:textAllCaps="false"
        android:insetLeft="4dp"
        android:insetRight="4dp"
        android:text="@string/add_another_my_card"
        app:cornerRadius="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
 

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

И стиль. Я не был уверен, каковы ваши ценности, поэтому я использовал эти:

 <style name="Widget.App.Button.OutlinedButton" parent="Widget.MaterialComponents.Button.OutlinedButton">
    <item name="strokeColor">@android:color/transparent</item>
    <item name="strokeWidth">4dp</item>
    <item name="android:textColor">#FF2b86e6</item>
    <item name="cornerRadius">16dp</item>
    <item name="textAllCaps">false</item>
    <item name="fontFamily">sans-serif-light</item>
</style>
 

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

Комментарии:

1. Наконец-то я нашел подходящий ответ! это кажется идеальным, большое спасибо за ваше время и помощь! очень признателен.