2010-09-29 27 views
9

Tôi đang triển khai một ứng dụng khá chuẩn với sdk Android có liên quan đến việc vẽ bằng SurfaceView, SurfaceHolder, thiết lập gọi lại.Android SurfaceHolder.unlockCanvasAndPost() không làm cho vẽ lại

Trong chủ đề chính của tôi (chuỗi giao diện người dùng) Tôi không có bản vẽ hoặc xử lý SurfaceHolder (hoặc khung bạn lấy với nó).

Trong một thread riêng biệt Tôi đã điều sau đây:

Log.i("GAME.DrawThread", "run()"); 
     Log.i("GAME.DrawThread", Thread.currentThread().getName()); 
     Canvas canvas = null; 
     try { 
      canvas = holder.lockCanvas(); 
      synchronized(holder) { 
       Log.i("GAME", "draw():synchronized"); 
       Paint paint = new Paint(); 
       paint.setColor(R.color.draw_color); 
       canvas.drawColor(R.color.draw_color); 
       canvas.drawLine(0, 0, 500, 500, paint); 
      } 
     } catch (SurfaceHolder.BadSurfaceTypeException e) { 
      Log.e("GAME", "onDraw(): BadSurfaceTypeException"); 
     } finally { 
      if (canvas != null) { 
       holder.unlockCanvasAndPost(canvas); 
      } 
     } 

Mã này đã được thực hiện, ném không có ngoại lệ, và không có tác dụng phụ tiêu cực mà tôi có thể tìm thấy; tuy nhiên, cuộc gọi unlockCanvasAndPost() không bao giờ gây ra onDraw() được gọi.

Nói cách khác, unlockCanvasAndPost() không gây ra việc vẽ lại SurfaceView.

Bất kỳ ý tưởng nào có thể gây ra triệu chứng này? Tôi có rất nhiều trải nghiệm java, một số tiền hợp lý của trải nghiệm Android và rất nhiều trải nghiệm gỡ lỗi và không thể theo dõi trải nghiệm này.

Xin cảm ơn trước.

+0

Mã này hiện bị treo trong Android 4.3 –

Trả lời

0

Đó không phải là cách SurfaceView hoạt động. Gọi hàm unlockCanvasAndPost() không gọi onDraw(), đó là toàn bộ quan điểm của việc sử dụng SurfaceView. Bề mặt của SurfaceView nằm trong một cửa sổ khác.

+1

Cảm ơn, nhưng điều đó không giải quyết được vấn đề. Bất cứ cơ chế nào được sử dụng để đăng canvas bạn viết lên màn hình sẽ không được gọi. – cblades

+2

Bạn không giải thích được vấn đề là gì. Làm thế nào là nó không hoạt động? –

+0

Có Romain Guy hãy giúp chúng tôi giải quyết câu hỏi hóc búa này: p –

10

Vì vậy, nó chỉ ra rằng khi sử dụng SurfaceView bạn vẽ đến một bề mặt bên dưới một cửa sổ. Tôi đã thiết lập màu nền của View trong xml; nó chỉ ra rằng thiết lập màu nền của cửa sổ, không phải là bề mặt. Trong thực tế, tôi làm cho cửa sổ mờ đục để bạn không thể nhìn thấy bề mặt bên dưới.

Bài học kinh nghiệm.

+0

Wow, cảm ơn vì đã theo dõi! Tôi đã có cùng một vấn đề và không biết phải mất bao lâu để tìm ra nó. Tôi đã dành một vài giờ vào nó trước khi tôi tìm thấy giải pháp ở đây. Ugh. – spartygw

+0

Tôi đã mất nhiều giờ để tìm câu trả lời vì sao 'unlockCanvasAndPost()' sẽ không làm mới màn hình mặc dù tất cả các phương thức vẽ đã được thực thi ... Cuối cùng, bạn đã tìm ra câu trả lời và nhận ra đó là vấn đề bình đẳng của tôi. cho xem và surfaceview được vẽ bên dưới nó .. Tôi gần như đã điên rồi: P – JorgeGRC

0

Đây là cũ, nhưng tôi có một cảm giác vấn đề là không có gọi lại bề mặt. Anh đang cố gắng vẽ trên bề mặt trước khi bề mặt được tạo ra

Các vấn đề liên quan