0

シンプルなペイントアプリを作ろうとしています。ペイントを格納する配列に問題があり、解決策が見つかりません。実行する配列に関係する部分をコメントアウトすると、(明らかに) アプリは期待どおりに動作しません。アプリを開くと、次のコードでクラッシュします。

package com.example.paint.views;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class PaintView extends SurfaceView implements Callback {

PaintCircle[] circles = new PaintCircle[10000];

@Override
public boolean onTouchEvent(MotionEvent event) {
    // When touched

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        Paint blue = new Paint();
        blue.setColor(Color.BLUE);
        blue.setStyle(Style.FILL);
        circles[circles.length] = new PaintCircle(event.getX(),
                event.getY(), 20, blue);
        break;
    case MotionEvent.ACTION_MOVE:
        Paint green = new Paint();
        green.setColor(Color.GREEN);
        green.setStyle(Style.FILL);
        circles[circles.length] = new PaintCircle(event.getX(),
                event.getY(), 20, green);
        break;
    }

    return true;
}

@Override
public void draw(Canvas c) {
    // Draw to the canvas
    super.draw(c);
    c.drawARGB(255, 255, 255, 255);
    for (int i = 0; i < circles.length; i++) {
        c.drawCircle(circles[i].cx, circles[i].cy, circles[i].radius,
                circles[i].paint);
    }
}

public PaintView(Context context, AttributeSet attrs) {
    super(context, attrs);
    getHolder().addCallback(this);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    // When the surface view is created
    Canvas c = getHolder().lockCanvas();
    draw(c);
    getHolder().unlockCanvasAndPost(c);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    // TODO Auto-generated method stub
    Canvas c = getHolder().lockCanvas();
    draw(c);
    getHolder().unlockCanvasAndPost(c);
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub

}

}

ここに私の PaintCircle クラスがあります:

package com.example.paint.views;

import android.graphics.Paint;

public class PaintCircle {
public Paint paint;
public float cx, cy;
public int radius;

public PaintCircle() {

}

public PaintCircle(float cx, float cy, int radius, Paint paint) {
    cx = this.cx;
    cy = this.cy;
    radius = this.radius;
    paint = this.paint;
}
}
4

1 に答える 1

1

circles[circles.length]長さが静的であるため、配列の 10001 番目の要素です。

動的に成長するListようなものを使用することをお勧めします。ArrayList

List<PaintCircle> circles = new ArrayList<PaintCircle>();

@Override
public boolean onTouchEvent(MotionEvent event) {
    // When touched

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        Paint blue = new Paint();
        blue.setColor(Color.BLUE);
        blue.setStyle(Style.FILL);
        circles.add(new PaintCircle(event.getX(),
                event.getY(), 20, blue));
     // ...

@Override
public void draw(Canvas c) {
    // Draw to the canvas
    super.draw(c);
    c.drawARGB(255, 255, 255, 255);
    for (PaintCircle circle : circles) {
        c.drawCircle(circle.cx, circle.cy, circle.radius,
                circle.paint);
    }
}

別の可能性は、配列の最後の要素を示す配列の別のインデックスを格納することです。円を追加すると、インデックスが増加し、割り当てられたものだけが描画されます。

于 2012-05-12T15:17:40.533 に答える