【问题标题】:Android Gradient border?Android渐变边框?
【发布时间】:2021-03-15 15:40:33
【问题描述】:

任务:

想要完成渐变BORDER...

起始颜色从蓝色圆圈边缘开始,结束颜色在红色环形边缘结束。

我尝试了椭圆形、环形和径向渐变。 我需要从圆的边缘(而不是从中心)开始并扩展到结束颜色的渐变。 我感兴趣的是甚至可以用径向渐变来做到这一点。 我错过了什么?

到目前为止,我是这样的:

<!-- Added shadow -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:width="85dp"
        android:height="85dp">

        <shape
            android:shape="ring"
            android:thickness="10dp"
            android:useLevel="false">

            <gradient
                android:endColor="@android:color/transparent"
                android:gradientRadius="37.5dp"
                android:startColor="@color/colorBlack"
                android:type="radial"></gradient>
        </shape>
    </item>

    <item
        android:width="64dp"
        android:height="64dp"
        android:left="11dp"
        android:top="11dp">

        <shape android:shape="oval">
            <solid android:color="@color/colorPrimaryBlue" />
        </shape>
    </item>
</layer-list>

输出:

原来的问题没有解决。 主要问题是径向渐变从圆心开始,而不是从边缘开始。

还有什么想法吗?

【问题讨论】:

  • 没有正确理解您的问题。看看ibb.co/wYxLP8F你是这样搜索的吗?
  • 我看起来类似于我的输出图像,其中起始颜色为黑色,结束颜色为透明。起始颜色从蓝色圆圈边缘开始。例如,对于您的输出,它应该是从白色到红色。

标签: android gradient radial-gradients


【解决方案1】:

我了解您想要可以描述为圆盘周围的电晕,圆盘为纯色,电晕从圆盘边缘的黑色开始并径向过渡到透明。

我认为您需要使用constructors 为电晕实现一个可绘制的RadialGradient,它允许从磁盘中心指定颜色和色标。

Mark Allison 有一篇题为 RadialGradient – Gradients 的博客文章讨论了 RadialGradients 的使用及其实现。

您可以查看一个类似的实现,它在中心是透明的,从磁盘边缘的黑色开始,然后过渡到单独的颜色。您必须将黑色的起始位置计算为图像整体大小的一部分。



以下是产生所需效果的自定义可绘制对象:

class CoronaDrawable : Drawable() {
    private val mPaint = Paint()
    private var mRadius = 0f
    private val mColors =
        intArrayOf(Color.TRANSPARENT, Color.TRANSPARENT, Color.BLACK, Color.BLACK and 0xFFFFFF)
    private val mStops = floatArrayOf(0f, 0.85f, 0.85f, 1.0f)

    override fun onBoundsChange(bounds: Rect) {
        super.onBoundsChange(bounds)
        mRadius = min(bounds.width(), bounds.height()) / 2f
        mPaint.shader = shaderFactory(mRadius, mRadius, mColors, mStops)
    }

    override fun draw(c: Canvas) {
        c.drawCircle(mRadius, mRadius, mRadius, mPaint)
    }

    override fun setAlpha(alpha: Int) {
    }

    override fun setColorFilter(filter: ColorFilter?) {
    }

    override fun getOpacity(): Int {
        return PixelFormat.OPAQUE
    }

    private fun shaderFactory(centerX: Float, centerY: Float, colors: IntArray, stops: FloatArray) =
        RadialGradient(
            centerX, centerY, min(centerX, centerY), colors, stops, Shader.TileMode.CLAMP
        )
}

在 Android Studio 布局设计器中看起来像这样,作为一个简单 View 的背景:

这里的关键点是中心的空白区域设置为从透明过渡到透明,否则没有变化。这给出了空的中心。在半径的 85% 处,颜色突然变为黑色并过渡为透明黑色。

对于 API 24+,您可以按如下方式将此可绘制对象放入可绘制资源文件中,并像使用常规可绘制对象一样使用它。

