음, 내 친구가 당신과 함께 같은 문제가 있었다. 나는 내가 한 일을 설명 할 것이고 당신의 문제에 맞는 것이라고 생각합니다.
나는 메쉬를 표시하는 렌더러가 있습니다. 사용자는 메쉬에 주석을 달 수 있습니다. 당신이하는 것처럼 나는 또한 광선을 따기도합니다. 사용자가 주석을 클릭하면 팝업 창이 표시됩니다.
기본적으로 UI 스레드에서 팝업을 실행하는 렌더러에서 메소드를 호출해야합니다. (OpenGl은 자체 스레드에서 실행됩니다).
더 구체적으로, 당신은 여기 당신이 핸들러를 작성해야합니다 팝업
을 표시하는 핸들러에 YourRenderer.java
@Override
public void onDrawFrame(GL10 gl) {
.... code that displays the mesh ...
if(userRequestedPopup) {
Message message = new Message();
message.what = DialogHandler.OPEN_ANNOTATION;
// Here you can create a Bundle in order to pass more data inside the Message
dialogHanlder.sendMessage(message);
userRequestedPopup = false;
}
....
}
YourGLSurfaceView.java을 메시지를 보낼 수 있습니다
public class DialogHandler extends Handler {
... other constants ...
public static final int OPEN_ANNOTATION = 2;
...
@Override
public void handleMessage(Message msg) {
if (msg.what == OPEN_ANNOTATION) {
new YourPopup(context, msg);
}
}
}
팝업을 만들기 전에 ld는 XML로 자신의 레이아웃을 디자인한다 (또는 원하는 경우 프로그래밍 방식으로 생성). 코드를 이해하기 위해서는 레이아웃 popup_layout
으로 전화해야합니다. glsurfaceview의 레이아웃에 빈 레이아웃을 추가해야합니다 (이 레이아웃은 너비와 높이로 PARENT 레이아웃을 채워야합니다). 팝업을 유지할 LinearLayout을 가정 해 봅시다. 나는이이 솔루션은 나를 위해 잘 작동하기 때문에 당신이 필요로하는 무슨 생각이 popupHolder
public Popup(Context context, Message message) {
this.context = context;
Activity parent = (Activity) context;
// here you can have the instance of the holder from glSurfaceView
LinearLayout parentLayout = (LinearLayout) parent.findViewById(R.id.popupHolder);
// inflate your custom popup layout or create it dynamically
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.popup_layout, null);
// Now you should create a PopupWindow
PopupWindow popupWindow = new PopupWindow(view,
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
// you can change the offset values or the Gravity. This will diaply the popup in the center
// of your glSurfaceView
popupWindow.showAtLocation(parentLayout, Gravity.CENTER, 0, 0);
}
YourPopup.java를 호출합니다. 내가 도움이
희망 ...