我需要能够上下拖动包含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;
}
});
我不知道如何实现这一目标。我从网上的教程中复制了拖放代码.....
答案 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;
}
如果这对你有用,请告诉我 约瑟夫梅多斯