corona.xml

<drawable class="com.example.radialgradientwithstops.CoronaDrawable"/>

您必须确定如何最好地将此可绘制对象合并到您的图层列表或应用中的其他表示方式中。

【讨论】:

  • 出色的答案。是的,这实际上是任务和我正在寻找的,并且可以通过编程方式设置低于 24 的 API 的背景,因此可以在没有资源文件夹的情况下以这种方式完成。我想给这个答案+50声誉,不小心给了另一个答案,无法撤销。
  • @I.Step 很高兴听到。我想知道为什么赏金是给另一个答案而不是这个答案,如果这是公认的答案。
  • 再次抱歉,希望同样的错误不要再犯了。
  • 我没有阅读您的全部第一条评论,或者您随后对其进行了编辑。不过不用担心。
【解决方案2】:

试试这个,使用渐变类型“sweep”:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:width="85dp"
        android:height="85dp">

        <shape
            android:shape="oval">

            <gradient
                android:endColor="@android:color/transparent"
                android:startColor="@color/black"
                android:type="sweep" />
        </shape>
    </item>

    <item
        android:width="64dp"
        android:height="64dp"
        android:left="11dp"
        android:top="11dp">

        <shape android:shape="oval">
            <solid android:color="@color/blue" />
        </shape>
    </item>
</layer-list>

【讨论】:

  • 结果就是你上面描述的。渐变在笔划中开始和结束。如果这不是您想要的,请更清楚地描述它
  • 哦,是的,你是对的,这个问题可以通过两种方式来理解。我会编辑它,但最初的意图是从蓝色圆圈边缘到红色圆圈边缘做某种线性渐变。
  • 这个答案意外中奖了,我的错,保持坚强。
【解决方案3】:

试试这个

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<!-- Drop Shadow -->
<item>
    <shape android:shape="oval">
        <padding
            android:bottom="1dp"
            android:left="1dp"
            android:right="1dp"
            android:top="1dp" />

        <solid android:color="#00CCCCCC" />

        <corners android:radius="3dp" />
    </shape>
</item>
<item>
    <shape android:shape="oval">
        <padding
            android:bottom="1dp"
            android:left="1dp"
            android:right="1dp"
            android:top="1dp" />

        <solid android:color="#10CCCCCC" />

        <corners android:radius="3dp" />
    </shape>
</item>
<item>
    <shape android:shape="oval">
        <padding
            android:bottom="1dp"
            android:left="1dp"
            android:right="1dp"
            android:top="1dp" />

        <solid android:color="#20CCCCCC" />

        <corners android:radius="3dp" />
    </shape>
</item>
<item>
    <shape android:shape="oval">
        <padding
            android:bottom="1dp"
            android:left="1dp"
            android:right="1dp"
            android:top="1dp" />

        <solid android:color="#30CCCCCC" />

        <corners android:radius="3dp" />
    </shape>
</item>
<item>
    <shape android:shape="oval">
        <padding
            android:bottom="1dp"
            android:left="1dp"
            android:right="1dp"
            android:top="1dp" />

        <solid android:color="#50CCCCCC" />

        <corners android:radius="3dp" />
    </shape>
</item>

<!-- Background Color (white) -->
<item>
    <shape android:shape="oval">
        <solid android:color="@android:color/holo_blue_dark" />

        <corners android:radius="3dp" />
    </shape>
</item>
</layer-list>

但我建议使用具有椭圆形和高度的可绘制对象。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape android:shape="oval">
        <solid android:color="@android:color/white"/>
    </shape>
</item>
</layer-list>

android:elevation="@dimen/elevation_fab"

否则,FAB 也是一个 Ideal 推荐。

【讨论】:

  • Elevation 不适用于椭圆形,可能它适用于材料工厂按钮,但来自@Cheticamp 的答案已经过测试并且可以使用自定义颜色,所以我会将其作为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 2019-05-23
相关资源
最近更新 更多