Android中的椭圆渐变

时间:2010-08-20 01:25:03

标签: android graphics gradient shape

我知道如何设置和显示椭圆形状。我知道如何将渐变应用于此形状。我无法弄清楚我是如何得到一个椭圆形渐变来匹配形状的。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="oval" >
    <gradient
        android:startColor="#66FFFFFF"
        android:endColor="#00FFFFFF"
        android:gradientRadius="100"
        android:type="radial" />
</shape>

如果你能想象,这个渐变在中间有一个半透明的白色发光,然后在边缘渐渐变为alpha零。我需要让它以椭圆形状出现,而不仅仅是圆形渐变。我怎样才能做到这一点?

5 个答案:

答案 0 :(得分:3)

我建议采用更“直接”的绘图方法。如果你可以逐像素地绘制渐变,那么你需要记住

  • 渐变颜色与r
  • 成比例
  • 椭圆(椭圆形)渐变颜色与r1+r2
  • 成比例

下面:

r - 到圆心的距离

r1,r2 - 到椭圆的两个焦点的距离

修改 考虑这个Pixel Shader代码:

uniform sampler2D tex;

void main()
{
    vec2 center = vec2(0.5,0.5);
    float len = 1.3*(distance(gl_TexCoord[0].xy,center));
    vec2 foc1 = vec2(len,0.);
    vec2 foc2 = vec2(-len,0.);
    float r = distance(center+foc1,gl_TexCoord[0].xy) +
             distance(center+foc2,gl_TexCoord[0].xy);
    float k = pow(r*0.9,1.3);
    vec4 color = vec4(k,k,k,1.);
    gl_FragColor = color;
}

你会得到像这样的椭圆形: alt text

祝你好运

答案 1 :(得分:2)

这很困难,因为以这种方式定义的drawable在运行时绘制,适应你放入它们的空间。如果必须在代码中执行此操作,最佳解决方案是采用您在XML中定义的可绘制形状并将其绘制到Canvas或Bitmap作为完美的圆形。此时,渐变图案将遵循形状轮廓。一旦将形状绘制到静态上下文中,您就可以将形状添加到视图中(作为背景,比如说),当它试图适合视图边界时会将其扭曲成椭圆形。由于你有一个图像,整个事物会成比例地扭曲。

希望这种方法不会太糟糕。

答案 2 :(得分:1)

<?xml version="1.0" encoding="utf-8"?>

<stroke android:width="1dp" android:color="#ffffffff" />

<size
    android:width="40dp"
    android:height="40dp"/>

<gradient
    android:type="radial"
    android:startColor="#ffff0000"
    android:endColor="#330000ff"
    android:gradientRadius="40dp"
    android:angle="270"
    android:centerX=".5"
    android:centerY=".5"/>

答案 3 :(得分:0)

“愚蠢但工作”的方法是绘制椭圆轮廓​​,然后绘制多个具有相同“中心”的嵌套椭圆,其大小和颜色随着椭圆变小而变化,一直到一像素椭圆。 如果您自定义渐变编码,请在HSV中插入颜色,而不是RVB!

答案 4 :(得分:0)

我发现的另一种解决方法是使用 scaleX="1.x" 或 scaleY="1.x"。然而,这与形状不符。