仅向上和向下拖动LinearLayout

时间:2015-07-20 20:59:04

标签: java android android-layout drag-and-drop android-linearlayout

我需要能够上下拖动包含TextView的LinearLayout。

LinearLayout是RelativeLayout的子项。

这是我的布局文件:

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".MainActivity">





        <LinearLayout
            android:id="@+id/drag"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#55000000"
            >


        <TextView
        android:id="@+id/display"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
            android:gravity="center"
        android:textSize="30sp"
        android:textColor="#fff"
        android:textStyle="bold"
            android:layout_gravity="center"
        android:text="The Quick Brown Fox Jumped!!"
        android:padding="15dp"
        />
        </LinearLayout>





</RelativeLayout>

这是我试过的代码。

 LinearLayout dragqueen;
 dragqueen = (LinearLayout) findViewById(R.id.drag);

  findViewById(R.id.drag).setOnTouchListener(new View.OnTouchListener()
    {
        int prevX,prevY;

        @Override
        public boolean onTouch(final View v,final MotionEvent event)
        {
            final FrameLayout.LayoutParams par=(FrameLayout.LayoutParams)v.getLayoutParams();
            switch(event.getAction())
            {
                case MotionEvent.ACTION_MOVE:
                {
                    par.topMargin+=(int)event.getRawY()-prevY;
                    prevY=(int)event.getRawY();
                    par.leftMargin+=(int)event.getRawX()-prevX;
                    prevX=(int)event.getRawX();
                    v.setLayoutParams(par);
                    return true;
                }
                case MotionEvent.ACTION_UP:
                {
                    par.topMargin+=(int)event.getRawY()-prevY;
                    par.leftMargin+=(int)event.getRawX()-prevX;
                    v.setLayoutParams(par);
                    return true;
                }
                case MotionEvent.ACTION_DOWN:
                {
                    prevX=(int)event.getRawX();
                    prevY=(int)event.getRawY();
                    par.bottomMargin=-2*v.getHeight();
                    par.rightMargin=-2*v.getWidth();
                    v.setLayoutParams(par);
                    return true;
                }
            }
            return false;
        }
    });

我不知道如何实现这一目标。我从网上的教程中复制了拖放代码.....

1 个答案:

答案 0 :(得分:2)

我之前没有搞过这个问题,你并没有真正说出问题,但是我会想到现在你可以把它拖到各个方向,而你只想要它可以在垂直轴上拖动。

话虽如此,我正在查看您的代码并查看x轴正在被更改的许多位置。更改leftMargin的位置是代码在水平轴上移动的位置。

试试这个,看看这是否符合您的要求:

    @Override
    public boolean onTouch(final View v,final MotionEvent event)
    {
        final FrameLayout.LayoutParams par=(FrameLayout.LayoutParams)v.getLayoutParams();
        switch(event.getAction())
        {
            case MotionEvent.ACTION_MOVE:
            {
                par.topMargin+=(int)event.getRawY()-prevY;
                prevY=(int)event.getRawY();
                v.setLayoutParams(par);
                return true;
            }
            case MotionEvent.ACTION_UP:
            {
                par.topMargin+=(int)event.getRawY()-prevY;
                v.setLayoutParams(par);
                return true;
            }
            case MotionEvent.ACTION_DOWN:
            {
                prevY=(int)event.getRawY();
                par.bottomMargin=-2*v.getHeight();
                v.setLayoutParams(par);
                return true;
            }
        }
        return false;
    }

如果这对你有用,请告诉我 约瑟夫梅多斯