java - 拖放到相对布局中

标签 java android

我对java和android编程的知识非常有限(不是来自编程背景)。所以如果可能的话请用外行术语解释一下。基本上,我正在尝试制作一个可以随心所欲移动的麻将牌。我想解决以下问题:

  1. 我已经通过 XML 设置了按钮(位于屏幕底部)的初始布局。拖动按钮时,按钮将跳到屏幕顶部。我尝试使用 .getX() 而不是 .getRawX(),但按钮会以困惑的模式移动。而且模拟器速度很慢。

  2. 如何为我创建的每个按钮设置边界?就像我不想让按钮在我拖动其中一个按钮时彼此重叠。因此,这意味着如果我将图 block A 移动到图 block B 上,图 block B 将尝试通过移开来避免重叠(或者更好的主意,请参见第 3 条)。

  3. 需要大致了解如何使按钮在足够靠近时彼此对齐。意味着当我将图 block A 移近图 block B 时,图 block A 将与图 block B 并排排列。我不希望它们连接在一起(只是对齐),并且只需将任何图 block 移开即可轻松破坏它们。

这是拖放的代码,我引用了这个论坛的某人:

@Override
public boolean onTouch(View view, MotionEvent event) {
    final int X = (int) event.getRawX();  
    final int Y = (int) event.getRawY();      

    switch (event.getAction() & MotionEvent.ACTION_MASK) {
         case MotionEvent.ACTION_DOWN:
             RelativeLayout.LayoutParams Params = (RelativeLayout.LayoutParams) view.getLayoutParams();
                xDelta = X - Params.leftMargin;
                yDelta = Y - Params.topMargin;

             break;
         case MotionEvent.ACTION_UP:
             break;
         case MotionEvent.ACTION_POINTER_DOWN:
             break;
          case MotionEvent.ACTION_POINTER_UP:
             break;
          case MotionEvent.ACTION_MOVE:
              //restrict image from going over the screen boundary

              if ( (X - xDelta <= -5 || X - xDelta >= 390 ) ||
                   (Y - yDelta <= -5 || Y - yDelta >= 630 ) 
                  )
                  break;


              //Goes back to default drag and drop sequence
              else {
              RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
              layoutParams.leftMargin = X - xDelta;
              layoutParams.topMargin = Y - yDelta;          
              layoutParams.rightMargin = -10;
              layoutParams.bottomMargin = -10;

              view.setLayoutParams(layoutParams);
              break;
              }
      }

      environment.invalidate();
      return true;  
}

最佳答案

android 2.2 中的拖放

这里我给出了我的代码,它可以让你成功。我的主类在这里

