При нажатии на объект, чтобы перетащить его, он прыгает прямо в угол - PullRequest
1 голос
/ 29 марта 2020

Это происходит потому, что я установил 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>

Спасибо за любую помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...