我遇到了麻烦, 我需要让一个物体(乒乓球拍)只沿着屏幕的圆形路线移动。 同样的事情就好像你有一个恒定的y轴值,它只会沿着x轴移动,因为你将手指拖到它上面,但是要将它限制在一个圆形路线上。
任何见解? 我看到了这件事 http://www.kirupa.com/developer/mx/circular.htm
它只会帮助弄清楚如何在一个圆圈上不停地移动某些东西(虽然它是Flash,但想法是一样的)
由于
答案 0 :(得分:3)
圆圈上的点可以由函数定义:
x = a + r cos(θ)
y = b + r sin(θ)
其中(a,b)是圆圈的中心。
根据您所希望的速度,您可以说您希望每T秒发生一次完整的循环。如果t是动画开始后的时间:
θ = (360 / T) * (t % T)
您可以使用这些功能创建自己的ViewAnimation,OpenGL功能,或者如果您使用画布,则可以在onDraw()
事件期间设置球拍的位置。
答案 1 :(得分:2)
以下是我用一根手指旋转图像视图的代码块。
private float mCenterX, mCenterY;
private float direction = 0;
private float sX, sY;
private float startDirection=0;
private void touchStart(float x, float y) {
mCenterX = this.getWidth() / 2;
mCenterY = this.getHeight() / 2;
sX = x;
sY = y;
}
private void touchMove(float x, float y) {
// this calculate the angle the image rotate
float angle = (float) angleBetween2Lines(mCenterX, mCenterY, sX, sY, x,
y);
direction = (float) Math.toDegrees(angle) * -1 + startDirection;
this.invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
canvas.rotate(direction, mCenterX, mCenterY);
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// record the start position of finger
touchStart(x, y);
break;
case MotionEvent.ACTION_MOVE:
// update image angle
touchMove(x, y);
break;
case MotionEvent.ACTION_UP:
startDirection = direction;
break;
}
return true;
}
public double angleBetween2Lines(float centerX, float centerY, float x1,
float y1, float x2, float y2) {
double angle1 = Math.atan2(y1 - centerY, x1 - centerX);
double angle2 = Math.atan2(y2 - centerY, x2 - centerX);
return angle1 - angle2;
}
希望这个帮助
编辑:基本上,上面的代码所做的是使用户能够旋转图像,并且图像的中心不会改变。 angleBetween2Line()用于计算手指在中心为图像中心的圆圈中移动的程度。