通过触摸移动按钮

Posted

技术标签:

【中文标题】通过触摸移动按钮【英文标题】:Moving buttons via Touch 【发布时间】:2013-10-07 07:31:46 【问题描述】:

我想通过触摸将我的按钮移动到另一个位置。我的意思是如果用户触摸一个按钮并通过触摸转到另一个地方,按钮就会移动。我为其中一个按钮编写了这段代码,但是当我触摸一个按钮时,三个按钮也会移动,一个按钮不能向右或向左移动,当我移动到屏幕顶部时,图像按钮的一部分被删除!

有什么问题?我该如何解决这个问题?我想在 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_
android:layout_>

<ImageView
    android:id="@+id/img"
    android:src="@drawable/root"
    android:layout_
    android:layout_
    android:layout_alignParentTop="true"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"/>
<ImageButton 
    android:id="@+id/btnOne"
    android:layout_
    android:layout_
    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_
    android:layout_
    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_
    android:layout_
    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_
    android:layout_
    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>

谢谢....

【问题讨论】:

这里没有人帮助我!! 【参考方案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;



现在在您的 Main 活动中,在您的视图上设置 OnTouchListener...即您的 imageButton 或 imageView;

MultiTouchListener touchListener=new MultiTouchListener(this);
onButton.setOnTouchListener(touchListener);

【讨论】:

感谢您的代码,但我的程序再次出现问题:(当我触摸并尝试移动到另一个地方时,btnFour 与 btnOne 一起移动(两者一起!!)当我触摸 btnTwo 时,btnThree 移动这(但在我触摸 btnThree 和 btnFour 之前,这首先发生了!)我希望当用户单击按钮时,显示另一个活动,我使用 onClick() 方法实现了这个,但现在使用此代码,onClick() 方法不起作用。我在 MultiTouchListener 类中添加了哪些代码来解决 onClick()??谢谢 在你的 XML 中的 button 标签中添加以下内容,你要点击的按钮 android:focusable="true" android:focusableInTouchMode="true" 另一个问题是当我将按钮移动到屏幕底部或屏幕右侧时,我的部分按钮被删除,就像按钮的一部分位于 ImageView 下。为什么?你有什么建议吗? 我添加了这段代码,但我的问题没有解决。我再次触摸我的按钮不显示另一个活动,当我先触摸 btnOne 和 btnTow 时,btnFour 和 btnThree 随之移动!我认为我的问题出在 xml 文件中,但我不知道如何解决这个问题。 对于按钮跳出屏幕的问题。您可以在 MotionEvent.ACTION_MOVE: 中设置一些条件来检查您的视图是否不会跳出屏幕。为此,您可以使用 if(currX

以上是关于通过触摸移动按钮的主要内容,如果未能解决你的问题,请参考以下文章

触摸屏幕上的任何位置,除了 GUI 按钮 Android Unity

(Swift) 如何使用触摸按钮更改 pageviewcontroller 中的视图

这是通过触摸导航栏中间的按钮来显示视图并通过触摸其他任何地方将其删除的好方法吗?

根据是不是通过触摸输入按下按钮来应用事件

斯威夫特,触摸 UIButton 并触摸另一个

如何通过触摸在屏幕上拖动手指来移动 3D 对象