Это происходит потому, что я установил Rule of CENTER HORIZONTAL и ALIGN PARENT BOTTOM в 0 для Layout, но без удаления этих правил объект вообще не перемещается. Мне нужны эти правила, потому что это объект, созданный в коде, и я не могу установить его заранее в файле 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;
}
Основная деятельность:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final RelativeLayout layout = findViewById(R.id.layout);
final ImageView imageSquare = findViewById(R.id.imageViewSquare);
imageSquare.post(new Runnable() {
@Override
public void run() {
TouchListener touchListener = new TouchListener();
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.CENTER_HORIZONTAL);
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
ImageView imageBoard = findViewById(R.id.imageBoard);
getBitmapPositionInsideImageView(imageBoard);
sendViewToBack(imageBoard);
int[] dimensions = getBitmapPositionInsideImageView(imageBoard);
int startOfBoard = dimensions[0];
startBoard = startOfBoard;
int topOfBoard = dimensions[1];
topBoard = topOfBoard;
int gridSize = dimensions[2] / BdimX;//zakładam, że kratki są idealnie kwadratowe
Rectangle r = new Rectangle(getApplicationContext());
int SDimx = 4;
int SDimy = 4;
r.setImageBitmap( createRectangle(SDimx, SDimy, gridSize));
r.dimX = SDimx;
r.dimY = SDimy;
r.grid = gridSize;
rects.add(r);
for(Rectangle piece : rects){
piece.setOnTouchListener(touchListener);
layout.addView(piece);
piece.setLayoutParams(params);
}
}
});
}
и 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>
Спасибо за любую помощь!