Java 当单击对象拖动它时,它会直接跳到拐角处

Java 当单击对象拖动它时,它会直接跳到拐角处,java,android,android-studio,ontouchlistener,Java,Android,Android Studio,Ontouchlistener,之所以会发生这种情况,是因为我为布局设置了“水平居中”规则,并将“父底部对齐”规则设置为0,但在不删除这些规则的情况下,对象根本不会移动。我需要这些规则,因为它是在代码中创建的对象,我不能在xml文件中预先设置它。 跳开后,物体从我的触摸中分离,所以当我移动它时,它会移动,但会远离我的手指。以下是Touch Listener、MainActivity和activity main.xml的代码。对不起,真的很乱,但我是个十足的乞丐 public boolean onTouch(View vie

之所以会发生这种情况,是因为我为布局设置了“水平居中”规则,并将“父底部对齐”规则设置为0,但在不删除这些规则的情况下,对象根本不会移动。我需要这些规则,因为它是在代码中创建的对象,我不能在xml文件中预先设置它。 跳开后,物体从我的触摸中分离,所以当我移动它时,它会移动,但会远离我的手指。以下是Touch Listener、MainActivity和activity main.xml的代码。对不起,真的很乱,但我是个十足的乞丐

  public boolean onTouch(View view, MotionEvent motionEvent) {
       float x = motionEvent.getRawX();
       float y = motionEvent.getRawY();

       Rectangle rect = (Rectangle) view;
       if(!rect.canMove){
           return true;
       }

       boolean moved=false;

       RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();

       lParams.addRule(RelativeLayout.CENTER_HORIZONTAL,0);
       lParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,0);


       switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) {
           case MotionEvent.ACTION_DOWN:
               xDelta = x - lParams.leftMargin;
               yDelta = y - lParams.topMargin;
               rect.bringToFront();
               break;


           case MotionEvent.ACTION_MOVE:
               int yDiff =  Math.round((motionEvent.getRawY() - yDelta)   / rect.grid ) * rect.grid;
               int xDiff =  Math.round((motionEvent.getRawX() - xDelta)  / rect.grid ) * rect.grid;

               if( yDiff >= MainActivity.startBoard && yDiff <= MainActivity.startBoard + (MainActivity.BdimY-rect.dimY+2)*rect.grid
                       && xDiff >= MainActivity.topBoard + (rect.dimX)*rect.grid && xDiff <= MainActivity.topBoard + rect.grid*(MainActivity.BdimX) ){
                   lParams.topMargin = yDiff;
                   lParams.leftMargin = xDiff;
               }
               else 
               {
                   lParams.leftMargin = (int) (x - xDelta);
                   lParams.topMargin = (int) (y - yDelta);
               }

               rect.setAlpha(0.7f);
               view.setLayoutParams(lParams);
               break;
           case MotionEvent.ACTION_UP:

               if (((RelativeLayout.LayoutParams) view.getLayoutParams()).topMargin >= MainActivity.startBoard && lParams.topMargin <= MainActivity.startBoard + (MainActivity.BdimY-rect.dimY+2) * rect.grid //27 = PlanszaY-RozmiarKlocka+1 (rozmiar klocka nie wiem czy x czy y)
                       && ((RelativeLayout.LayoutParams) view.getLayoutParams()).leftMargin >= MainActivity.topBoard + (rect.dimX) * rect.grid && lParams.leftMargin <= MainActivity.topBoard + rect.grid * (MainActivity.BdimX)) {//5=rozmiarem prostokata+1, 21= PlanszaX+1
                   rect.canMove = false;
                   rect.setAlpha(1f);
               }

               rect.setLayoutParams(lParams);

               break;
       }
和activity_main.xml:

    <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    >

    <ImageView
        android:id="@+id/imageBoard"
        android:layout_width="317dp"
        android:layout_height="466dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.533"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.139"
        app:srcCompat="@drawable/board2030" />

    <RelativeLayout
        android:id="@+id/layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/imageViewSquare"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:layout_marginStart="180dp"
            android:layout_marginLeft="180dp"
            android:layout_marginTop="600dp"
            android:layout_marginEnd="205dp"
            android:layout_marginRight="205dp"
            android:layout_marginBottom="161dp"
            android:scaleType="centerCrop"
            app:srcCompat="@drawable/square" />
    </RelativeLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

谢谢你的帮助

    <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    >

    <ImageView
        android:id="@+id/imageBoard"
        android:layout_width="317dp"
        android:layout_height="466dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.533"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.139"
        app:srcCompat="@drawable/board2030" />

    <RelativeLayout
        android:id="@+id/layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/imageViewSquare"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:layout_marginStart="180dp"
            android:layout_marginLeft="180dp"
            android:layout_marginTop="600dp"
            android:layout_marginEnd="205dp"
            android:layout_marginRight="205dp"
            android:layout_marginBottom="161dp"
            android:scaleType="centerCrop"
            app:srcCompat="@drawable/square" />
    </RelativeLayout>

</androidx.constraintlayout.widget.ConstraintLayout>