2012-05-12 6 views
0

Я пытаюсь создать простое приложение для рисования. У меня возникают проблемы с массивом, в котором хранится краска, и я не могу найти решение. Если я прокомментирую части, которые связаны с массивом, который он запускает, но затем (очевидно) приложение не работает должным образом. Когда я открываю приложение он выходит из строя с этим кодом:Android Paint App Array

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

ответ

1

circles[circles.length] является 10001th элемента вашего массива, так как длина является статической.

Лучше использовать 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); 
    } 
} 

Другая возможность хранить отдельный индекс вашего массива, который говорит вам, что последний элемент вашего массива. Когда вы добавляете круг, увеличивайте индекс и рисуете только те, которые назначены.

+0

Хмммм .... Это не сбой, но это не показывает круги. – hyrumcoop

Смежные вопросы