2014-03-13 160 views
1

介紹繪製自定義視圖中的線

我與自定義視圖練習,我需要做一個應用程序:這個程序顯示一個小圓圈(就像一個小球),而這個球移動方面到手機方向(使用加速度計)。我已經完成了這個。

問題

現在,我需要獲得一個額外的功能:

  • 這場球現在出現在屏幕的左上方,我需要它出現在中間。
  • 我需要繪製球是的軌跡,畫出一條黑線代表球的軌跡

這是我的自定義視圖的代碼:

public class MyView extends View { 

    private Path drawPath; 
    private Paint drawPaint; 
    private Bitmap canvasBitmap; 
    float speedX; 
    float speedY; 
    float radius = 10; 
    float posX = radius; 
    float posY = radius; 
    long lastUpdateTime = 0; 
    final float METER_TO_PIXEL = 50.0f; 


    /** 
    * Constructor 
    */ 
    public MyView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setupDraw(); 
    } 


    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawPath(drawPath, drawPaint); 
     canvas.drawCircle(posX, posY, radius, drawPaint); 
    } 


    private void setupDraw() { 

     drawPaint = new Paint(); 
     drawPaint.setColor(Color.BLACK); 
     canvasBitmap = Bitmap.createBitmap(640, 1200, Bitmap.Config.ARGB_8888); 
     posX = getWidth() /2; 
     posY = getHeight() /2; 
    } 

    public void update (float gravityX, float gravityY) { 

     if(lastUpdateTime == 0) { 
      lastUpdateTime = System.currentTimeMillis(); 
      return; 
     } 
     long now = System.currentTimeMillis(); 
     long ellapse = now - lastUpdateTime; 
     lastUpdateTime = now; 

     speedX -=((gravityX * ellapse)/1000.0f) * METER_TO_PIXEL; 
     speedY +=((gravityY * ellapse)/1000.0f) * METER_TO_PIXEL; 

     posX += ((speedX * ellapse)/1000.0f); 
     posY += ((speedY * ellapse)/1000.0f); 

     /*Checks screen limits*/ 
     if (posX < radius) { 
      posX = radius; 
      speedX = 0; 
     } 
     else if (posX > (getWidth() - radius)) { 
      posX = getWidth() - radius; 
      speedX = 0; 
     } 
     if (posY < radius) { 
      posY = radius; 
      speedY = 0; 
     } 
     else if (posY > (getHeight() - radius)) { 
      posY = getHeight() - radius; 
      speedY = 0; 
     } 
     this.invalidate(); 
    } 


    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 

     /*HERE IS WHERE I TRY TO SET THE BALL ON THE MIDDLE OF THE SCREEN*/ 
     drawPath = new Path(); 
     drawPath.moveTo(w/2, h/2); 
    } 
} 

回答

1

我實現了邊做邊放中球:

protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 

    if (isFirstTime) { 
     drawPath = new Path(); 
     drawPath.moveTo(w/2, h/2); 
     isFirstTime = false; 
    } 
    //... 
} 

我由開始pathdrawing在中間:

public void update (float gravityX, float gravityY) { 

    if(lastUpdateTime == 0) { 
     posX = getWidth() /2; 
     posY = getHeight() /2; 
     lastUpdateTime = System.currentTimeMillis(); 
     this.invalidate(); 
    } 
    //... 
} 

但畫我仍然有一些麻煩的路徑。我取得了一些東西,但它繪製了兩條線:第一條是球道,第二條是從中間到球的直線。這最後一行使得兩條線之間的表面很好地進行了繪畫,所以我仍然需要看到如何解決這個問題。

對於這一點,我已經在update()方法結束這包括:

drawPath.lineTo(posX, posY); 
drawCanvas.drawPath(drawPath, drawPaint); 
this.invalidate(); 

而我的onDraw()方法是這樣的:

protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint); 
    canvas.drawPath(drawPath, drawPaint); 
    canvas.drawCircle(posX, posY, radius, drawPaint); 
} 
0

怎麼樣:

// here you put your values 
canvas.drawLine(0, 0, 20, 20, drawPaint); 

,就把這行你的onDraw功能

+0

無論是什麼都不做。我已經嘗試過這種設置舊的和新的X和Y位置來連續繪製線條,但它不繪製它。我在更新方法的末尾放了這個'drawPath.lineTo(posX,posY);',它繪製了一些東西,但不是一條直線跟蹤te球 – masmic