1

我有问题,我想在 ArFragment 中拖动和删除对象。我试图将 ontouchlistener 添加到每个节点并 ondraglistener 以删除区域。这是我的代码:

这是我的触摸监听器

    override fun onTouch(view: View, motionEvent: MotionEvent): Boolean {
        if (motionEvent.getAction() === MotionEvent.ACTION_DOWN) {
            val data = ClipData.newPlainText("", "")
            val shadowBuilder = View.DragShadowBuilder(
                view
            )
            view.startDrag(data, shadowBuilder, view, 0)
            view.setVisibility(View.INVISIBLE)
            return true
        } else {
            return false
        }
    }
}

这是我用于删除区域的 Draglistener

internal class MyDragListener: View.OnDragListener {

    override fun onDrag(v: View, event: DragEvent): Boolean {
        when (event.getAction()) {
            DragEvent.ACTION_DRAG_STARTED -> {
                v.visibility = View.VISIBLE
            }
            DragEvent.ACTION_DRAG_ENTERED -> v.visibility = View.VISIBLE
            DragEvent.ACTION_DRAG_EXITED -> v.visibility = View.GONE
            DragEvent.ACTION_DROP -> {
            }
            DragEvent.ACTION_DRAG_ENDED -> v.visibility = View.GONE
            else -> {
            }
        }// do nothing
        return true
    }
}

这是我当前的删除节点(所有节点)

fun removeAllSticker(fragment: ArFragment) {
        val nodeList = ArrayList(fragment.getArSceneView().getScene().getChildren())
        for (childNode in nodeList) {
            if (childNode is AnchorNode) {
                if ((childNode as AnchorNode).anchor != null) {
                    (childNode as AnchorNode).anchor!!.detach()
                    fragment.getArSceneView().getScene().removeChild(childNode)
                    (childNode as AnchorNode).setParent(null)
                }
            }
        }
        cleanupFragment(fragment)
    }

    private fun cleanupFragment(fragment: ArFragment) {
        val scene = fragment.arSceneView.scene
        fragment.setOnTapArPlaneListener(null)
        scene!!.removeOnUpdateListener{
            fragment.onUpdate(it)
        }
    }

请帮帮我,我被卡住了,已经在谷歌上搜索了

4

2 回答 2

2

这是一个简单的代码片段,展示了如何创建和删除节点:

AnchorNode anchorsNode = new AnchorNode(anchor);
anchorsNode.setParent(arFragment.getArSceneView().getScene());

Node holdNode = new Node();
holdNode.setParent(anchorsNode);
holdNode.setRenderable(yourModelRenderable);

holdNode.setOnTouchListener(new Node.OnTouchListener() {

    @override
    public boolean onTouch(HitTestResult hitTestResult, 
                             MotionEvent motionEvent) {

        anchorsNode.removeChild(holdNode);
        return true;
    }
});

或者,您可以使用这篇文章中的示例代码。

如果你想知道如何在 ARCore 中拖动节点,请阅读这篇RW 帖子。

于 2019-10-12T12:58:27.590 回答
0

最简单的方法是在 onTouchListener() 或 onPeekListener() 中使用 MotionEvent.ACTION_MOVE

when (MotionEventCompat.getActionMasked(motion)) {
    MotionEvent.ACTION_DOWN -> {
        MotionEventCompat.getActionIndex(motion).also { pointerIndex ->
            mLastTouchX = MotionEventCompat.getX(motion, pointerIndex)
            mLastTouchY = MotionEventCompat.getY(motion, pointerIndex)
        }
        mActivePointerId = MotionEventCompat.getPointerId(motion, 0)
    }
    MotionEvent.ACTION_MOVE -> {
        val (x: Float, y: Float) =
            MotionEventCompat.findPointerIndex(motion, mActivePointerId).let { pointerIndex ->
                MotionEventCompat.getX(motion, pointerIndex) to
                        MotionEventCompat.getY(motion, pointerIndex)
            }
        marker?.node?.localPosition = Vector3(touchRightLeft+mPosX, initLocalPosition.y, touchTopBottom+mPosY)
        mLastTouchX = x
        mLastTouchY = y
    }
    MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
        mActivePointerId = INVALID_POINTER_ID
    }
    MotionEvent.ACTION_POINTER_UP -> {
        MotionEventCompat.getActionIndex(motion).also { pointerIndex ->
            MotionEventCompat.getPointerId(motion, pointerIndex)
                .takeIf { it == mActivePointerId }
                ?.run {
                    val newPointerIndex = if (pointerIndex == 0) 1 else 0
                    mLastTouchX = MotionEventCompat.getX(motion, newPointerIndex)
                    mLastTouchY = MotionEventCompat.getY(motion, newPointerIndex)
                    mActivePointerId = MotionEventCompat.getPointerId(motion, newPointerIndex)
                }
        }
    }
}

另请参阅官方 Android 文档https://developer.android.com/training/gestures/scale?hl=zh-tw

于 2022-01-11T13:17:25.477 回答