如何在安卓中拖拽和删除ARCore节点?



我有问题,我想在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
}
}
}

这是我删除区域的拖动侦听器

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)
}
}

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

下面是一个简单的代码片段,演示如何创建和删除节点:

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 帖子。

最简单的方法是在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)
}
}
}
}

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

最新更新