Преместване на бутони чрез докосване

Искам да преместя бутоните си на друго място с докосване. Имам предвид, че ако потребителят докосне един бутон и отиде на друго място чрез докосване, бутонът се премества. Пиша този код за един от бутоните, но когато докосна един бутон, три бутона се преместват, както и един бутон не може да се премести надясно или наляво и когато се преместя в горната част на екрана, част от бутона на изображението се изтрива!

Какъв е проблемът? и как мога да разреша това? Искам да стартирам тази програма в 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