Перемещение кнопок через Touch

Я хочу переместить свои кнопки в другое место с помощью прикосновения. Я имею в виду, что если пользователь коснется одной кнопки и перейдет в другое место с помощью касания, кнопка переместится. Я пишу этот код для одной из кнопок, но когда я нажимаю одну кнопку, перемещаются три кнопки, а одна кнопка не может двигаться вправо или влево, а когда я перемещаюсь в верхнюю часть экрана, часть кнопки изображения удаляется!

В чем проблема? и как я могу это решить? Я хочу запустить эту программу в Android +2.2

onButton.setOnTouchListener(new OnTouchListener(){

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            switch(event.getAction()){
                case MotionEvent.ACTION_MOVE:
                    RelativeLayout.LayoutParams relativeLayout=(RelativeLayout.LayoutParams) oneButton.getLayoutParams();
                    int x=(int)event.getRawX();
                    int y=(int)event.getRawY();

                    relativeLayout.leftMargin=x-50;
                    relativeLayout.rightMargin=x-50;
                    relativeLayout.topMargin=y-50;
                    relativeLayout.bottomMargin=y-50;
                    oneButton.setLayoutParams(relativeLayout);
                    break;
                    default:
                        break;
            }
            return true;
        }

    });

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<ImageView
    android:id="@+id/img"
    android:src="@drawable/root"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"/>
<ImageButton 
    android:id="@+id/btnOne"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_marginRight="35dip"
    android:layout_alignParentTop="true"
    android:layout_marginTop="70dip"
    android:src="@drawable/oneButton"
    android:background="@null"
    android:visibility="invisible"/>
<ImageButton 
    android:id="@+id/btnTwo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_marginLeft="35dip"
    android:layout_alignParentTop="true"
    android:layout_marginTop="70dip"
    android:src="@drawable/twoButton"
    android:background="@null"
    android:visibility="invisible"/>
   <ImageButton 
    android:id="@+id/btnThree"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/btnOne"
    android:layout_alignParentLeft="true"
    android:layout_marginLeft="15dip"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="10dip"
    android:src="@drawable/ThreeButton"
    android:background="@null"
    android:visibility="invisible"/>
   <ImageButton 
    android:id="@+id/btnFour"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/btnTwo"
    android:layout_alignParentRight="true"
    android:layout_marginRight="15dip"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="10dip"
    android:src="@drawable/fourButton"
    android:background="@null"
    android:visibility="invisible"/> 

</RelativeLayout>

Спасибо....


person SensorS    schedule 07.10.2013    source источник
comment
Здесь нет никого, кто помог бы мне!!   -  person SensorS    schedule 07.10.2013


Ответы (1)


Создайте новый класс, реализующий OnTouchListener.

import android.annotation.SuppressLint;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.MarginLayoutParams;
import android.widget.RelativeLayout;

public class MultiTouchListener implements OnTouchListener
{

private float mPrevX;
private float mPrevY;

public MainActivity mainActivity;
public MultiTouchListener(MainActivity mainActivity1) {
    mainActivity = mainActivity1;
}

@Override
public boolean onTouch(View view, MotionEvent event) {
    float currX,currY;
    int action = event.getAction();
    switch (action ) {
        case MotionEvent.ACTION_DOWN: {

            mPrevX = event.getX();
            mPrevY = event.getY();
            break;
        }

        case MotionEvent.ACTION_MOVE:
        {

                currX = event.getRawX();
                currY = event.getRawY();


                MarginLayoutParams marginParams = new MarginLayoutParams(view.getLayoutParams());   
                marginParams.setMargins((int)(currX - mPrevX), (int)(currY - mPrevY),0, 0);
                RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams);
                view.setLayoutParams(layoutParams); 


            break;
        }



        case MotionEvent.ACTION_CANCEL:
            break;

        case MotionEvent.ACTION_UP:

            break;
    }

    return true;
}

}

Теперь в своем основном действии установите OnTouchListener в своем представлении... это ваш imageButton или imageView;

MultiTouchListener touchListener=new MultiTouchListener(this);
onButton.setOnTouchListener(touchListener);
person Bhavna    schedule 07.10.2013
comment
Спасибо за ваш код, но снова у моей программы есть проблема :( Когда я касаюсь и пытаюсь переместиться в другое место, btnFour перемещается с помощью btnOne (оба вместе!!), а когда я касаюсь btnTwo, btnThree перемещается с этим (но это произошло первым ходом до я касаюсь btnThree и btnFour!) и я хочу, чтобы когда пользователь нажимал на кнопки, отображалось другое действие, я реализовал это с помощью метода onClick(), но теперь с этим кодом метод onClick() не работает. Какой код я добавляю в класс MultiTouchListener для решить onClick()??Спасибо - person SensorS; 07.10.2013
comment
Добавьте следующее в тег кнопки в свой XML, кнопку, которую вы хотите нажать android:focusable=true android:focusableInTouchMode=true - person Bhavna; 07.10.2013
comment
и еще одна проблема заключается в том, что когда я перемещаю свои кнопки в нижнюю часть экрана или вправо от экрана, часть моих кнопок удаляется, как часть кнопок находится в ImageView. Почему? Есть ли у вас какие-либо предложения? - person SensorS; 07.10.2013
comment
Я добавляю этот код, но мои проблемы не решаются. Снова я касаюсь своих кнопок, не показывает другую активность, и когда я сначала касаюсь btnOne и btnTow, btnFour и btnThree перемещаются с этим! Я думаю, что моя проблема в файле xml, но я не знаю, как я могу это решить. - person SensorS; 07.10.2013
comment
Для проблемы с выходом вашей кнопки за пределы экрана.. Вы можете поставить какое-то условие в MotionEvent.ACTION_MOVE: чтобы проверить, не выходит ли ваш вид за пределы экрана. Для этого вы можете использовать if(currX‹ screenWidth) { view.setLayoutParams(layoutParams); } , где screenWidth — это ширина устройства. Вы должны получить это через какой-то код. Аналогично для оси Y устройства.. - person Bhavna; 07.10.2013
comment
для перемещения двух кнопок вместе, я проверяю, удаляю ли я layout_alignBelow, моя проблема решена, но мои кнопки отображаются внизу экрана, и я не хочу этого :( Почему это произошло? - person SensorS; 07.10.2013
comment
Попробуйте использовать два относительных макета, один из которых содержит две вышеуказанные кнопки, а другой содержит кнопки ниже и выравнивание второго относительного макета под вторым. - person Bhavna; 07.10.2013
comment
Я проверю это около 10-12 часов, и если у меня возникнут какие-либо вопросы, я спрошу вас или отправлю ваш ответ :) Спасибо. - person SensorS; 07.10.2013
comment
@SensorS Да .. пожалуйста, сообщайте о любых вопросах - person Bhavna; 09.10.2013
comment
Можете ли вы сказать, что на самом деле делает MarginLayoutParams marginParams = new MarginLayoutParams( arg0.getLayoutParams()); marginParams.setMargins((int)( currentX - mPrevX), (int)( currentY - mPrevY),0, 0); LayoutParams layoutParams = new LinearLayout.LayoutParams(marginParams); arg0.setLayoutParams(layoutParams); ? - person utkarsh dubey; 08.09.2016