2014-03-13 283 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