15

楕円形をセットアップして表示する方法を知っています。この図形にグラデーションを適用する方法を知っています。私が理解できないのは、形状に一致する楕円形のグラデーションを取得する方法です。

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

ご想像のとおり、このグラデーションは中央に半透明の白い輝きがあり、エッジでアルファ ゼロにフェードします。円形のグラデーションだけでなく、楕円形にする必要があります。どうすればこれを達成できますか?

4

5 に答える 5

3

もっと「直接的な」描画アプローチを提案します。ピクセルごとにグラデーションを描くことができる場合は、それを覚えておく必要があります。

  • 円のグラデーションの色はに比例しますr
  • 楕円(楕円)のグラデーションカラーはに比例しますr1+r2

ここ:

r-円の中心までの距離

r1、r2-楕円の2つの焦点までの距離

編集: このピクセルシェーダーコードを検討してください:

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

次のような楕円形になります。 代替テキスト

幸運を

于 2010-08-29T08:30:58.197 に答える
3
<?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"/>

于 2015-02-09T04:24:19.533 に答える
2

この方法で定義されたドローアブルは実行時に自分自身を描画し、それらを配置したスペースに適応するため、これは困難です。コードでこれを行う必要がある場合の最善の解決策は、XML で定義した形のドローアブルを取得して描画することです。キャンバスまたはビットマップに完全な円として。この時点で、グラデーション パターンは形状のアウトラインに従います。形状が静的コンテキストに描画されると、その形状をビューに (たとえば背景として) 追加できます。これにより、ビューの境界に合わせようとすると楕円形に変形します。あなたはイメージを持っているので、全体が比例して歪んでしまいます。

うまくいけば、この方法でピクセルが悪くなることはありません。

于 2010-08-22T23:28:14.780 に答える
0

これを行うための「ばかげているが機能する」方法は、楕円の輪郭を描画し、次に同じ「中心」を持つ多数のネストされた楕円を描画することです。楕円が小さくなると、サイズと色が変化し、1ピクセルになります。楕円。グラデーションをカスタム コーディングする場合は、 RVB ではなく HSV で色を補間してください。

于 2010-08-20T06:43:38.477 に答える