我知道如何设置和显示椭圆形状。我知道如何将渐变应用于此形状。我无法弄清楚我是如何得到一个椭圆形渐变来匹配形状的。
<?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零。我需要让它以椭圆形状出现,而不仅仅是圆形渐变。我怎样才能做到这一点?
答案 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;
}
你会得到像这样的椭圆形:
祝你好运答案 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"。然而,这与形状不符。