Android 从一个视图到另一个视图的代理触摸事件
我正在尝试使用touch view事件实现我自己的拖放。我想通过长时间单击触发拖动,在onLongClick中,我将视图阴影创建为位图,该位图设置为imageview。这是我要拖动的图像视图。我的问题是,在长时间单击事件之后,imageview不会立即响应触摸事件。我必须停止触摸屏幕并再次点击imageview,然后我的图像会移动 一些相关代码:Android 从一个视图到另一个视图的代理触摸事件,android,view,drag-and-drop,touch-event,Android,View,Drag And Drop,Touch Event,我正在尝试使用touch view事件实现我自己的拖放。我想通过长时间单击触发拖动,在onLongClick中,我将视图阴影创建为位图,该位图设置为imageview。这是我要拖动的图像视图。我的问题是,在长时间单击事件之后,imageview不会立即响应触摸事件。我必须停止触摸屏幕并再次点击imageview,然后我的图像会移动 一些相关代码: mCategoryNews.setOnLongClickListener(new View.OnLongClickListener() {
mCategoryNews.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
v.setVisibility(View.INVISIBLE);
ImageView shadow = (ImageView) getView().findViewById(R.id.imgViewShadow);
shadow.setLayoutParams(new FrameLayout.LayoutParams(v.getWidth(), v.getHeight()));
shadow.setImageBitmap(Utils.loadBitmapFromView(v));
shadow.bringToFront();
((FrameLayout.LayoutParams) shadow.getLayoutParams()).leftMargin = rowCategories1.getLeft();
((FrameLayout.LayoutParams) shadow.getLayoutParams()).topMargin = rowCategories1.getTop();
return true;
}
});
private View.OnTouchListener mDragShadowTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d(TAG, "onTouch");
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
Log.d(TAG, "action move");
int x = (int) event.getRawX();//- rowCategories1.getLeft() - v.getWidth() / 2;
int y = (int) event.getRawY();//- rowCategories1.getTop() - v.getHeight();
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(mRowWidth / 2, mRowHeight);
params.setMargins(x, y, 0, 0);
v.setLayoutParams(params);
break;
case MotionEvent.ACTION_DOWN:
break;
}
return true;
}
};
长时间点击后,当我仍在屏幕上按住手指时,不存在日志输出。我相信委托人可以尝试返回false如果在
onLongClick()
中返回true
,则表示回调已完成,因此不会进一步传播。如果返回false
,则它将到达子视图。(我假设触摸监听器设置在shadow ImageView上)。这是一个迟来的答案,但我遇到了一个类似的问题,找到了这个解决方案:
通过dispatchTouchEvent方法将MotionEvent传递给应该接管它的视图
View myView = findViewById(R.id.myView);
@Override
public boolean onTouchEvent(MotionEvent event) {
myView.dispatchTouchEvent(event);
}
MotionEvent传递后,myView将接管并响应新的触摸事件。如果可能,您能否共享与此问题相关的示例代码