Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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
Java 在android中围绕两点旋转不起作用_Java_Android_Rotation - Fatal编程技术网

Java 在android中围绕两点旋转不起作用

Java 在android中围绕两点旋转不起作用,java,android,rotation,Java,Android,Rotation,我有两个独立的(x,y)点,我想用它们来对视图应用旋转 第一点是固定的,我很容易找到它的值(例如200200)。我的第二点是触摸的位置,所以我也很容易抓住RawX和RawY点。我将这两点输入到我在另一个堆栈溢出问题上发现的方法中 private float findRotation(int firstPointX, int firstPointY, int secondPointX, int secondPointY) { double delta_x = (first

我有两个独立的(x,y)点,我想用它们来对视图应用旋转

第一点是固定的,我很容易找到它的值(例如200200)。我的第二点是触摸的位置,所以我也很容易抓住RawX和RawY点。我将这两点输入到我在另一个堆栈溢出问题上发现的方法中

private float findRotation(int firstPointX, int firstPointY, int secondPointX, int secondPointY) {  
           double delta_x = (firstPointX - secondPointX);
           double delta_y = (firstPointY - secondPointY);
           double radians = Math.atan2(delta_y, delta_x);       
           return (float) Math.toDegrees(radians);
       }
我用它的返回值来设置视图的旋转。像这样
myView.setRotation(…)
。当我在屏幕上移动光标/手指时,结果是一个疯狂的旋转视图。有什么想法吗

我抓住的两点似乎是正确的,让我猜测findRotation方法可能是错误的

我的活动:

    public class MainActivity extends Activity {
    ImageView imageView;
    ImageView dragHandle;
    RelativeLayout layout;
    int rememberAngle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = (ImageView) findViewById(R.id.imageView1);
        dragHandle = (ImageView) findViewById(R.id.imageView2);
        layout = (RelativeLayout) findViewById(R.id.relativeLayout2);

        resize(dragHandle);

    }


    public void resize(ImageView resizeButton) {
        resizeButton.setOnTouchListener(new View.OnTouchListener() {

            public boolean onTouch(View v, MotionEvent motionEvent) {

                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    int[] locationOfLayout = new int[2];
                    int[] locationOfDrag = new int[2];

                    layout.getLocationOnScreen(locationOfLayout);
                    dragHandle.getLocationOnScreen(locationOfDrag);

                    int firstPointX = locationOfLayout[0];
                    int firstPointY = locationOfLayout[1];

                    int secondPointX = dragHandle.getWidth() / 2 + locationOfDrag[0];
                    int secondPointY = dragHandle.getHeight() / 2 + locationOfDrag[1];


                    rememberAngle = (int) findRotation(firstPointX, firstPointY, secondPointX, secondPointY) + layout.getRotation();


                } else if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
                    int[] locationOfLayout = new int[2];
                    int[] locationOfDrag = new int[2];

                    layout.getLocationOnScreen(locationOfLayout);
                    dragHandle.getLocationOnScreen(locationOfDrag);

                    int centerXOnLayout = layout.getWidth() / 2 + locationOfLayout[0];
                    int centerYOnLayout = layout.getHeight() / 2 + locationOfLayout[1];

                    int centerXOnDrag = dragHandle.getWidth() / 2 + locationOfDrag[0];
                    int centerYOnDrag = dragHandle.getHeight() / 2 + locationOfDrag[1];

                    layout.setRotation(findRotation(centerXOnLayout, centerYOnLayout, centerXOnDrag, centerYOnDrag) - rememberAngle);


                } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {

                }
                return true;
            }
        });
    }

    private float findRotation(int firstPointX, int firstPointY, int secondPointX, int secondPointY) {
        double delta_x = (secondPointX - firstPointX);
        double delta_y = (secondPointY - firstPointY);
        double radians = Math.atan2(delta_y, delta_x);
        return (float) Math.toDegrees(radians);
    }
}
我的XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <RelativeLayout
        android:id="@+id/relativeLayout2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:src="@drawable/ic_launcher" />

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:layout_below="@+id/imageView1"
            android:layout_toRightOf="@+id/imageView1"
            android:src="@drawable/meanicons" />
    </RelativeLayout>

</RelativeLayout>

public void resize(ImageView resizeButton) {
    resizeButton.setOnTouchListener(new View.OnTouchListener() {

        float startAngle;
        float zeroAngle;
        int firstPointX;
        int firstPointY; 

        public boolean onTouch(View v, MotionEvent motionEvent) {

            if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                int[] locationOfLayout = new int[2];
                int[] locationOfDrag = new int[2];

                layout.getLocationOnScreen(locationOfLayout);
                dragHandle.getLocationOnScreen(locationOfDrag);

                firstPointX = locationOfLayout[0];
                firstPointY = locationOfLayout[1];

                int secondPointX = motionEvent.getRawX();
                int secondPointY = motionEvent.getRawY();

                zeroAngle = findRotation(firstPointX, firstPointY, secondPointX, secondPointY) // remember "zero" angle
                startAngle = layout.getRotation(); // remember angle at which layout is rotated at the start


            } else if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {

                layout.setRotation(findRotation(firstPointX, firstPointY, motionEvent.getRawX(), motionEvent.getRawY()) - zeroAngle + startAngle); // rotate relative to start and zero angle


            } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {

            }
            return true;
        }
    });
}

private float findRotation(int firstPointX, int firstPointY, int secondPointX, int secondPointY) {
    double delta_x = (secondPointX - firstPointX);
    double delta_y = (secondPointY - firstPointY);
    double radians = Math.atan2(delta_y, delta_x);
    return (float) Math.toDegrees(radians);
}