2010-08-20 161 views
11

我知道如何設置和顯示橢圓形狀。我知道如何在這個形狀上應用漸變。我無法弄清楚的是我如何獲得橢圓形漸變以匹配形狀。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> 

如果你可以想象,這個漸變在中間有一個半透明的白色輝光,然後在邊緣淡出到alpha零。我需要讓它呈橢圓形,而不僅僅是一個圓形的漸變。我怎樣才能做到這一點?

回答

2

這很困難,因爲以這種方式定義的drawable在運行時繪製它們自己,以適應您將它們放入的空間。最佳解決方案,如果您必須在代碼中執行此操作,將採用您已定義的可繪製形狀XML並將其繪製到畫布上或作爲完美的圓形繪製到位圖中。此時,漸變圖案將遵循形狀輪廓。一旦形狀被繪製到靜態上下文中,您可以將該形狀添加到視圖中(作爲背景,比方說),當它嘗試適合視圖邊界時,會將其變形爲橢圓形。既然你有一張圖片,整個事情就會按比例扭曲。

有希望的是,這種方法不會像素太差。

+0

標記正確的「如果你必須在代碼中這樣做」。我發現它比圖像更容易和質量更高,這讓我想起了這一點。 – coneybeare 2010-08-25 15:01:32

+0

這是我的實現你的想法:http://stackoverflow.com/questions/40811308/memory-heavy-oval-gradient – Mariusz 2016-11-25 20:19:15

0

做一個「啞巴但是工作」的方法是繪製橢圓輪廓​​,然後繪製大量嵌套的橢圓,它們具有相同的「中心」,其大小和顏色隨着橢圓變小而變化,一直到一個像素的橢圓。 如果您自定義您的漸變代碼,請插入HSV中的顏色,而不是RVB中的顏色!

+0

這一建議將工作正常,但警告說,每次添加層是另一層你的GPU具有繪製到屏幕上。我嘗試過這一次,整個應用程序停下來。 – Yervant 2016-10-04 18:20:49

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

好運氣

+0

這也許可以確定,但它看起來很昂貴。 – coneybeare 2010-08-29 22:32:48

+0

這取決於如何執行每像素計算。如果它在GPU一側執行(如梯度計算像素着色器) - 那麼它就像閃電般快速:) – 2010-08-30 07:06:08

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