在正确的触摸位置拖动Imageview

时间:2016-08-17 09:45:26

标签: java android ios math canvas

通常简单的数学,但我没有找到正确的解决方案。首先,我有一个触摸式监听器,可以拖放在我的情况下称为贴纸的imageview。然后,当用户在贴纸上按住手指至少1秒钟时,将启动拖动模式,用户可以拖动图像视图。

不幸的是,我现在使用贴纸的中间位置,但我想要真实触摸imageview的位置。

这就是我对touchevent的把握

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (v instanceof Sticker) {
        Log.i(TAG, "onTouch()");
        Sticker sticker = (Sticker) v;
        Log.i("Sticker"," Found "+sticker.isFound());
        Log.i("Sticker"," Found "+sticker.moving);
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.i("Sticker", " Found moving");
                handler.postDelayed(mLongPressed, LONGPRESS_TIME);
                //Take time for the short click
                tslong = System.currentTimeMillis() / 1000;

                if(sticker.isFound()) {
                    //Get X,Y for the threshold
                    mDownX = event.getX();
                    mDownY = event.getY();
                }
                break;
            case MotionEvent.ACTION_MOVE:
                Log.i("Sticker"," Found moving");
                if(sticker.isFound()) {
                    if (sticker.moving) {
                        if (Math.abs(mDownX - event.getX()) > SCROLL_THRESHOLD || Math.abs(mDownY - event.getY()) > SCROLL_THRESHOLD)
                            handler.removeCallbacks(mLongPressed);

                        sticker.coodinates.x = event.getRawX() - sticker.getWidth() / 2;
                        sticker.coodinates.y = event.getRawY() - sticker.getHeight() * 2 / 3;

                        if (sticker.coodinates.x > (layoutSizeWidth * 0.99) - sticker.getWidth()) {
                            sticker.coodinates.x = (float) ((layoutSizeWidth * 0.99)- sticker.getWidth());
                        } else if (sticker.coodinates.x < 0) {
                            sticker.coodinates.x = 1;
                        }

                        if (sticker.coodinates.y > layoutSizeHeight - (sticker.getHeight() * 2 / 2)) {
                            sticker.coodinates.y = layoutSizeHeight - (sticker.getHeight() * 2 / 2);
                        } else if (sticker.coodinates.y < 0) {
                            sticker.coodinates.y = 1;
                        }
                        sticker.setX(sticker.coodinates.x);
                        sticker.setY(sticker.coodinates.y);
                    }
                }
                break;

            case MotionEvent.ACTION_UP:
                if((System.currentTimeMillis()/1000) - tslong < INVOKE_POPUP_TIME)
                    handleSimpleClick(v, event);

                if(sticker.isFound()) {
                    if (sticker.moving) {
                        sticker.setX(sticker.coodinates.x);
                        sticker.setY(sticker.coodinates.y);
                        mDownX = event.getX();
                        mDownY = event.getY();
                        sticker.moving = false;
                    }
                    handler.removeCallbacks(mLongPressed);
                }
                break;
        }
        return true;
    }
    return false;
}

在这里,当用户触摸贴纸1秒钟时,我设置贴纸的位置。

sticker.coodinates.x = event.getRawX() - sticker.getWidth() / 2;
sticker.coodinates.y = event.getRawY() - sticker.getHeight() * 2 / 3;

enter image description here

这是一个更好理解的gif: enter link description here

仔细观察,您会看到跳转到触控输入。但贴纸应在触摸位置上可拖动。很难用英语说:我甚至无法用我的母语解释它。

1 个答案:

答案 0 :(得分:0)

对不起伙计们。最后,我发现了错误。首先,我必须保存X和Y坐标之间的差距。之后,在Motion事件切换到Action_Move之前,我将触摸事件的当前输出减去我的计算。

这里是Action_Down案例的代码:

getLocationInWindow(startingPointOfImage);
gapX = (int)(event.getRawX()-startingPointOfImage[0]);
gapY = (int)(event.getRawY()-startingPointOfImage[1]);

现在我得到了事件的输入,并通过计算差距来减去它们。

sticker.coodinates.x = event.getRawX()-gapX;
sticker.coodinates.y = event.getRawY()-gapY;

以将当前X和Y值设置为imageview

结束
sticker.setX(sticker.coodinates.x);
sticker.setY(sticker.coodinates.y);