我正在尝试将视图从一个Activity移动到另一个Activity(在LongClick之后)。如果弹出第二个Activity,则用户应该能够在屏幕上移动View。
可悲的是,如果用户在更改活动期间决定将手指放在屏幕上,Android似乎不会发送MotionEvent。在用户抬起手指并再次按下之前,我的onTouchListener不会被调用。我已经尝试将MotionEvent.Action_Down发送到我的View以触发监听器,但这并没有像我希望的那样帮助接收Action_Move事件。那里有什么想法吗?
这是我最近的OnResume:
@Override
protected void onResume(){
super.onResume();
if (getIntent().hasExtra("PluginAdded")){
Screen screen = Screen.getInstance(this);
String pluginName = getIntent().getStringExtra("PluginName");
Point fingerPos = new Point(getIntent().getIntExtra("FingerPosX", 0), getIntent().getIntExtra("FingerPosY", 0));
PluginManager pluginManager = new PluginManager(this);
Plugin plugin = pluginManager.getPlugin(APIConstants.PLUGIN_STRING + "." + pluginName, true);
int pluginSize = plugin.getSize();
PluginContainer container = new PluginContainer(this, plugin, 1, fingerPos, screen.getSlots(), screen.getActualSmallestSize());
final FrameLayout containerView = addContainerView(container);
//HERE'S THE RELEVANT PART***********************
OnTouchListener fingerMoved = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getActionMasked() == (MotionEvent.ACTION_MOVE)){
containerView.setX(event.getRawX());
containerView.setY(event.getRawY());
}
return true;
}
};
containerView.setOnTouchListener(fingerMoved);
//Doesn't help at all
MotionEvent eventActionDown = MotionEvent.obtain(SystemClock.uptimeMillis()-1, SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, fingerPos.x, fingerPos.y, 0);
containerView.dispatchTouchEvent(eventActionDown);
eventActionDown.recycle();
//*************************************************
}
}
答案 0 :(得分:0)
由于您在活动之间移动,您必须将触摸事件状态存储在全局变量中,可以在两个活动之间访问。
有了这个,你需要一个单独的应用程序上下文类,如下所示:
import android.app.Application;
public class GlobalVars extends Application {
public static Boolean mouseDown = false;
}
可以像这样访问变量:
final GlobalVars globs = (GlobalVars)context.getApplicationContext();
globs.mouseDown = true;
所以考虑到这一点,这应该是你的onTouchListener可能是这样的:
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v,MotionEvent event) {
final GlobalVars globs = (GlobalVars)context.getApplicationContext();
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
globs.mouseDown = true;
break;
case MotionEvent.ACTION_UP:
globs.mouseDown = false;
break;
}
return true;
}
});
如果这些功能属于您的第一个活动,则必须与您的x和y功能结合使用。
希望这有帮助