Autore Topic: Disegnare su SurfaceView  (Letto 693 volte)

Offline Fullydroid

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +1
    • Mostra profilo
Disegnare su SurfaceView
« il: 28 Maggio 2014, 11:41:33 CEST »
0
Ciao ragazzi,

vi dico subito che non sono un esperto android.
Vi spiego il mio problema:

Nella mia SurfaceView uso la classe camera per poter scattare foto.

Ho implementato tutte le callBack del surfaceHolder e fin qui tutto ok.

Ora il mio grande ostacolo è riuscire a disegnare nella preview della fotocamera un rettangolo al centro. (il problema è disegnarlo non centrarlo xD)

Questo problema mi sta distruggendo...

In quale momento con la canvas posso disegnare?

Devo fare tutto nella public void surfaceChanged?

Se avete del codice gia fatto su come disegnare sulla preview postatelo pure è ben accetto.

Grazie Ragazzi!!! :-(

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Disegnare su SurfaceView
« Risposta #1 il: 29 Maggio 2014, 21:23:42 CEST »
0
Non puoi disegnare direttamente nella preview in tempo reale della camera, è gestita in hardware e non usa neanche RGB per i pixel. Devi creare un layer aggiuntivo sopra la preview della camera e usare alpha channel. Non è facile per un principiante, consiglio di iniziare con qualcosa di molto più semplice.

Inviato dal mio Nexus 5 utilizzando Tapatalk

« Ultima modifica: 30 Maggio 2014, 20:09:00 CEST da iceweasel »
adb logcat | tee /tmp/logcat | grep TAG

Offline Fullydroid

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +1
    • Mostra profilo
Re:Disegnare su SurfaceView
« Risposta #2 il: 03 Giugno 2014, 08:42:55 CEST »
0
Non puoi disegnare direttamente nella preview in tempo reale della camera, è gestita in hardware e non usa neanche RGB per i pixel. Devi creare un layer aggiuntivo sopra la preview della camera e usare alpha channel. Non è facile per un principiante, consiglio di iniziare con qualcosa di molto più semplice.

Inviato dal mio Nexus 5 utilizzando Tapatalk

Ciao, grazie per la risposta, potresti mica fornirmi qualche esempio e o guida per l'implementazione?

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Disegnare su SurfaceView
« Risposta #3 il: 03 Giugno 2014, 09:53:34 CEST »
0
Se non vuoi sbatterti con i Canvas e draw puoi semplicemente piazzare dentro un RelativeLayout laSurfaceView (fillparent) ed una ImageView (della size voluta e senza alcun alignParent, di modo che ti vada in centro)
Dentro l'ImageView ci piazzi una png 9patch con sfondo trasparente che rappresenta il rettangolo.

Ciao.

Offline Fullydroid

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +1
    • Mostra profilo
Re:Disegnare su SurfaceView
« Risposta #4 il: 03 Giugno 2014, 14:39:07 CEST »
0
Se non vuoi sbatterti con i Canvas e draw puoi semplicemente piazzare dentro un RelativeLayout laSurfaceView (fillparent) ed una ImageView (della size voluta e senza alcun alignParent, di modo che ti vada in centro)
Dentro l'ImageView ci piazzi una png 9patch con sfondo trasparente che rappresenta il rettangolo.

Ciao.


Ciao, grazie della risposta,

hai mica un esempio per l'implementazione?
Perche ho provato come dici tu ma non ci sono riuscito.
La mia applicazione ha un relative Layout con ai lati 2 linearLayout e al centro la surface.
Quando creo la mia Imageview giustamente me la mette sotto alla surface e quindi non riesco vedere l'immagine al suo interno.

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Disegnare su SurfaceView
« Risposta #5 il: 03 Giugno 2014, 15:11:56 CEST »
0
Guarda, io ho un app di prova in cui ho una SurfaceView e 3 TextView davanti....
Credo che sostituento la TextView con un ImageView tutto continui a funzionare...

Questo è un cut&paste del layout (essendo una cosa di prova, ci sono delle proprietà che non servono)

Codice (XML): [Seleziona]
    <RelativeLayout
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_alignParentTop="true"
       android:layout_alignParentRight="true"
       android:layout_alignParentEnd="true"
       android:id="@+id/camera_preview">

        <SurfaceView
           android:layout_width="fill_parent"
           android:layout_height="fill_parent"
           android:id="@+id/surfaceView"
           android:layout_gravity="center"
           android:layout_alignParentLeft="true"
           android:layout_marginLeft="0dp"
           android:layout_alignParentTop="true"
           android:layout_marginTop="0dp" />

        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textAppearance="?android:attr/textAppearanceMedium"
           android:text="Medium Text"
           android:layout_gravity="left|bottom"
           android:layout_alignParentLeft="true"
           android:layout_alignParentTop="false"
           android:layout_alignParentBottom="true"
           android:id="@+id/focal_length" />

        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textAppearance="?android:attr/textAppearanceMedium"
           android:text="Medium Text"
           android:id="@+id/focus_distance"
           android:layout_alignParentBottom="false"
           android:layout_alignParentLeft="true"
           android:layout_alignParentStart="false"
           android:layout_above="@+id/focal_length"
           android:layout_marginBottom="10dp" />

        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textAppearance="?android:attr/textAppearanceMedium"
           android:text="Medium Text"
           android:id="@+id/focus_depth"
           android:layout_above="@+id/focus_distance"
           android:layout_alignParentLeft="true"
           android:layout_alignParentStart="false"
           android:layout_marginBottom="10dp" />

    </RelativeLayout>

Sostituendo TextView con
Codice (XML): [Seleziona]
        <ImageView
           android:layout_width="100dp"
           android:layout_height="100dp"
           android:layout_centerVertical="true"
           android:layout_centerHorizontal="true"
           android:src="@drawable/ic_square"
           android:id="@+id/square" />

Dovresti avere il quadrato. Devi solo crearti l'immagine ic_square.9.png

Non credo ti serva il codice, visto che la preview della camera già ti funzionava, giusto?

Ciao.

Offline Fullydroid

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +1
    • Mostra profilo
Re:Disegnare su SurfaceView
« Risposta #6 il: 03 Giugno 2014, 15:22:29 CEST »
0
Guarda, io ho un app di prova in cui ho una SurfaceView e 3 TextView davanti....
Credo che sostituento la TextView con un ImageView tutto continui a funzionare...

Questo è un cut&paste del layout (essendo una cosa di prova, ci sono delle proprietà che non servono)

Codice (XML): [Seleziona]
    <RelativeLayout
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_alignParentTop="true"
       android:layout_alignParentRight="true"
       android:layout_alignParentEnd="true"
       android:id="@+id/camera_preview">

        <SurfaceView
           android:layout_width="fill_parent"
           android:layout_height="fill_parent"
           android:id="@+id/surfaceView"
           android:layout_gravity="center"
           android:layout_alignParentLeft="true"
           android:layout_marginLeft="0dp"
           android:layout_alignParentTop="true"
           android:layout_marginTop="0dp" />

        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textAppearance="?android:attr/textAppearanceMedium"
           android:text="Medium Text"
           android:layout_gravity="left|bottom"
           android:layout_alignParentLeft="true"
           android:layout_alignParentTop="false"
           android:layout_alignParentBottom="true"
           android:id="@+id/focal_length" />

        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textAppearance="?android:attr/textAppearanceMedium"
           android:text="Medium Text"
           android:id="@+id/focus_distance"
           android:layout_alignParentBottom="false"
           android:layout_alignParentLeft="true"
           android:layout_alignParentStart="false"
           android:layout_above="@+id/focal_length"
           android:layout_marginBottom="10dp" />

        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textAppearance="?android:attr/textAppearanceMedium"
           android:text="Medium Text"
           android:id="@+id/focus_depth"
           android:layout_above="@+id/focus_distance"
           android:layout_alignParentLeft="true"
           android:layout_alignParentStart="false"
           android:layout_marginBottom="10dp" />

    </RelativeLayout>

Sostituendo TextView con
Codice (XML): [Seleziona]
        <ImageView
           android:layout_width="100dp"
           android:layout_height="100dp"
           android:layout_centerVertical="true"
           android:layout_centerHorizontal="true"
           android:src="@drawable/ic_square"
           android:id="@+id/square" />

Dovresti avere il quadrato. Devi solo crearti l'immagine ic_square.9.png

Non credo ti serva il codice, visto che la preview della camera già ti funzionava, giusto?

Ciao.

Grazie per la risposta, sono quasi riuscito a fare quello che dici tu, ma ho dovuto usare l'attributo alpha.
Ora provo ancora un po e poi ti dico ;)

