1

asynctask 内の SurfaceView でフラクタルを描画しようとしていますが、適切に実行する方法がわかりません。私の考えは、プログレスバーを含むサーフェスビューを(メインアクティビティで)作成し、別のスレッドでどのピクセルが描画されるかを計算し、これをある種の「バッファ」に保存することでした(これにはキャンバスを使用します)。その後、サーフェス ビューに結果が表示されます (プログレス バーの回転ホイールが破壊されます)。

私はこのコードを書きました:

MainActivity.java

public class MainActivity extends Activity {
private Complex constant;
private int bg_color, fg_color;
private static final int nMax = 30, rMax = 2;

private class JuliaThread extends AsyncTask<Complex, Void, Canvas> {
    private double re, im, w, h;
    private Complex sequence;
    private int i;
    private Canvas canv;
    private Paint p;
    private View m;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        m = (View) findViewById(R.id.sv);
        w = m.getWidth();
        h = m.getHeight();
        canv = new Canvas();
        p = new Paint();
    }
    @Override
    protected Canvas doInBackground(Complex... c) {
        for (double y=0; y<h; y++) {
            for (double x=0; x<w; x++) {
                re = (x/w)*3.0-1.5;
                im = -(y/h)*3.0-1.5;
                sequence = new Complex(re, im);
                for (i=1; i<=nMax; i++) {
                    sequence = sequence.square();
                    sequence.add(c[0]);
                    if (sequence.abs() > rMax) break;
                }
                if (i == nMax) p.setColor(fg_color);
                else p.setColor(bg_color);
                canv.drawLine((float)x, (float)y, (float)x, (float)y, p);
            }
        }
        return canv;
    }
    @Override
    protected void onPostExecute(Canvas result) {
        super.onPostExecute(result);
        m.draw(result);
    }
}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    constant = new Complex(-0.391, -0.587);
    bg_color = Color.rgb(0, 0, 0);
    fg_color = Color.rgb(255, 255, 255);
    new JuliaThread().execute(constant);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity"
    android:id="@+id/mainview" >

    <SurfaceView
        android:id="@+id/sv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" >

    </SurfaceView>

    <ProgressBar
        android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/sv"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="138dp" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progressBar1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="15dp"
        android:text="@string/loading"
        android:textAppearance="?android:attr/textAppearanceLarge" />
</RelativeLayout>

残念ながら、このアプローチは機能しません。私が間違っていることと、これを適切に行う方法を説明していただけますか?

4

1 に答える 1

0

SurfaceHolder最初にfromを取得する必要がありますSurfaceView( を実装してSurfaceHolder.Callback)。次に、次のようにします。

 final Canvas c = mSurfaceHolder.lockCanvas();

 //---draw stuff--

 mSurfaceHolder.unlockCanvasAndPost(c);
于 2013-07-04T17:10:35.097 に答える