2012-12-18 11 views
6

Sto costruendo una app per fotocamera che sfrutta l'anteprima della fotocamera. Per poter utilizzare l'intero schermo per l'anteprima, ho bloccato l'attività conorientamento schermo android: blocco solo parti del layout

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

Ora ho seguente problema: ogni volta che rendere un form o devo mostrare una finestra di dialogo, si vede sempre in modalità orizzontale, anche quando l'utente utilizza il proprio dispositivo in modalità verticale. Ho provato a ruotare le viste di edittext usando le animazioni di trasformazione e sono ruotate correttamente, ma non riesco ancora a focalizzarle e la tastiera appare sempre in orizzontale :(

Conosci NESSUN modo di trovare il modo di aggirare qui

IMPORTANTE: rilevare l'orientamento non è il problema qui la domanda è:.. come faccio a ruotare le forme/views/viewgroups e tastiera in un modo che sono ancora utilizzabili

So che deve essere possibile in qualche modo: l'app per fotocamera di Samsung (che viene fornita con la galassia S3) è in grado di ruotare le viste senza r otating the preview, quindi deve essere possibile! vedere:

http://www.letsgomobile.org/images/reviews/0186/galaxy-s3-camera.jpg

http://cdn2.mos.techradar.futurecdn.net//art/mobile_phones/Samsung/GalaxyS3/Galaxy%20Fire/Samsung_Galaxy_S3_25-580-100.JPG

+0

Hai provato a iniziare una nuova attività come una finestra di dialogo (con android: theme = "@ android: style/Theme.Dialog" nella descrizione dell'attività) invece di utilizzare la finestra di dialogo effettiva? Ho il sospetto che questa finta finestra di dialogo debba reagire ai cambiamenti di orientamento nel solito modo in cui si blocca solo l'attività della videocamera in orientamento orizzontale. Sfortunatamente non posso provarlo da solo al momento. – Audrius

+0

non ho ancora provato. sarebbe bello se ciò funzionasse ... – stoefln

+0

non funziona, l'ho provato: l'attività di dialogo viene visualizzata anche in orizzontale, indipendentemente da come sto ruotando il dispositivo. – stoefln

risposta

2

La Camera Application Samsung sta usando una modifica Orientamento Ascoltatore con il sensore di orientamento. Se l'utente blocca la rotazione del dispositivo dalle impostazioni, la rotazione continua a verificarsi.

Avrete bisogno di un Crea il tuo widget personalizzati pieno, quindi non è possibile utilizzare costruire nella finestra di dialogo, è necessario mostrare un CustomDialog ....

L'idea di base è quello di utilizzare OrientationEventListener e SensorManager. Nella rotazione del dispositivo devi aggiornare l'interfaccia utente e ruotare le visualizzazioni con il nuovo orientamento. Ecco un tutorial sull'uso di OrientationEventListener How to use OrientationEventListener Nella maggior parte delle app per fotocamere, l'attività è ancora bloccata su LANDSCAPE. Tutte le applicazioni della fotocamera fanno questo trucco per facilitare la gestione della modifica delle dimensioni di SurfaceView con la rotazione.

+0

Ho già implementato l'OrientationEventListener- che non è il problema qui ... Tuttavia , quindi quello che stai dicendo è che non posso usare lo ScrollView standard, l'Edittext e altre cose? Devo davvero scrivere il mio? I widget samsung (almeno le immagini a scorrimento) assomigliano alle viste standard di Android. E pensi che ci sia qualche possibilità di ruotare la tastiera? – stoefln

+0

È necessario implementare entrambi gli orientamenti (layout_portrait e layout land). dopodiché, quando l'orientamento si sposta su 0, devi impostare il ritratto, e quando la rotazione cambia in (270 + -20) devi rimuovere le viste e gonfiare il paesaggio, e attaccarlo. –

+0

e la tastiera? – stoefln

0

Bisogna ignorare il comportamento delle attività ruotando il dispositivo, è necessario aggiungere orientationChange nel vostro mafinest e quindi aggiungere listener per questo evento e ruotare manualmente le vostre opinioni .

E se si utilizza questo metodo, tutte le finestre di dialogo (viste di sistema) verranno visualizzate correttamente.

Controllare questo: http://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges

E questo: How to handle screen orientation change when progress dialog and background thread active? (seconda risposta credo)

+0

non capisco. cosa intendi con "Devi sovrascrivere il comportamento dell'attività ruotando il tuo dispositivo"? – stoefln

+0

Se hai detto nel tuo manifest che gestirai configChanges: orientaion - sarai in grado di sovrascrivere onConfigurationChanged (Configuration) o qualcosa del genere e in questo metodo puoi ruotare manualmente solo le viste neccesarry – dilix

+0

sì, ma come ho già scritto, ruotando il edittexts o la tastiera non funzionano a livello di programmazione. sai come farlo? – stoefln

2

Impostando questa proprietà

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

stai fissando lo schermo solo per LANDSCAPE, dopo questo anche se l'utente sta tenendo il dispositivo in modalità verticale, non verrà ruotato in modalità verticale. Puoi fare una cosa secondo la mia comprensione del tuo problema.

android:configChanges="orientation" 

Nel file di eventi aggiungere questa proprietà sopra alla tua attività. E nella classe Activity sovrascrive il metodo onConfigurationChange, dove puoi gestire le modifiche di orientamento in base alle tue esigenze, invece di bloccare Activity to Landscape.

Se ho capito il tuo problema in modo corretto, allora potrebbe aiutarti.

+0

So che posso farlo. Ma, come ho già scritto, non sono riuscito a rendere un modulo (o un pulsante) ruotato di edittext che funziona ancora, e la tastiera appare sempre in modalità orizzontale. – stoefln

0

è meglio provare a utilizzare un'altra attività come finestra di dialogo e impostarne le proprietà (orientamento e tema) nel manifesto e utilizzarla.

+0

non funziona, l'ho appena provato: l'attività di dialogo viene visualizzata anche in orizzontale, indipendentemente da come sto ruotando il dispositivo. – stoefln

0

Nel file manifesto dare le proprietà di seguito per la vostra attività anteprima fotocamera android:configChanges="keyboardHidden|orientation" per più leggere this

<activity 
     android:name=".Your_Activity_Name" 
     android:configChanges="keyboardHidden|orientation" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <!-- Your filter attributes if any. --> 
     </intent-filter> 
    </activity> 

E la classe di attività di override onConfigurationChanged & fare il necessario (come del bisogno) a schermo preoccupazione modalità di orientamento (ad esempio, orizzontale o verticale) come this_

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    // Checks the orientation of the screen 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
     //Your code to do the other things in landscape mode... 

    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
     Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     //Your code to do the other things in portrait mode... 

    } 
} 

