ARFragment on Fragment
This is a memo code. ARFragment on Fragment
I use childFragmentManager
Code
This is MyFragment.kt
.
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.Nullable
import com.google.ar.core.*
class MyFragment : Fragment() {
private lateinit var arFragment: MyARFragment
private var arShowing: Boolean = false
override fun onCreateView(
inflater: LayoutInflater, @Nullable container: ViewGroup?, @Nullable savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_sample, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
arFragment = childFragmentManager.findFragmentById(R.id.ar_fragment) as MyARFragment
arFragment.arSceneView.scene
.addOnUpdateListener {
onUpdateFrame()
}
}
private fun onUpdateFrame() {
val frame = arFragment.arSceneView.arFrame ?: return
// If there is no frame, just return.
val updatedAugmentedImages =
frame.getUpdatedTrackables(
AugmentedImage::class.java
)
for (augmentedImage in updatedAugmentedImages) {
when (augmentedImage.trackingState) {
TrackingState.TRACKING -> {
if(!arShowing){
val anchor = arFragment.arSceneView.session!!.createAnchor(augmentedImage.centerPose)
val node =
MyViewNode(context)
node.setImage(augmentedImage, anchor)
arFragment.arSceneView.scene.addChild(node)
arShowing = true
}
}
TrackingState.STOPPED -> {
arShowing = false
}
}
}
}
}
This is fragment_sample.xml
.
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".fragment.MyFragment">
<fragment android:name="io.mizuki.fragment.MyARFragment"
android:id="@+id/ar_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
This is MyViewNode.xml
import android.content.Context
import android.util.Log
import android.widget.TextView
import com.google.ar.core.Anchor
import com.google.ar.core.AugmentedImage
import com.google.ar.core.Pose
import com.google.ar.sceneform.AnchorNode
import com.google.ar.sceneform.Node
import com.google.ar.sceneform.math.Quaternion
import com.google.ar.sceneform.math.Vector3
import com.google.ar.sceneform.rendering.Color
import com.google.ar.sceneform.rendering.ExternalTexture
import com.google.ar.sceneform.rendering.FixedHeightViewSizer
import com.google.ar.sceneform.rendering.ViewRenderable
import java.util.concurrent.CompletableFuture
class CommentViewNode(context: Context?) : AnchorNode() {
init {
argumentedView = ViewRenderable.builder()
.setView(context, R.layout.ar_view)
.setVerticalAlignment(ViewRenderable.VerticalAlignment.BOTTOM)
.setSizer(FixedHeightViewSizer(0.09f))
.build()
}
fun setImage(aImage: AugmentedImage, aAnchor: Anchor) {
image = aImage
viewAnchor = aAnchor
if (!argumentedView!!.isDone) {
CompletableFuture.allOf(
argumentedView
)
.thenAccept {
setImage(
image,
viewAnchor
)
}
.exceptionally { throwable: Throwable? ->
Log.e(
TAG,
"Exception loading",
throwable
)
null
}
}
argumentedView!!.thenAccept { viewRenderable ->
anchor = image.createAnchor(
image.centerPose)
// Add setting of view
val view = viewRenderable.view
view.findViewById<TextView>(R.id.txtView).text = "Message"
val node = Node()
node.setParent(this)
node.renderable = viewRenderable
val pose = Pose.makeTranslation(0.0f, 0.0f, 0.12f)
node.localRotation = Quaternion(pose.qx(), 90f, -90f, pose.qw())
}
}
companion object {
private var argumentedView: CompletableFuture<ViewRenderable>? = null
private lateinit var image: AugmentedImage
private lateinit var viewAnchor: Anchor
private val TAG = this::class.java.simpleName
}
}
Ref
Read other posts