Графика Android вне метода onDraw - PullRequest
0 голосов
/ 03 декабря 2011

Хорошо, поэтому я пытаюсь нарисовать на холсте на Android вне метода onDraw.

Просто показать мой код проще всего:

public class TestActivity extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Paint p = new Paint();
    p.setColor(Color.GREEN);
    Panel a = new Panel(this,150,150,50,p);
    a.drawThing();
   setContentView(a);

}
class Panel extends View{
    private float radius, x, y;
    private Canvas CAN; 
    private Paint p;
    public Panel(Context context, float x, float y, float radius, Paint p){
        super(context);
        this.x = x;
        this.y = y;
        this.radius = radius;
        this.p = p;

    }
    @Override
    public void onDraw(Canvas canvas){
        super.onDraw(canvas);
        CAN = canvas;

    }

    public void drawThing(){
        CAN.drawCircle(x, y, radius, p);
    }
}
}

Вы видитечто я пытаюсь сделать?Но по какой-то причине он выбрасывает NullPointerException

Ответы [ 3 ]

4 голосов
/ 03 декабря 2011

Многие графические ресурсы явно освобождаются / освобождаются после их использования.Я не совсем уверен, почему они это делают, но по какой-то причине они не могут делать то, что вы пытаетесь.

Вместо того, чтобы рисовать вне метода onDraw, используйте какой-нибудь флаг дляизменить то, что делает метод onDraw.Когда вы хотите нарисовать какую-то конкретную вещь, вы можете установить правильный флаг и вызвать invalidate().

@Override
public void onDraw(Canvas canvas){
    super.onDraw(canvas);
    if (doThing) {
        canvas.drawCircle(x, y, radius, p);
    }
}

РЕДАКТИРОВАТЬ
Что-то еще, что нужно рассмотреть, это рисовать инецензурный источникЭто означает использование некоторого графического представления, такого как растровое изображение, в качестве буфера, который вы можете нарисовать в другом коде.Это не обновит ваш графический интерфейс, но даст вам возможность рисовать в тяжелых условиях без блокировки устройства пользователя.Как только вы закончите рисовать растровое изображение (или что-то еще), вы можете сделать ваш вид недействительным и нарисовать его на экране методом onDraw(Canvas).

1 голос
/ 20 июля 2012

Я почти уверен, что нулевой указатель происходит, потому что вы вызываете drawSomething до того, как будет вызван onDraw.Так что CAN - ноль.

0 голосов
/ 03 декабря 2011

Вы можете рисовать на холсте вне onDraw.Посмотреть это Можем ли мы иметь два полотна в упражнении?(ИЛИ) Холст вне onDraw () не работает для получения дополнительной информации.

...