2011-02-11 12 views
5

Sto tentando di creare un'applicazione di realtà aumentata per Android e ho riscontrato il problema della sovrapposizione di viste di superficie. Ho bisogno di una vista di superficie per visualizzare l'anteprima della fotocamera sulla quale sovrapporrò la grafica, e ho bisogno di una vista di superficie per disegnare la mia grafica. Anche questa seconda superficie deve essere disegnata sopra l'anteprima della fotocamera, ma avere uno sfondo trasparente. Nella mia attuale implementazione, ho entrambe le viste di superficie che funzionano e appaiono come dovrebbero, ma lo sfondo non è trasparente e quindi non vi è alcun aspetto della seconda vista di superficie con la grafica disegnata sovrapposta alla vista di superficie dell'anteprima della fotocamera. Come si può ottenere questo? Dopo aver cercato numerose domande di overflow dello stack e altri forum, ho riscontrato molte opinioni contrastanti su questo argomento. Alcuni dicono che la stratificazione di viste superficiali in Android è impossibile, mentre altri dicono che si tratta di utilizzare un layout diverso (FrameLayout vs. LinearLayout?) Nello specifico, la mia implementazione include due viste: una classe, CustomCameraView, che estende SurfaceView e una classe , CustomDrawView, che estende anche SurfaceView contenuto in un FrameLayout con CustomDrawView visualizzato dopo CustomCameraView. Come possono essere sovrapposti in modo che CustomDrawView si sovrapponga a CustomCameraView?Layered SurfaceViews in un FrameLayout in Android

+0

Ti dispiace pubblicare il codice XML della tua vista e forse uno schermo veloce? Quindi alcune persone potrebbero testare e capire. –

risposta

7

Penso che molte persone hanno provato questo. Un Google Enginee ha dichiarato (here) chiaramente che è necessario evitare di impilare le viste di superficie. Anche se qualcuno ha trovato qualche trucco per farlo, probabilmente è incompatibile e porterà a problemi.

Penso che questo offre tre opzioni, a seconda delle vostre esigenze:

  • View (s) sulla parte superiore di Surface View

Utilizzare una superficie View per l'anteprima fotocamera e stack vista sulla cima di esso. Lo svantaggio di questo approccio è che il disegno su "normali" Views a) è più lento e b) ha luogo nel thread dell'interfaccia utente. Puoi andare in giro b) se implementi i fili da solo. Ma generalmente, questa è probabilmente la strada da percorrere se le sovrapposizioni contengono qualcosa come elementi dell'interfaccia utente o alcuni Drawable che non devono essere aggiornati troppo spesso.

  • fare tutto in un SurfaceView

Questo darà yo migliori prestazioni e meno overhead durante il runtime. Hai solo un SurfaceView. Composite le sovrapposizioni sul vostro SurfaceView e disegnate tutto lì. Certo, puoi combinare entrambi gli approcci.

  • fare tutto in un GLSurfaceView

Questo è probabilmente la strada da percorrere per le prestazioni reali. Come sopra, ma con il rendering della vista della telecamera su una trama OpenGL in un GLSurfaceView.

2

Ho ottenuto questo lavoro avere 2 viste trasparenti sopra SurfaceView della fotocamera utilizzando il seguente approccio:

mia attività imposta tutte le sue viste nel metodo onCreate(), non faccio uso di qualsiasi file di layout per questo. Sembra come segue:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(null); //savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    cameraPreview = new CameraPreview(this); 
    addContentView(cameraPreview, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

    animationView = new AnimationView(this); 
    addContentView(animationView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

    crosslinesView = new CrosslinesView(this); 
    addContentView(crosslinesView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
} 

cameraPreview è di tipo SurfaceView, animationView e crosslinesViews sono di tipo View. La onDraw() dei 2 ultimi vista appare come segue:

protected void onDraw(Canvas canvas) { 
    // Have the view being transparent 
    canvas.drawARGB(0, 0, 0, 0); 
    // Your drawing code goes here 
    // ... 
} 

Buona fortuna!

Problemi correlati