Ruota la gerarchia della vista a 90 gradi

Sto lavorando su una sottoclass di FrameLayout che dovrebbe rotaire tutti i suoi figli di 90 gradi. Lo sto facendo per superare la limitazione della sola camera presente in android 2.1 e sotto, avendo l'attività in orizzontale, ma posizionando la sovrapposizione della camera in questa sovrapposizione framelayout per far apparire come se fosse ritratto ( così Layar lo fa ) Per realizzare questo, sto adattando il codice di Jeff Sharkey per ruotare le viste. Il mio problema è che posso ruotare il Framelayout, ma non posso ridimensionarlo per adattarmi alle nuove size. Così sulla mia g1, invece di una vista ritratta 320×480 su una vista da camera 480×320 in paesaggio, ho una scatola 320×320 in mezzo mostrando il mio ritratto vista con i lati tagliati fuori.

Ecco il mio codice finora:

  • Gradle Costruire solo un sapore
  • Il metodo getDrawingCache () di Android 2.1 View restituisce sempre null
  • La camera Android si blocca dopo aver scattato una foto
  • Come ritriggersre la tavolozza di progettazione in Android Studio
  • Android ListView personalizzato con ImageButton non sta ottenendo la messa a fuoco
  • Come modificare il text del text del frammento dall'attività
  • public class RotateLayout extends FrameLayout { private Matrix mForward = new Matrix(); private Matrix mReverse = new Matrix(); private float[] mTemp = new float[2]; public RotateLayout(Context context) { super(context); } public RotateLayout(Context context, AttributeSet attrs) { super(context, attrs); } /* (non-Javadoc) * @see android.widget.FrameLayout#onMeasure(int, int) */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //This didn't work: //super.onMeasure(heightMeasureSpec, widthMeasureSpec); } /* (non-Javadoc) * @see android.widget.FrameLayout#onSizeChanged(int, int, int, int) */ @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); } @Override protected void dispatchDraw(Canvas canvas) { canvas.rotate(270, getWidth()/2, getHeight()/2); //This code will stretch the canvas to accommodate the new screen size. This is not what I want. //float scaleX=(float)getHeight()/getWidth(); //float scaleY=(float)getWidth()/getHeight(); //canvas.scale(scaleX, scaleY, getWidth()/2, getHeight()/2); mForward = canvas.getMatrix(); mForward.invert(mReverse); canvas.save(); canvas.setMatrix(mForward); //This is the matrix we need to use for proper positioning of touch events super.dispatchDraw(canvas); canvas.restore(); } @Override public boolean dispatchTouchEvent(MotionEvent event) { final float[] temp = mTemp; temp[0] = event.getX(); temp[1] = event.getY(); mReverse.mapPoints(temp); event.setLocation(temp[0], temp[1]); return super.dispatchTouchEvent(event); } } 

    Ho provato a sostituire OnMeasure per passare le size X e Y della vista, ma non sono riuscito a farlo funzionare. Qualsiasi aiuto che puoi fornire è molto apprezzato.

  • Inserisci gli amici degli utenti facebook wall tramite applicazione android
  • Callback di Marshmallow Android quando l'utente revoca le autorizzazioni dalle impostazioni?
  • Com.google.android.c2dm.intent.REGISTRATION è obsoleto?
  • Come utilizzare correttamente NDK-Build in Android Studio 2.2 Anteprima 1
  • Imansible creare HTML5 Tag Audio per funzionare in browser per dispositivi mobili
  • Impostazione della dimensione di un DialogFragment
  • 6 Solutions collect form web for “Ruota la gerarchia della vista a 90 gradi”

    Ho avuto lo stesso problema e sono riuscito a risolverlo. Invece di ruotare each vista o il layout manualmente, ho usato un LayoutAnimationController.

    Innanzitutto, inserire un file in / res / anim / called rotazione.xml

     <?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:toDegrees="-90" android:pivotX="50%" android:pivotY="50%" android:duration="0" android:fillAfter="true"> </rotate> 

    Quindi, nel tuo Creazione onCreate, fai

      @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.myscreen); Animation rotateAnim = AnimationUtils.loadAnimation(this, R.anim.rotation); LayoutAnimationController animController = new LayoutAnimationController(rotateAnim, 0); FrameLayout layout = (FrameLayout)findViewById(R.id.MyScreen_ContentLayout); layout.setLayoutAnimation(animController); } 

    Se si desidera ruotare gli elementi che si trovano al di sopra della visualizzazione di anteprima della telecamera (SurfaceHolder), è sufficiente posizionare un FrameLayout sopra il SurfaceHolder, mettere tutti gli elementi in quella FrameLayout e call il layout "MyScreen_ContentLayout". Fatto.

    La speranza che ha aiutato qualcuno fuori, mi ha portto un bel po 'per get tutto insieme.

    Utilizzando il livello API 11 e successivo è ansible utilizzare il metodo setRotation(degreesFloat); per modificare la rotazione di una vista in modo programmato oppure è ansible utilizzare l'attributo XML android:rotation="" per modificarla nel tuo XML. Ci sono anche methods / attributi per modificare solo i valori X o Y della rotazione di una vista: Android Docs – View (setRotation) .

    Quindi oggi, a patto che tu utilizzi il livello API 11 o superiore, devi applicare la rotazione a un nodo di layout wrapper. Tuttavia, probabilmente dovrai anche cambiare le size del layout di livello superiore per corrispondere alle size desiderate dopo la rotazione. Vale a dire se si dispone di una vista visuale w / dimensions 800×1280, è necessario modificarle a 1280×800 in modo che possa allinearsi dopo aver ruotato in orizzontale.

    Utilizzando questa libreria puoi ruotare la gerarchia di visualizzazione intera https://github.com/rongi/rotate-layout

    Come questo

    immettere qui la descrizione dell'immagine

    Questo è ciò che ha funzionato per me in generale.

     private void init() { setRotation(90f); } public YourViewOrViewGroup(final Context context) { super(context); init(); } ... (all the View/ViewGroup constructors) ... @Override protected void onLayout(final boolean changed, final int l, final int t, final int r, final int b) { super.onLayout(changed, l, t, r, b); final int width = getWidth(); final int height = getHeight(); final int offset = Math.abs(width - height) / 2; setTranslationX(-offset); setTranslationY(offset); } @Override protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { super.onMeasure(heightMeasureSpec, widthMeasureSpec); } 

    Quello che vuoi fare è cambiare la width con l'altezza e poi mettere gli offset X & Y in modo che la visualizzazione diventa schermo pieno dopo la rotazione.

    Quanto sopra è una versione "rotta". Per get un paesaggio invertito applicare solo la rotazione di 270 gradi. Puoi modificare il codice all'interno dello snippet o applicare la rotazione in modo più generico, vale a dire

     final YourViewOrViewGroup layout = inflater.inflate(...); if (currentOrientation.isInverted()) { layout.setRotation(layout.getRotation + 180f); } 

    in questo modo è ansible incorporare la visualizzazione / ViewGroup ruotata all'interno della definizione xml e gonfiare le versioni "port" e "land" mentre l'orientamento dello schermo cambia, ma questo sembra fuori di questo argomento.

    Modifica: in realtà è molto meglio deferire l'impostazione offset fino a quando non è passato alless un passaggio di layout. Ciò è dovuto al fatto che nel mio caso dopo il primo onMeasure () la vista sarebbe stata disegnata (prima che gli offset venissero impostati). Alla fine potrebbe essere vissuto come glitching perché il layout / layout non sarebbe disegnato entro i limiti finali in un primo momento. (aggiornato lo snippet)

    Penso che hai dimenticato una linea nel tuo onMeasure.

     @Override protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(heightMeasureSpec, widthMeasureSpec); setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth()); } 

    Tratto dal codice di una barra di ricerca verticale qui: Come posso get un funzionamento verticale SeekBar in Android?

    Potrebbe essere necessario eseguire il violino con il getMeasuredHeight () per renderla la dimensione corretta dello schermo.

    Provare a distriggersre il ritaglio dei bambini della tua radice di visualizzazione: call setClipChildren(false) sul genitore del tuo RotateLayout e nel metodo OnMeasure del tuo RotateLayout mettere queste righe:

     super.onMeasure(heightMeasureSpec, widthMeasureSpec); setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth()); 

    Sto sostanzialmente lo stesso problema di te e non ho ancora provato la mia soluzione – lo farò domani e capisco se funziona correttamente.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.