2015-10-13 80 views
0

我有两个自定义视图组,用于实现motionevent的onTouchListener。Android MotionEvent:在视图之间传输

我正在使用framelayout来显示它们两者。 第二个视图组的大小比第一个小。 所以第一个是在后台,第二个是前台。

我想将第二/较小视图组的项目拖动到背景视图组。

问题:当拖动的项目的背景的ViewGroup (i.e mAwesomePager),我想ACTION_UP要在第二的ViewGroup触发(较小的一个),并ACTION_MOVE要在第一ViewGroup中触发,所以基本上touchEvent从较小的ViewGroup转移到在背景和MotionEvent继续较大的一个没有用户必须从屏幕上拿起手指,然后再放回来。

下面是一些有用的代码:

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    if (mRectOut == true) { 
     ev.setAction(MotionEvent.ACTION_UP); 
     mFrame.bringChildToFront(mAwesomePager); 
     //mAwesomePager.setClickable(true); 

     // Obtain MotionEvent object 
     long downTime = SystemClock.uptimeMillis(); 
     long eventTime = SystemClock.uptimeMillis() + 100; 
     // List of meta states found here: developer.android.com/reference/android/view/KeyEvent.html#getMetaState() 
     int metaState = 0; 
     MotionEvent motionEvent = MotionEvent.obtain(
       downTime, 
       eventTime, 
       MotionEvent.ACTION_DOWN, 
       ev.getX(), 
       ev.getY(), 
       metaState 
     ); 
     mAwesomePager.getChildAt(mAwesomePager.mLastDragged).dispatchTouchEvent(motionEvent); 
    } 
//some more code here 

} 

我想通过这个ev.setAction(MotionEvent.ACTION_UP);模拟触摸关在前景看,现在我想的背景视图接管控制触摸而触摸是拿着拖动的图像。

回答

0

更改此 mAwesomePager.getChildAt(mAwesomePager.mLastDragged).dispatchTouchEvent(motionEvent);

这个

return mAwesomePager.dispatchTouchEvent(motionEvent);

最终没有获得成功。

0

考虑看看onTouchEvent()方法的文档,更具体的返回参数:

返回
如果事件被处理,否则。

如果你希望你的事件将被传递到你的背景来看,你需要确保当一个ACTION_UP发生时,该方法返回false因此Android知道运动事件尚未消耗,应中继到层次结构中的下一个视图。

这里是做什么一个基本的片断:

public boolean onTouchEvent(MotionEvent ev) { 
    if (event.getAction() == MotionEvent.ACTION_UP) { 
     // handle ACTION_UP with the foreground view 
     return false; // event will be sent to the background view 
    } else { 
     // handle ACTION_MOVE with the foreground view 
     return true; // event will stop here 
    } 
} 

请记住,你的背景图也需要实现其反过来要做到这一点触摸监听器。

+0

感谢您的回复。我想通过'ev.setAction(MotionEvent.ACTION_UP)'来模拟前景视图中的触摸;',现在我希望背景视图在触摸持有拖动的图像时控制触摸。 'return false'终止两个视图的触摸事件。 –

+0

假设您保持返回true,您创建的motionEvent是否被分派到背景视图? –