Post unito: 03 Giugno 2014, 15:41:31 CEST
Guarda, io ho un app di prova in cui ho una SurfaceView e 3 TextView davanti....
Credo che sostituento la TextView con un ImageView tutto continui a funzionare...

Questo è un cut&paste del layout (essendo una cosa di prova, ci sono delle proprietà che non servono)

Codice (XML): [Seleziona]
    <RelativeLayout
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_alignParentTop="true"
       android:layout_alignParentRight="true"
       android:layout_alignParentEnd="true"
       android:id="@+id/camera_preview">

        <SurfaceView
           android:layout_width="fill_parent"
           android:layout_height="fill_parent"
           android:id="@+id/surfaceView"
           android:layout_gravity="center"
           android:layout_alignParentLeft="true"
           android:layout_marginLeft="0dp"
           android:layout_alignParentTop="true"
           android:layout_marginTop="0dp" />

        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textAppearance="?android:attr/textAppearanceMedium"
           android:text="Medium Text"
           android:layout_gravity="left|bottom"
           android:layout_alignParentLeft="true"
           android:layout_alignParentTop="false"
           android:layout_alignParentBottom="true"
           android:id="@+id/focal_length" />

        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textAppearance="?android:attr/textAppearanceMedium"
           android:text="Medium Text"
           android:id="@+id/focus_distance"
           android:layout_alignParentBottom="false"
           android:layout_alignParentLeft="true"
           android:layout_alignParentStart="false"
           android:layout_above="@+id/focal_length"
           android:layout_marginBottom="10dp" />

        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textAppearance="?android:attr/textAppearanceMedium"
           android:text="Medium Text"
           android:id="@+id/focus_depth"
           android:layout_above="@+id/focus_distance"
           android:layout_alignParentLeft="true"
           android:layout_alignParentStart="false"
           android:layout_marginBottom="10dp" />

    </RelativeLayout>

Sostituendo TextView con
Codice (XML): [Seleziona]
        <ImageView
           android:layout_width="100dp"
           android:layout_height="100dp"
           android:layout_centerVertical="true"
           android:layout_centerHorizontal="true"
           android:src="@drawable/ic_square"
           android:id="@+id/square" />

Dovresti avere il quadrato. Devi solo crearti l'immagine ic_square.9.png

Non credo ti serva il codice, visto che la preview della camera già ti funzionava, giusto?

Ciao.

Ok ce l'ho fatta, bisogna usare l'attributo alpha con i giusti valori come suggeritomi da iceweasel.
Sovrapponi le varie view e poi regoli la trasparenza.
« Ultima modifica: 03 Giugno 2014, 15:41:31 CEST da Fullydroid, Reason: Merged DoublePost »

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Disegnare su SurfaceView
« Risposta #7 il: 03 Giugno 2014, 16:51:43 CEST »
0
Uhm... mi spieghi dove hai dovuto mettere l'alpha?
Se la png ha le trasparenze e l'ImageView è posta dopo la SurfaceView (e quindi sta davanti), non dovresti avere la necessità di impostare alcun alpha...

Fammi capire per favore perché non mi torna qualcosa...