2012-10-15 41 views
6

Tôi đang thử nghiệm bằng cách vẽ trên canvas bằng cách sử dụng một chuỗi để tạo một công cụ trò chơi đơn giản nhưng tôi đang gặp một số vấn đề lạ mà tôi không thể giải thích. Mục đích của "trò chơi" này là vẽ một vòng tròn mỗi giây trên canvas. Điều này hoạt động, nhưng không phải cách tôi muốn nó hoạt động, có vẻ như ứng dụng đang chuyển đổi giữa hai khung hình và thêm vòng tròn vào mỗi khung hình để bạn có thể chuyển đổi giữa hai khung hình mỗi giây với cùng số vòng kết nối. đặt trên canvas.Bản vẽ canvas SurfaceView của Android với một chủ đề

Tôi không biết mình đang làm gì sai, nhưng tôi không quen với Treadding, có liên quan gì đến số lõi mà thiết bị Android của tôi có hoặc thứ gì đó như thế không?

Mã của tôi được hiển thị bên dưới, vì vậy tôi chỉ sử dụng một bản phát hành sử dụng tệp sơ đồ bố trí liên kết đến animationthread bắt đầu chuỗi và vẽ vòng tròn trên canvas mỗi giây. (Bạn có thể bỏ qua phần cảm ứng, nó chưa được sử dụng). dự án

Các tồn tại ra khỏi một launchthread chính:

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
} 

trong đó sử dụng tập tin này bố trí:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent">  
     <com.androidtesting.AnimationView 
      android:id="@+id/aview" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"/> 
</FrameLayout> 

Và lớp Surfaceview của tôi với một bên trong lớp Thread:

class AnimationView extends SurfaceView implements SurfaceHolder.Callback { 
    private boolean touched = false; 
    private float touched_x, touched_y = 0; 
    private Paint paint; 
    private Canvas c; 
    private Random random; 
    private AnimationThread thread; 

    public AnimationView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     SurfaceHolder holder = getHolder(); 
     holder.addCallback(this); 

     thread = new AnimationThread(holder); 
    } 

    class AnimationThread extends Thread { 
     private boolean mRun;  
     private SurfaceHolder mSurfaceHolder;   

     public AnimationThread(SurfaceHolder surfaceHolder) { 
      mSurfaceHolder = surfaceHolder; 
      paint = new Paint(); 
      paint.setARGB(255,255,255,255); 
      paint.setTextSize(32); 
     } 

     @Override 
     public void run() { 
      while (mRun) { 
       c = null; 
       try { 
        c = mSurfaceHolder.lockCanvas(null); 
        synchronized (mSurfaceHolder) {     
         doDraw(c); 
         sleep(1000); 
        } 
       } catch (Exception e) {     
        e.printStackTrace(); 
       }finally { 
        if (c != null) { 
         mSurfaceHolder.unlockCanvasAndPost(c); 
        } 
       } 
      } 
     } 

     private void doDraw(Canvas canvas) { 
      //clear the canvas 
      //canvas.drawColor(Color.BLACK);       

      random = new Random(); 
      int w = canvas.getWidth(); 
      int h = canvas.getHeight(); 
      int x = random.nextInt(w-50); 
      int y = random.nextInt(h-50); 
      int r = random.nextInt(255); 
      int g = random.nextInt(255); 
      int b = random.nextInt(255); 
      int size = 20; 
      canvas.drawCircle(x,y,size,paint);    
      canvas.restore(); 
     } 
     public void setRunning(boolean b) { 
      mRun = b; 
     } 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
      touched_x = event.getX(); 
      touched_y = event.getY(); 

      int action = event.getAction(); 

      switch(action){ 
       case MotionEvent.ACTION_DOWN:   
        touched = true; 
        break; 
       case MotionEvent.ACTION_MOVE: 
        touched = true; 
        break;   
       default: 
        touched = false; 
        break; 
      } 

      return true; 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     thread.setRunning(true); 
     thread.start(); 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     boolean retry = true; 
     thread.setRunning(false); 
     while (retry) { 
      try { 
       thread.join(); 
       retry = false; 
      } catch (InterruptedException e) { 
      } 
     } 
    } 
} 
+0

Đó có phải là AnimationView2 trong mã của bạn không? Một phiên bản sửa chữa sẽ được đánh giá cao. – RichieHH

+0

(ps khi bạn sao chép mã từ một ví dụ mẫu (đây là một LunarLander được sửa đổi nhẹ) luôn luôn tốt nhất của nó để nhà nước nó vì nó làm cho săn lỗi dễ dàng hơn)). – RichieHH

Trả lời

4

có vẻ như ứng dụng đang chuyển đổi giữa hai ca nvasses

Vâng, đây là cách hoạt động của nó. Nó được gọi là đệm gấp đôi và bạn cần phải vẽ lại tất cả các khung each time:

Nội dung của Surface là không bao giờ được bảo tồn giữa unlockCanvas() và lockCanvas(), vì lý do này, mỗi điểm ảnh trong khu vực bề mặt phải bằng văn bản.

Vì vậy, bạn cần dòng này canvas.drawColor(Color.BLACK) để được bỏ ghi chú trong mã của bạn.

Và bạn không nên gọi Thread.sleep(1000) trong khi canvas bị khóa, điều này sẽ gây ra sự cố starvation.

+0

Ok, cảm ơn vì câu trả lời của bạn, vì vậy tôi cần một số loại hãy nói một ArrayList nơi tôi giữ tất cả các đối tượng vòng tròn của mình và sau đó lặp ArrayList trong phương thức vẽ để vẽ các vòng tròn? – randomizer

+0

Nếu bạn muốn thêm một vòng tròn mỗi giây và muốn vẽ tất cả chúng vào một thời điểm thì có, bạn cần lưu trữ thông tin về tất cả chúng trong danh sách, duyệt qua danh sách này mỗi khung và vẽ tất cả các vòng tròn. –

+0

Ok thx, tất cả đều chạy ngay bây giờ :) – randomizer

0

Có vẻ như bạn đã làm việc này, nhưng tôi vừa nhận thấy một lỗi nhỏ mà tôi nên chỉ ra.

Bạn đã gọi canvas.restore() mà không gọi canvas.save() trước đó. Từ tham chiếu dành cho nhà phát triển Android cho Canvas: "Đây là lỗi để gọi lại() nhiều lần hơn save() được gọi."

Tôi không thấy lý do nào để bạn gọi canvas.save() trong trường hợp của bạn, do đó bạn nên xóa cuộc gọi đến canvas.restore().

+0

Bạn có thể giúp tôi với điều này không? http://stackoverflow.com/questions/33909257/canvas-draw-functions-not-working-after-screen-locked-and-unlocked – Jas

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