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