@Override
protected void onDraw(Canvas canvas)
{
//Note:I do not want to use the canvas object from this function param
//If i do so its working , But i would like to understand why the following is not working
Canvas c =new Canvas();
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
c.drawText("HELLO CANVAS",200,300,paint);
}
БОЛЬШЕ КОДА
public class graphicProj extends Activity {
private Canvas canvas;
@Override
public void onCreate(Bundle savedInstanceState) {
{
....
SimpleView simpleview_obj = new SimpleView(this);
setContentView(simpleview_obj);
simpleview_obj.onDraw(canvas);
.....
new GetData().execute();
}
private static class SimpleView extends View {
private ShapeDrawable mDrawable = new ShapeDrawable();
....
protected void onDraw(Canvas canvas) {
//draw graphic objects
....
}
}
public class GetData extends AsyncTask<Void, String, Void> {
@Override
protected void onPreExecute() {
Log.d("PROJ","STARTIN");
}
@Override
protected Void doInBackground(Void... unused) {
////My calculation and reading frm DataStream
}
@Override
protected void onProgressUpdate(String... data) {
//I Keep updating the result...
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
canvas.drawText(result, 200, 300, paint);
}
@Override
protected void onPostExecute(Void unused) {
Log.d("PROJ","END");
}
}
}
Не здесь или в вашем другом вопросе вы предоставили достаточно информации о , почему вы can't do that
. Нет смысла рисовать новый холст вместо уже существующего.
Код не работает, потому что ваш новый Canvas c
ничем не назначен. Это похоже на создание строки myString
для журнала, но никогда не использующего Log.d(tag, myString)
изменить (после прочтения всех комментариев)
Если вы вычисляете значение в своем onCreate() и хотите отобразить это значение в вашем onDraw(), просто выполните это. Сохраните результат в переменной-члене, и вы можете получить к нему доступ в onDraw().
В противном случае: укажите полный код. Я думаю, вы просто делаете это более сложным, чем это должно быть...
edit2
Ваш код немного грязный и делает много вещей в тех областях, где вы не должны этого делать. Поэтому рисование внутри onProgressUpdate()
серьезно неверно. Вы должны инкапсулировать свои расчеты и чертежи.
Что вы должны делать (я рекомендую использовать SurfaceView вместо View, в любом случае...):
Вы должны запустить свой AsynchTask, который обновляет строку, которую вы хотите нарисовать. Строка должна быть переменной внутри вашего представления, где вы используете ее для рисования.
Сам чертеж должен быть вызван потоком рисования (я помню: используйте SurfaceView вместо представления как родительский класс). Внутри этого onDraw() вы должны просто использовать свой объект paint, данный холст и строку, которую вы хотите нарисовать (не забудьте сделать переменную paint
также переменной-членом, чтобы предотвратить повторное создание одного и того же объекта заново производительности/памяти).
Если вы не знаете, как работать с SurfaceView, или если вы хотите узнать, как вы могли бы работать с нитью рисования, прочитайте мой учебник о 2d рисунке: www.droidnova.com/2d-tutorial-series
Короткое последнее предложение: вы сделали много вещей правильно, вы просто перепутали с местами, где вы это делаете. Вы должны попытаться переосмыслить то, что вы действительно хотите достичь, и как это можно сделать самым простым способом. Возможно, мой урок помогает немного очистить ваш разум.