Android中的椭圆渐变

我知道如何设置和显示一个椭圆形状。 我知道如何在这个形状上应用渐变。 我无法弄清楚的是,我怎样才能得到一个椭圆形的渐变来匹配形状。

<?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> 

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

Solutions Collecting From Web of "Android中的椭圆渐变"

这是很困难的,因为这种方式定义的drawable在运行时自行绘制,适应你放入的空间。最好的解决方法是,如果你必须在代码中做这个,那么就是用你在XML中定义的drawable来绘制它到一个canvas或一个完美的圆形位图。 此时,渐变图案将遵循形状轮廓。 一旦形状被绘制到静态上下文中,您可以将形状添加到视图中(作为背景,比方说,),当它试图适合视图边界时,会将其变形为椭圆形。 既然你有一个形象,整个事情就会相应地扭曲。

希望这个方法不会像素太差。

我会build议更多的“直接”绘图方法。 如果您可以逐个像素地绘制渐变,那么您只需要记住这一点即可

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

这里:

r – 到圆心的距离

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

编辑:考虑这个像素着色器代码:

 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; } 

你会得到这样的椭圆形: 替代文字

祝你好运

 <?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"/> 

一个“哑巴但工作”的方式是绘制椭圆轮廓​​,然后是大量嵌套的椭圆,它们的大小和颜色随着椭圆变小而变化,一直到一个像素椭圆。 如果您自定义您的渐变代码,插入HSV中的颜色,而不是在RVB!