在恢复活动之前手指在屏幕上时识别MotionEvent.ACTION_MOVE

时间:2015-01-07 14:43:58

标签: android ontouchlistener

我正在尝试将视图从一个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();
        //*************************************************
    }
}

1 个答案:

答案 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功能结合使用。

希望这有帮助