java - Android:拖放按钮(按钮消失;按钮的位置)

标签 java android drag-and-drop touch-event

我正在开发一个应用程序,我想在其中拖动一个按钮。我写了两个程序。问题是他们每个人都只满足了我想要的特定部分。我想要一个可以在屏幕上自由移动的按钮(没有消失之类的东西),我还需要程序在移动时给我本地按钮位置的坐标(永久)。

第一个程序中是拖动时按钮消失的问题。这发生在 x 和 y 的负值以及正 x 值(不是正 y 值;这里是完美的)。正 y 值表示按钮上方的所有内容,正 x 值表示按钮右侧的所有内容,依此类推。对于负值,按钮会消失,就像有一堵墙覆盖了按钮。对于正 x 值,按钮会随着 x 值的上升而消失(有点像水中冒泡的药片)。

代码如下:

seat_leftright = (ImageButton) findViewById(R.id.seat_leftright);
    seat_leftright.setOnTouchListener(new OnTouchListener() {

   int k = 0;
   int prevX,prevY;
   int x=0;
   int y=0;

    @Override
    public boolean onTouch(final View v,final MotionEvent event)
      { 
      final LinearLayout.LayoutParams par=(LinearLayout.LayoutParams)v.getLayoutParams();        

      switch(event.getAction())
        {
        case MotionEvent.ACTION_MOVE:
          {

              if(k == 0){ //otherwise there would be an offset when touching the button the first time
                            prevY=(int)event.getRawY(); 
                prevX=(int)event.getRawX();
              }
              y+=prevY -(int)event.getRawY();
              prevY=(int)event.getRawY();                 
              par.bottomMargin = y;


              x+=(int)event.getRawX()-prevX;
              prevX=(int)event.getRawX();
                  par.leftMargin = x;


              Log.i("LOG","x: "+ x +", y: " + y );

              k++;

              v.setLayoutParams(par);

              return true; 
          }
        case MotionEvent.ACTION_UP:
          {
          par.bottomMargin=0;
          par.leftMargin=0;
          k=0;                  
          y=0;
          x=0;
          v.setLayoutParams(par);
          return true;
          }
        }
      return false;
      }
  });

}

在第二个程序中,我使用了 DragShadowBuilder 函数。这个按钮在这个程序中工作得很好,所以它不会消​​失之类的。在这里,我在接收值时遇到问题。我在移动时经常需要按钮的 x 和 y 位置。我用 Action_drag_location 尝试过,但它只在我将按钮拖动到另一个按钮上方时返回坐标(这里是按钮“arrow_down”)。用我的背景替换“arrow_down”按钮以不断接收坐标根本不起作用。我还尝试将我的第一个程序与第二个程序结合起来,结果我根本没有收到任何值。

我希望你能帮我解决这个问题。我很感激所有的帮助!

下面是第二个程序的代码。

OnTouchListener myOnTouchListener = new OnTouchListener() {


        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {

            if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(
                        view);
                view.startDrag(null, shadowBuilder, view, 0);
                view.setVisibility(View.INVISIBLE);
                return true;
            }



            if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                view.setVisibility(View.VISIBLE);}
                return true;

        }
    };

    OnDragListener myDragListener = new OnDragListener() {

        @Override
        public boolean onDrag(View layoutview, DragEvent dragevent) {

            int action = dragevent.getAction();
            View view = (View) dragevent.getLocalState();

            switch (action) {
            case DragEvent.ACTION_DRAG_STARTED:
                Log.i("LOG","DragStarted");
                break;
            case DragEvent.ACTION_DRAG_ENTERED:
                break;
            case DragEvent.ACTION_DRAG_LOCATION:
                float x = (int)layoutview.getX();
                float y = (int)layoutview.getY();
                Log.i("COORDS","X: " + x +" Y: " + y);
                break;
            case DragEvent.ACTION_DRAG_EXITED:
                break;
            case DragEvent.ACTION_DROP:                 
                break;

            case DragEvent.ACTION_DRAG_ENDED:
                Log.d("LOG", "Drag ended");
                if (dropEventNotHandled(dragevent)) {
                    view.setVisibility(View.VISIBLE);
                }
                break;
            default:
                break;
            }
            return true;
        }

        private boolean dropEventNotHandled(DragEvent dragEvent) {
            return !dragEvent.getResult();
        }
    };

    findViewById(R.id.arrow_up).setOnTouchListener(myOnTouchListener);    
    findViewById(R.id.arrow_down).setOnDragListener(myDragListener);  

最佳答案

@Jay:感谢您的帮助,但这并没有解决问题。消失的按钮是由于我的布局,我有这个:

<?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"
android:background="@drawable/seat" >

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_marginLeft="20dp"
    android:layout_marginBottom="160dp"
    android:orientation="vertical" >

    <ImageButton
        android:id="@+id/seat_updown"
        android:layout_width="120dp"
        android:layout_height="140dp"
        android:scaleType="fitCenter"
        android:src="@drawable/doublearrow"
        android:rotation="90" /> />


</LinearLayout>

因为 ImageButton 嵌入到 LinearLayout 中,所以它消失了!

关于java - Android:拖放按钮(按钮消失;按钮的位置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21705750/

相关文章:

c# - 滚动时拖放事件会中断 GUI 的平滑运动

java - 在浏览器上运行 swing 应用程序

android - 无法访问 zzbfm 类文件 zzbfm 未找到,firebase,android?

delphi - 如何在普通应用程序和 UAC 提升权限应用程序之间启用拖放

java - 带有自定义布局按钮的警报对话框

android - 无法从 Assets 文件夹 Android Studio 加载 HTML

java - 仅为 Swing 中的特定目标启用放置

java - DateTimeFormatter 无效日期在 LocalDateTime.parse 之后得到调整

java - 了解hibernate中依赖对象集合的限制

java - 指向新引用的 ArrayList 会调用 GC