package info.tempDD;
 import android.app.Activity;
    import android.graphics.Rect;
    import android.graphics.drawable.Drawable;
    import android.os.Bundle;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.view.ViewGroup;
    import android.view.ViewGroup.LayoutParams;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.ImageView;
    import android.widget.RelativeLayout;

   public class TempDDActivity extends Activity implements OnTouchListener {
        /** Called when the activity is first created. */
        private View selected_item = null;
        private int offset_x = 0;
        private int offset_y = 0;
        Boolean touchFlag=false;
        boolean dropFlag=false;
        LayoutParams imageParams;
        ImageView imageDrop,image1,image2;
        int crashX,crashY;
        Drawable dropDrawable,selectDrawable;
        Rect dropRect,selectRect;
        int topy,leftX,rightX,bottomY;



int dropArray[];    

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.main);
        ViewGroup container = (ViewGroup) findViewById(R.id.container);
        imageDrop=(ImageView) findViewById(R.id.ImgDrop);       
        image1=(ImageView) findViewById(R.id.img);      
        image2=(ImageView) findViewById(R.id.img2);
        container.setOnTouchListener(new View.OnTouchListener() 
        {
            public boolean onTouch(View v, MotionEvent event) 
            {
                if(touchFlag==true)
                {
                    System.err.println("Display If  Part ::->"+touchFlag);
                    switch (event.getActionMasked()) 
                    {
                    case MotionEvent.ACTION_DOWN :

                         topy=imageDrop.getTop();
                         leftX=imageDrop.getLeft();
                         rightX=imageDrop.getRight();   
                         bottomY=imageDrop.getBottom();
                        System.err.println("Display Top-->"+topy);      
                        System.err.println("Display Left-->"+leftX);
                        System.err.println("Display Right-->"+rightX);
                        System.err.println("Display Bottom-->"+bottomY);                


                        //opRect.
                        break;
                    case MotionEvent.ACTION_MOVE:
                        crashX=(int) event.getX();
                        crashY=(int) event.getY();
                        System.err.println("Display Here X Value-->"+crashX);
                        System.err.println("Display Here Y Value-->"+crashY);

                        int x = (int) event.getX() - offset_x;
                        int y = (int) event.getY() - offset_y;                                          
                        //int w = getWindowManager().getDefaultDisplay().getWidth() - 100;
                        //int h = getWindowManager().getDefaultDisplay().getHeight() - 100;
                        int w = getWindowManager().getDefaultDisplay().getWidth() - 50;
                        int h = getWindowManager().getDefaultDisplay().getHeight() - 10;
                        if (x > w)
                            x = w;
                        if (y > h)
                            y = h;                      
                        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(new ViewGroup.MarginLayoutParams(  RelativeLayout.LayoutParams.WRAP_CONTENT,   RelativeLayout.LayoutParams.WRAP_CONTENT));
                        lp.setMargins(x, y, 0, 0);                  

                        //Drop Image Here                       
                        if(crashX > leftX && crashX < rightX && crashY > topy && crashY < bottomY )                     
                        {                           
                            Drawable temp=selected_item.getBackground();                            
                            imageDrop.setBackgroundDrawable(temp);
                            imageDrop.bringToFront();                           
                            dropFlag=true;
                            selected_item.setVisibility(View.INVISIBLE);
                        }
                        //Drop Image Here                       
                        selected_item.setLayoutParams(lp);
                        break;  
                    case MotionEvent.ACTION_UP:
                        //                      
                        touchFlag=false;
                        if(dropFlag==true)
                        {
                            dropFlag=false;
                        }
                        else
                        {
                            selected_item.setLayoutParams(imageParams);
                        }                       
                        break;
                    default:
                        break;
                    }
                }else
                {
                    System.err.println("Display Else Part ::->"+touchFlag);
                }               
                return true;
            }
        });

        image1.setOnTouchListener(this);
        image2.setOnTouchListener(this);
    }

    public boolean onTouch(View v, MotionEvent event) 
    {   
        switch (event.getActionMasked()) 
        {
        case MotionEvent.ACTION_DOWN:
            touchFlag=true;
            offset_x = (int) event.getX();
            offset_y = (int) event.getY();
            selected_item = v;
            imageParams=v.getLayoutParams();
            break;
        case MotionEvent.ACTION_UP:
            selected_item=null;
            touchFlag=false;
            break;
        default:
            break;
        }       
        return false;
    }
}

此后创建一个类并扩展您的主布局,如relativelayout

package info.tempDD;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.RelativeLayout;

public class TouchInterceptor extends RelativeLayout {
    public TouchInterceptor(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {

        return super.onInterceptTouchEvent(ev);
    }

}

以及主我的 Xml 文件

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

    <ImageView
        android:id="@+id/ImgDrop"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignParentTop="true"
        android:layout_centerInParent="true"
        android:layout_marginTop="50dp"
        android:background="#FFFFFF" >
    </ImageView>

    <ImageView
        android:id="@+id/img"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignParentBottom="true"
        android:background="@drawable/ic_launcher" >
    </ImageView>

    <ImageView
        android:id="@+id/img2"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:background="@drawable/ic_launcher" >
    </ImageView>

</RelativeLayout>

引用https://stackoverflow.com/a/11431727/2771869

关于java - 拖放到相对布局中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23804111/

相关文章:

java - JAX-RS 自动将 List<Object> 编码为 JSON

Java GUI 兼容 Mac 和 Windows

java - 如何从 eclipse 测试运行器中删除 Junit4

java - 从一个方法访问另一个方法中的变量

android - 查询Android联系人获取ACCOUNT_TYPE和ACCOUNT_NAME

android - 如何在不从项目中删除的情况下从android中的构建路径中排除lib文件

java - 如何删除 jackson 中重复的@JsonProperty

android - 如何在 Android 应用程序 (Java) 中创建自定义谷歌地图样式

android - Titanium for Android 中的轻量级窗口动画

android - 解析错误 : there is a issue while parsing the package in marshmallow