Autore Topic: Sovrapporre elementi grafici 2D  (Letto 2079 volte)

Offline FrankieFlos

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
Sovrapporre elementi grafici 2D
« il: 24 Marzo 2012, 14:55:15 CET »
0
Ciao a tutti. :) . Ho creato una mia custom View (DrawingView) facendo l'override del metodo
Codice (Java): [Seleziona]
protected void onDraw(Canvas canvas).  All'interno del metodo utilizzo l'oggeto Canvas per disegnare elementi geometrici di base (2D) quali linee e cerchi. Vorrei "sovrapporre" due elementi grafici nella stessa posizione sul display, ad esempio due linee o due cerchi, differenziandoli attraverso il colore e lo spessore della linea. Il problema è che usando i metodi della classe Canvas, come ad esempio:
Codice (Java): [Seleziona]
canvas.drawLine(left_edge, top_edge, right_edge, bottom_edge, paint); non riesco ad ottenere il risultato voluto, poiché disegnando due linee nella stessa posizione del display, quella visibile è proprio l'ultima disegnata in ordine temporale (corrispondente all'ultima invocazione del metodo sopracitato). Tutta la grafica della mia applicazione è basata sull'uso di Canvas, se riuscissi a trovare una soluzione in modo da mantenere una certa compatibilità con quanto già fatto, sarebbe una cosa molto utile. In alternativa, se ciò non fosse possibile, chiedo, gentilmente, se è possibile ottenere quanto sopra specificato in OpenGL o con altro framework grafico per Android, fornendomi qualche indicazione su come procedere. Ringrazio in anticipo per la disponibilità.
« Ultima modifica: 24 Marzo 2012, 18:29:15 CET da FrankieFlos »

Offline Alexander_br

Re:Sovrapporre elementi grafici 2D
« Risposta #1 il: 08 Aprile 2012, 10:37:36 CEST »
0
prova cosi dovrebbe funzionare

Codice (Java): [Seleziona]
protected void onDraw(Canvas canvas) {
               
                //oggetto Paint n.b. devi fare un xml color oppure puoi passarlo direttamente
                Paint myColor = new Paint();
                background.setColor(getResources().getColor(R.color.mycolor));
               
               
                //disegna rect e line verticale
                canvas.drawRect(100, 100, getWidth()/2, getHeight()/2, myColor);
                canvas.drawLine(100, 0, 100, getHeight(), myColor);
}
"l'arte sfida la tecnologia e la tecnologia ispira l'arte" cit.

https://www.facebook.com/letsmakeaps

Offline FrankieFlos

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
Re:Sovrapporre elementi grafici 2D
« Risposta #2 il: 08 Aprile 2012, 20:44:05 CEST »
0
Ok, grazie :) ... qui hai sovrapposto un rettangolo ed una linea ... vorrei cercare di sovrapporre due linee ... finora non ci sono riuscito ...

Offline Alexander_br

Re:Sovrapporre elementi grafici 2D
« Risposta #3 il: 08 Aprile 2012, 21:06:29 CEST »
0
ah ok non avevo letto bene l'ultima parte del tuo post.
Ma se vuoi sovrapporre due linee ed hanno la stessa posizione è normale che si vedrà solo l'ultima, a meno che non dai un diverso stroke e colore alle linee ;)
"l'arte sfida la tecnologia e la tecnologia ispira l'arte" cit.

https://www.facebook.com/letsmakeaps

Offline FrankieFlos

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
Re:Sovrapporre elementi grafici 2D
« Risposta #4 il: 11 Aprile 2012, 19:25:30 CEST »
0
Ho provato a variare lo spessore ed il colore di 2 linee e poi a sovrapporle, tuttavia quella visibile resta sempre l'ultima disegnata. Ho fatto vari tentativi, ma il risultato è sempre lo stesso ... Comincio a perdere le speranze ...  :-( 

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Sovrapporre elementi grafici 2D
« Risposta #5 il: 12 Aprile 2012, 09:01:31 CEST »
0
Devi usare il canale alpha, che regola appunto la trasparenza, altrimenti non funziona.
La prima linea la disegni come al solito.
Nel paint della seconda linea hai due soluzioni, o passi il colore considerando l'alpha oppure chiami la funzione (sempre del paint) setAlpha che ti permette di settare il grado di trasparenza della seconda linea. Se è 255 vedi solo la seconda linea, se è 0 vedi solo la prima. In questo modo puoi regolare a tuo piacimento la "quantità" di trasparenza.

 :-)

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Sovrapporre elementi grafici 2D
« Risposta #6 il: 20 Aprile 2012, 09:34:24 CEST »
0
Usi il canale alpha se vuoi che ci sia una trasparenza.
Se hai due linee semi sovrapposte e quella dietro è più spessa dell'altra (diciamo che "contiene" l'altra), non c'è nessun motivo per cui a te viene visualizzata solo l'ultima.
Certo, ovviamente devi disegnare quella dietro, prima.
Posti il codice della sovrapposizione delle 2 linee, così vediamo di capire il perché?
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline FrankieFlos

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
Re:Sovrapporre elementi grafici 2D
« Risposta #7 il: 24 Aprile 2012, 11:15:01 CEST »
0
Sono riuscito a risolvere. Vi ringrazio molto per i vostri consigli. :)
« Ultima modifica: 24 Aprile 2012, 11:19:07 CEST da FrankieFlos »

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 116
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Re:Sovrapporre elementi grafici 2D
« Risposta #8 il: 03 Maggio 2012, 16:57:16 CEST »
0
settare il canale alfa è solo un rimedio, non una soluzione.

