2014-12-02 3 views
1

Surface 뷰를 생성하고 Surface 뷰 내부에 OpenGL 렌더러를 배치하는 하나의 Activity가있는 앱이 있습니다. OpenGL 렌더러 내에서 객체 선택을 처리하고 있습니다. 내가하고 싶은 일은 사용자가 특정 개체를 선택하여 텍스트 블록과 내가 파일에 저장 한 이미지를 표시하는 것입니다. 안드로이드의 PopupWindow 클래스가이 작업을 잘하는 것처럼 보입니다. OpenGL 렌더러 위에 팝업을 오버레이 할 수 있습니까? 아니면이 모든 것을 거꾸로 접근합니까?안드로이드 PopUpWindow

감사

답변

2

음, 내 친구가 당신과 함께 같은 문제가 있었다. 나는 내가 한 일을 설명 할 것이고 당신의 문제에 맞는 것이라고 생각합니다.

나는 메쉬를 표시하는 렌더러가 있습니다. 사용자는 메쉬에 주석을 달 수 있습니다. 당신이하는 것처럼 나는 또한 광선을 따기도합니다. 사용자가 주석을 클릭하면 팝업 창이 표시됩니다.

기본적으로 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를 호출합니다. 내가 도움이

희망 ...

1

팝업 창을위한 XML을 생성 한 다음 자바 파일에이 코드를 사용 :

public void popupWindow() { 
    PopupWindow pw; 
    LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View layout = inflater.inflate(R.layout.popup_window, (ViewGroup) findViewById(R.id.txtPusdNotR)); 

    pw = new PopupWindow(layout, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true); 
    pw.showAtLocation(layout, Gravity.CENTER, 0, 0); 

    // Get your Buttons and other tags here 

}