2014-06-07 59 views
4

我想在android中创建一个类似pad的视图。我得到了一个符合用户手势的圆圈,我正在使用距离来保持向外控制板主圈外的圆圈。 我的问题是我想让圈子继续跟着手势,但留在主圈内。我使用公式来找到使用角度和半径的点,但它确实有些时髦的东西。如何在另一个圆圈内保持一个圆形android view view控制

我翻译画布,使主圆心为0,0。 下面是代码:

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.translate(this.mainRadius, this.mainRadius); 

    canvas.drawCircle(0, 0, this.mainRadius, this.debugPaint); 
    canvas.drawCircle(this.handleX, this.handleY, this.handleRadius, this.handlePaint); 
} 

private void translateHandle(MotionEvent event) { 
    int x = (int) (event.getX() - this.mainRadius); 
    int y = (int) (event.getY() - this.mainRadius); 
    double distance = distanceFromCenter(x, y); 
    if (distance <= this.maxDistance) { 
     this.handleX = x; 
     this.handleY = y; 
    } else { 
     float angle = (float) Math.toDegrees(Math.atan2(y, x)); 
     if (angle < 0) 
      angle += 360; 

     this.handleX = (int) ((this.mainRadius - this.handleRadius) * Math.cos(angle)); 
     this.handleY = (int) ((this.mainRadius - this.handleRadius) * Math.sin(angle)); 
    } 

    //onTranslateHandle(distance); 
} 

这里是一个gif图片的时髦的东西:The issue animated

回答

3

我无法验证此更改为您的代码片段,但希望它能提供一些想法,无论如何,

private void translateHandle(MotionEvent event) { 
    float x = event.getX() - this.mainRadius; 
    float y = event.getY() - this.mainRadius; 
    double distance = distanceFromCenter(x, y); 
    if (distance > this.maxDistance) { 
     // If distance is i.e 2.0 and maxDistance is 1.0 ==> adjust is 0.5 
     // which repositions x and y making distance 1.0 maintaining direction 
     double adjust = this.maxDistance/distance; 
     x = (float)(x * adjust); 
     y = (float)(y * adjust); 
    } 
    this.handleX = (int)x; 
    this.handleY = (int)y; 
} 

我可以根据需要更新答案,如果这不提供任何有用的结果。

+0

钉着它,欢呼队友! –

+0

谢谢!这真是太棒了! –