3

最初のQ.これをファイル内の別の場所に移動するための作業コードがあります-それは問題ではありません。問題は、移動可能な放射状グラデーションをどのように作成するかです(API 16の下)。

スナークを先取りして、私はここで多くの時間を過ごしました:

http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.html

GradientDrawable(下記)では、非放射状の方向も設定せずに色を設定する方法はないようです。

public class CustomView extends View {
    int width = (sWidth/8); // sWidth defined elsewhere as width of screen
    int height = (sWidth/8);
    GradientDrawable gradient;
    int[] colors = {0x60ffffff,0x000000};

    public CustomView(Context context) {
        super(context);
        gradient = new GradientDrawable(GradientDrawable.Orientation.BL_TR,colors);
    }

    protected void onDraw(Canvas canvas) {
        if(x != 0 && y != 0){ // OnTouch calls invalidate on this view for movement
            gradient.mutate();
            gradient.setShape(GradientDrawable.RADIAL_GRADIENT);
         // This just makes it disappear:
         // setGradientType (GradientDrawable.RADIAL_GRADIENT);
            gradient.setBounds(x-width/2, y-height/2, x + width, y + height);
            gradient.draw(canvas);
        }
    }
}

これもあります:

http://developer.android.com/reference/android/graphics/RadialGradient.html

しかし、そのグラデーションを動かす方法はないようです。移動可能なある種の透明な円に放射状のグラデーションを配置できますか?私は途方に暮れています。よろしくお願いします。

4

1 に答える 1

2

編集:

ステップ1、ドローアブルフォルダに楕円形を定義します。これは「cloud.xml」です。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >

<gradient
    android:centerX="0.5"
    android:centerY="0.5"
    android:endColor="#00000000"
    android:gradientRadius="30"
    android:startColor="#f0ffffff"
    android:type="radial" />
<size
    android:width="60dp"
    android:height="60dp" />
 </shape>

半径、幅、高さは動的に変更する必要があります。だから何でも入れてください。上記の配色は、わずかに透明な色から完全に透明な色になります。雲の効果。

ステップ2、カスタムビューのコンストラクター:

// actually before the constructor this, of course:
GradientDrawable circle;

// now the constructor:

circle = (GradientDrawable) context.getResources().getDrawable(R.drawable.cloud);

ステップ3、onDrawメソッド:

            // x & y being coordinates updated from onTouch method,
            // circleRad being some constant dependent on screen dp
            if(x != 0 && y != 0){
            circle.setGradientRadius(circleRad);
            circle.setBounds(x-circleRad, y-circleRad,
                    x+circleRad, y+circleRad);
            circle.draw(canvas);
        }

-------------元の、プロセス効率の低いソリューションを以下に保存-----------

数週間待って、あなたはあなた自身の質問に答えることができます。それはずっとRadialGradientだったことがわかりました。

public class CustomView extends View implements OnTouchListener {
    Shader radialGradientShader;
    Paint paint;
    private int circleDiam;
    private int x = 0;
    private int y = 0;
    private int lastScreenColor;

    public CustomView(Context context, int circleDiam) {
        super(context);
        this.circleDiam = circleDiam;
        paint = new Paint();
    }

    protected void onDraw(Canvas canvas) {
        if(x != 0 && y != 0){       
            paint.setStyle(Paint.Style.FILL);
            paint.setAntiAlias(true);
            radialGradientShader = new
    RadialGradient(x, y, circleDiam,
    0xf0ffffff,0x00000000,Shader.TileMode.MIRROR);
            paint.setShader(radialGradientShader);
            canvas.drawCircle(x, y, circleDiam, paint);
        }
    }

    public boolean onTouch(View v, MotionEvent event) {
        x = (int)event.getX();
        y = (int)event.getY();

        if(event.getAction() == MotionEvent.ACTION_DOWN 
     && event.getAction() == MotionEvent.ACTION_MOVE){
            invalidate();
            return true;
        }
        else{ 
            x = 0;
            y = 0;
            invalidate();
            return false;
        }
    }
}

ふわふわの雲!

このソリューションの唯一の問題は、onDrawメソッドでオブジェクトをインスタンス化するとEclipseが狂ってしまうことです。ただし、コンストラクターでインスタンス化しようとすると、処理が醜くなります。

上記の問題を回避するソリューションの追加ポイント。

于 2012-11-15T03:49:43.763 に答える