Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将一个圆保持在另一个圆中android view控件_Android_Controls_Android View - Fatal编程技术网

如何将一个圆保持在另一个圆中android view控件

如何将一个圆保持在另一个圆中android view控件,android,controls,android-view,Android,Controls,Android View,我正在尝试在android中创建一个类似pad的视图。我得到了一个圆圈,它跟随用户的手势,我使用距离来保持圆圈在键盘控制的主圆圈之外。 我的问题是我希望圆圈继续跟随手势,但要留在主圆圈内。我用这个公式,用角度和半径来找一个点,但它有点古怪 我正在平移画布,以便主圆的中心位于0,0。 代码如下: @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.translate(this.m

我正在尝试在android中创建一个类似pad的视图。我得到了一个圆圈,它跟随用户的手势,我使用距离来保持圆圈在键盘控制的主圆圈之外。 我的问题是我希望圆圈继续跟随手势,但要留在主圆圈内。我用这个公式,用角度和半径来找一个点,但它有点古怪

我正在平移画布,以便主圆的中心位于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);
}
@覆盖
受保护的void onDraw(画布){
super.onDraw(帆布);
canvas.translate(this.mainRadius,this.mainRadius);
canvas.drawCircle(0,0,this.mainRadius,this.debugPaint);
画布.drawCircle(this.handleX,this.handleY,this.handleRadius,this.handlePaint);
}
私有void translateHandle(MotionEvent事件){
int x=(int)(event.getX()-this.mainRadius);
int y=(int)(event.getY()-this.mainRadius);
双倍距离=与中心的距离(x,y);

如果(distance我无法将此更改验证到您的代码段中,但希望它能提供一些如何继续的想法

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;
}

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

谢谢!太棒了!