Il motivo reale per la quale non riesci a vedere la prima linea ( anche se di spessore maggiore ) è questa riga:

Codice (Java): [Seleziona]
background.setColor(getResources().getColor(R.color.mycolor));
questo perchè quando disegni una view custom con i canvas la view occupa tutto lo schermo, e dato che ha dipinto tutta la tela e non solo la linea non si vedrà mai quello che c'è sotto.

prova a non dargli il colore di sfondo elimando la riga che ti ho evidenziato e setta lo sfondo da un file xml o da un ulteriore view customizzata

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Sovrapporre elementi grafici 2D
« Risposta #9 il: 03 Maggio 2012, 20:09:04 CEST »
0
MyColor e R.color.myColor non rappresentano necessariamente lo stesso colore, quindi non è detto che non si veda per quello.
Background non è detto che rappresenti il bg del canvas e comunque non si vedrebbero entrambe le linee e non soltanto una.
Se su un canvas disegni una linea, disegnerai sul canvas associato alla view quindi dentro quella view vedrai ciò che hai disegnato.
Se anche dipingesse tutta la tela, è l'ordine con cui vengono eseguite le cose che fa testo, quindi le linee (disegnate per ultime) andrebbero sopra lo sfondo.
Dall'esempio postato da Alexander, infine, i 2 oggetti hanno lo stesso colore, quindi se uno è contenuto nell'altro si vedrà solo il più grande.

Sarebbe una buona cosa capire come frankieflos ha risolto, così da capire meglio la problematica.

Saluti.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 116
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Re:Sovrapporre elementi grafici 2D
« Risposta #10 il: 03 Maggio 2012, 23:44:33 CEST »
0
condivido ciò che hai detto...il codice completo avrebbe chiarito meglio le idee, facci sapere come hai risolto

Offline FrankieFlos

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
Re:Sovrapporre elementi grafici 2D
« Risposta #11 il: 04 Maggio 2012, 17:59:35 CEST »
0
Codice (Java): [Seleziona]
protected void onDraw(Canvas canvas) {
               
                //creo il paint
                Paint paint = new Paint();
                //setto il colore per la prima linea
                paint.setColor(Color.BLUE);
                //disegno la prima linea, specificando gli "spigoli" per posizionarla:  left, top, right, bottom
                canvas.drawLine(left, top, right, bottom, paint);
               //colore 2a linea
               paint.setColor(Color.RED);
               //setto il canale alpha nel range [0, 255] al valore 128 in modo da riuscire a "vedere entrambe" le linee
               paint.setAlpha(128);
               //disegno la seconda linea, specificando gli "spigoli" per posizionarla:  left, top, right, bottom
              // gli "spigoli" sono gli stessi perchè le linee sono sovrapposte
              canvas.drawLine(left, top, right, bottom, paint);
}

La cosa sembra funzionare anche se dò uno spessore diverso alle linee tramite:
Codice (Java): [Seleziona]
paint.setStrokeWidth(int width)Per quanto riguarda il colore di sfondo della View lo setto nell'Activity ove "risiede" la View custom:
Codice (Java): [Seleziona]
       
@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   .
   .
   .
  //this è il Context della View custom, un'Activity dove utilizzo la View
 customView = new CustomView(this);
 // white background for view
  customView.setBackgroundColor(Color.WHITE);
   .
   .
   .
}

Grazie ai vostri suggerimenti mi è stato possibile risolvere. :)

« Ultima modifica: 04 Maggio 2012, 18:12:35 CEST da FrankieFlos »