spero che questo vi aiuterà a sbarazzarsi del problema.

+0

cool, non sapevo che era possibile ruotare un messaggio di Toast. Tuttavia, non so ancora come ruotare gli elementi del modulo – stoefln

+0

quando questo cambierà l'orientamento di Android. chiamerà 'onConfigurationChanged' ogni volta che cambia l'orientamento dello schermo. –

+0

no, non si occuperà della rotazione, poiché chiamo setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); al fine di bloccare l'anteprima della fotocamera in orizzontale -> Android bloccherà l'intera attività – stoefln

0

afaik: La rotazione si ottiene catturando gli eventi di orientamento e gonfiando lo schermo con il nuovo layout in base a tale orientamento.

  1. gonfiare nel paesaggio
  2. rotazione avviene
  3. gonfiare le parti dello schermo che si desidera modificare vale a dire per esempio che gonfiare la vista supporto per i tasti con il nuovo layout per i pulsanti ritratto invece di paesaggio .

È necessario che il layout venga tagliato in parti aggiunte in runtime.

Un altro modo per raggiungere questo obiettivo è quello di utilizzare una vista di superficie per l'anteprima della fotocamera, per esempio e l'utilizzo di un altro layout per tenere la superficie e per aggiungere su di esso con framelayout

+0

Non voglio che l'app si rigonfia. Basti pensare alle immagini scattate in modalità 45 ° - non vuoi certamente ricostruire l'intera interfaccia ogni volta che l'utente ruota il suo telefono tra orizzontale e verticale – stoefln

Problemi correlati