2015-09-05 2 views
0

Я просто хочу обратить на SurfaceView и модифицировал некоторые примеры кода из hereрисовать холст в SurfaceView

Если я рисую непосредственно в цикле он работает, но когда я вызываю метод отрисовки Это не работает. Любые идеи, какие могут быть проблемы? Но это то, что я видел в других учебниках, поэтому он должен работать. Конечно, я мог бы использовать draw1. Но я хочу знать, почему onDraw здесь не работает?

public class TestSurefaceView extends Activity { 
MySurfaceView mySurfaceView; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mySurfaceView = new MySurfaceView(this); 
    setContentView(mySurfaceView); 
} 
class MySurfaceView extends SurfaceView implements Runnable{ 
    Thread thread = null; 
    SurfaceHolder surfaceHolder; 
    volatile boolean running = false; 
    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    Random random; 
    public MySurfaceView(Context context) { 
     super(context); 
     surfaceHolder = getHolder(); 
     random = new Random(); 
    } 
    @Override 
    public void run() { 
     while(running){ 
      if(surfaceHolder.getSurface().isValid()){ 
       Canvas canvas = surfaceHolder.lockCanvas(); 
       //draw(canvas); // does not work 
       draw1(canvas); // works 
       surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
    private void draw1(Canvas canvas){ 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setStrokeWidth(3); 
     int w = canvas.getWidth();int h = canvas.getHeight(); 
     int x = random.nextInt(w-1); 
     int y = random.nextInt(h-1); 
     int r = random.nextInt(255); 
     int g = random.nextInt(255); 
     int b = random.nextInt(255); 
     paint.setColor(0xff000000 + (r << 16) + (g << 8) + b); 
     canvas.drawPoint(x, y, paint); 
    } 
    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     draw1(canvas); 
    } 
} 
} 
+0

Вам не хватает вашего 'setWillNotDraw (false);' call where .... – EpicPandaForce

ответ

0

SurfaceViews состоит из двух частей, поверхности и вида. onDraw() предназначен для рисования на представлении. Точка поверхности - это отдельный слой под уровнем представления UI, поэтому вы можете нарисовать его, не мешая обычному циклу View invalidate/redraw.

Трудно сказать, почему он «не работает», когда вы не объяснили, что это такое, чего не происходит. Одной из распространенных проблем при определении метода onDraw() является то, что если UI View становится недействительным, он вызовет метод для рисования в представлении. Поскольку представление находится поверх поверхности, все, что нарисовано на представлении, будет затенять поверхность, так, например, непрозрачный фон предотвратит видимость всего, что происходит на поверхности.

Обычно я рекомендую, чтобы вы не подклассы SurfaceView, так как нет никакой ценности в этом, и хорошие методы ООП поощряют композицию по наследованию.

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