所以我在Android中与触摸事件/手势进行交互。我做的第一件事是在相对布局中创建一个textview,我可以拖动它。
Java代码为:
public class draggystuff extends ActionBarActivity implements View.OnTouchListener {
private TextView mTextView;
private ViewGroup mRootLayout;
private int _xDelta;
private int _yDelta;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_draggystuff);
mRootLayout = (ViewGroup) findViewById(R.id.root);
mTextView = (TextView) mRootLayout.findViewById(R.id.textView);
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mTextView.getLayoutParams();
mTextView.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, 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 lParams = (RelativeLayout.LayoutParams) mTextView.getLayoutParams();
_xDelta = X - lParams.leftMargin;
_yDelta = Y - lParams.topMargin;
Log.d("x is", String.valueOf(_xDelta));
Log.d("y is", String.valueOf(_yDelta));
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_MOVE:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mTextView
.getLayoutParams();
layoutParams.leftMargin = X - _xDelta;
layoutParams.topMargin = Y - _yDelta;
layoutParams.rightMargin = -250;
layoutParams.bottomMargin = -250;
mTextView.setLayoutParams(layoutParams);
break;
}
mRootLayout.invalidate();
return true;
}
}
这很好。它在左上角设置了textview,我可以在屏幕上拖动它。当我停止拖动时,它会保持在我离开的地方。
接下来,我决定从屏幕中央的textview开始。为了做到这一点,我修改了我的OnCreate方法如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_draggystuff);
mRootLayout = (ViewGroup) findViewById(R.id.root);
mTextView = (TextView) mRootLayout.findViewById(R.id.textView);
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mTextView.getLayoutParams();
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
mTextView.setOnTouchListener(this);
}
这实现了TextView居中的目标,但是现在当我拖动它时它不会移动。我认为这可能是因为居中属性将其锁定在适当的位置。我想如果我在改变它的坐标之前移除居中属性,那可能会起作用。所以我在ontouch方法中添加了一行,如下所示:
public boolean onTouch(View v, 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 lParams = (RelativeLayout.LayoutParams) mTextView.getLayoutParams();
_xDelta = X - lParams.leftMargin;
_yDelta = Y - lParams.topMargin;
Log.d("x is", String.valueOf(_xDelta));
Log.d("y is", String.valueOf(_yDelta));
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_MOVE:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mTextView
.getLayoutParams();
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, 0);
layoutParams.leftMargin = X - _xDelta;
layoutParams.topMargin = Y - _yDelta;
layoutParams.rightMargin = -250;
layoutParams.bottomMargin = -250;
mTextView.setLayoutParams(layoutParams);
break;
}
mRootLayout.invalidate();
return true;
}
现在,然而,textview开始在屏幕的中间,但一旦拖动甚至开始,它立即移动到左上角之前跟随我的手指的相对运动!
我怎样才能使textview在相对布局中居中,使它既不锁定在适当的位置,也不会在拖动之前移回角落?
而不是使用相对布局,尝试线性布局和使用setGravity(Gravity.CENTER)在你的textview,看看它是否确实是addrule方法,导致textview忽略任何触摸事件。
另外,您是否尝试使用XML应用布局参数,并查看问题是否在那里重现?
最后,是否textview移动到左上角的向下动作事件或移动动作事件?
所以为了解决这个问题,我改变了我移动视图的方式。
我的xdelta和ydelta变量变成如下:
_xDelta = X - mTextView.getX();
_yDelta = Y - mTextView.getY();
然后在我的action_move事件中,我没有设置左距和上距,而是简单地使用setX和setY方法,如下所示:
mTextView.setX(X-_xDelta);
mTextView.setY(Y-_yDelta);