Autore Topic: Realizzare un grafo  (Letto 1693 volte)

Offline raimondo

  • Utente junior
  • **
  • Post: 130
  • Respect: 0
    • Mostra profilo
Realizzare un grafo
« il: 02 Febbraio 2012, 14:30:34 CET »
0
salve ragazzi avrei la necessita di realizzare un grafo orientato come in figura(non così complesso  :-)) con Android ma non ho la più pallida idea di come fare....questo grafo non è sempre lo stesso ma dipende da i dati che ho in un db e devo avere la possibilità i cliccare su un node della rete e compiere azioni...tipo aprire una particore applicazione oppure fare un foto....qualcuno saprebbe dermi una mano? come si disegnano nodi linee frecce e roba così?
grazie mille in anticipo!!! :D

Offline raimondo

  • Utente junior
  • **
  • Post: 130
  • Respect: 0
    • Mostra profilo
Re:Realizzare un grafo
« Risposta #1 il: 03 Febbraio 2012, 08:03:17 CET »
0
sono riuscito ad andare avanti ho iniziato a realizzare un grafo con 3 punti e 2 linee(immagine allegata), leggendo un tutorial trovato nel forum.....qualcuno saprebbe consigliarmi delle guide per canvas(in italiano se possibile)?
cmq avrei delle domande da fare:
1) è possibile disegnare frecce?
2) è possibile creare collegamenti(frecce in questo caso) automatici tra 2 cerchi in automatico e senza perdere tempo a dover inser le cordinate assolute?
3) posso aggiungere una didascalia ad un oggetto canvas?
4) ad ogni elemento canvas si puo associare un azione per un evento(tipo click)?
5) se dovessi realizzare un grafico che è più grande delle dimensioni dello scermo cosa succede?
Posto un po' di codice:
Codice (Java): [Seleziona]
package ch.egsolutions.canvasdrawing;

import java.util.Random;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class CustomView extends View {

        Bitmap mBmp;
        Random mRnd;
        Paint mPaint;
        Paint mPaint1 = new Paint();
        Paint mPaint2 = new Paint();
       
        int w,h,bw,bh;
        int px=-1,py=-1;
        public CustomView(Context context, AttributeSet attrs) {
                super(context, attrs);
               
                mBmp=BitmapFactory.decodeResource(context.getResources(), R.drawable.icon);      //carichiamo l'immagine in una bitmap
                bw=mBmp.getWidth(); //larghezza bitmap
                bh=mBmp.getHeight();//altezza  
                mPaint=new Paint(); // pennello
                mPaint.setColor(Color.CYAN);     
                mPaint.setAntiAlias(true);
                 // pennello
                mPaint1.setColor(Color.BLUE);    
                mPaint1.setAntiAlias(true);
                mPaint2.setColor(Color.RED);     
                mPaint2.setAntiAlias(true);
               
                mRnd=new Random();
               
        }
       
       
        @Override
        protected void onDraw(Canvas canvas) {
                // TODO Auto-generated method stub
                super.onDraw(canvas);

                               
               
                canvas.drawCircle(200, 500, 30, mPaint); //disegnamo un cerchio con centro al centro della bitmap
       
                canvas.drawCircle(100, 50, 20, mPaint1);
       
                canvas.drawLine(200,500-30, 100, 50+20, mPaint2);
       
                canvas.drawCircle(150, 90, 20, mPaint1);
               
                canvas.drawLine(200,500-30, 150, 90+20, mPaint2);
        }
       
       
        public void updatePosition(){          
                //posizione random x,y della bitmap all interno della view
                px=mRnd.nextInt(w-bw);
                py=mRnd.nextInt(h-bh);
                invalidate();
        }
       
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                //registriamo le dimensioni della view
                w=MeasureSpec.getSize(widthMeasureSpec);
                h=MeasureSpec.getSize(heightMeasureSpec);
                setMeasuredDimension(w,h);
        }
       

}
grazie mille a tutti

Offline Giovanni D'Addabbo

  • Utente normale
  • ***
  • Post: 163
  • Respect: +8
    • Google+
    • giovannid
    • giovanni.daddabbo
    • magoscuro
    • Mostra profilo
    • Rhubbit.it - Sviluppo app Android/iOs
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Rhubbit srl
  • Sistema operativo:
    Windows/Mac/Linux
Re:Realizzare un grafo
« Risposta #2 il: 03 Febbraio 2012, 10:23:45 CET »
0
ciao non so se hai provato a cercare su santo google ma...hai già dato un occhio qui?

Manageability - Open Source Graph or Network Visualization Written in Java

altrimenti potresti prendere in considerazione l'idea di usare jquery ;)

byeeeeee

Offline raimondo

  • Utente junior
  • **
  • Post: 130
  • Respect: 0
    • Mostra profilo
Re:Realizzare un grafo
« Risposta #3 il: 03 Febbraio 2012, 10:26:32 CET »
0
grazie...però levami un a curiosità sono librerie....come le implemento in android?

Offline Giovanni D'Addabbo

  • Utente normale
  • ***
  • Post: 163
  • Respect: +8
    • Google+
    • giovannid
    • giovanni.daddabbo
    • magoscuro
    • Mostra profilo
    • Rhubbit.it - Sviluppo app Android/iOs
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Rhubbit srl
  • Sistema operativo:
    Windows/Mac/Linux
Re:Realizzare un grafo
« Risposta #4 il: 03 Febbraio 2012, 10:34:41 CET »
0
dunque android lo programmi in java, fino ad ora ho importato altre librerie java senza problemi, anche se non ho idea di come si possa comportare una libreria che fa uso di grafica o altro.
Alla peggio usa una webview e usa jquery...oppure se vuoi qualcosa di più complesso forse ti conviene vedere un motore grafico vero e proprio tipo
         AndEngine - Free Android 2D OpenGL Game Engine
      


Offline raimondo

  • Utente junior
  • **
  • Post: 130
  • Respect: 0
    • Mostra profilo
Re:Realizzare un grafo
« Risposta #5 il: 03 Febbraio 2012, 10:38:00 CET »
0
per il mometno non credo che mi serva qualcosa di complesso...finora come hai caricato le librerie  java in android?

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Realizzare un grafo
« Risposta #6 il: 03 Febbraio 2012, 11:17:55 CET »
+1
sono riuscito ad andare avanti ho iniziato a realizzare un grafo con 3 punti e 2 linee(immagine allegata), leggendo un tutorial trovato nel forum.....qualcuno saprebbe consigliarmi delle guide per canvas(in italiano se possibile)?

Non credo ce ne siano di complete, però, tenendo conto di quello che sei riuscito a fare, secondo me non dovresti avere problemi ad usare il resto dei metodi della classe Canvas.

Citazione
1) è possibile disegnare frecce?
2) è possibile creare collegamenti(frecce in questo caso) automatici tra 2 cerchi in automatico e senza perdere tempo a dover inser le cordinate assolute?
3) posso aggiungere una didascalia ad un oggetto canvas?
4) ad ogni elemento canvas si puo associare un azione per un evento(tipo click)?

Premesso che non so e non credo ci siano librerie già pronte per fare quello che vuoi fare, e quindi dovendo "implementare" tutto a mano, potresti dividere le varie entità da disegnare in classi separate. Per esempio la classe freccia avrà un cerchio di inizio, un cerchio di fine e un verso, la classe cerchio avrà un testo e un raggio che dipenderà dal testo che conterrà, una posizione e un metodo per controllare se un touch event avviene all'intero o all'esterno di essa, ecc...  Per disegnare la punta della freccia potresti usare la classe Path, mentre per scrivere il testo all'interno di un cerchio potresti usare le classi StaticLayout o DynamicLayout. Infine, tutte le entità da disegnare potrebbero implementare un metodo draw(Canvas canvas) in cui si disegnano da sé.

Citazione
5) se dovessi realizzare un grafico che è più grande delle dimensioni dello scermo cosa succede?
Dovresti decidere tu come si debba comportare. Una tecnica potrebbe essere salvare il grafico per intero in una bitmap e implementare una logica tipo scrollview in cui disegni una parte del grafico in base agli eventi touch dell'utente.

Offline raimondo

  • Utente junior
  • **
  • Post: 130
  • Respect: 0
    • Mostra profilo
Re:Realizzare un grafo
« Risposta #7 il: 03 Febbraio 2012, 22:41:23 CET »
0
per il testo all'interno non va bene dovebbre comparire affianco o ke comapare se toccato col dito....come posso applicare ad un ogetto canvas un elemento onItemClick?

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Realizzare un grafo
« Risposta #8 il: 03 Febbraio 2012, 22:47:42 CET »
0
Ma ovviamente il testo lo metti dove vuoi.
Non esiste l'evento onClick per la classe canvas, esiste solo per la view che lo contiene. Il click lo devi rilevare da te.

Offline raimondo

  • Utente junior
  • **
  • Post: 130
  • Respect: 0
    • Mostra profilo
Re:Realizzare un grafo
« Risposta #9 il: 04 Febbraio 2012, 08:11:18 CET »
0
e come potrei fare? c'è un modo

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Realizzare un grafo
« Risposta #10 il: 04 Febbraio 2012, 09:47:47 CET »
+1
Personalizzi il metodo onTouchEvent() della view e controlli l'intervallo di tempo tra un action_down e un action_up. Se è minore di un tot, hai un click. Per sapere se è stato cliccato un cerchio,  controlli, per ogni cerchio, se la distanza tra il centro e le coordinate dell'evento sia minore del raggio.

Offline raimondo

  • Utente junior
  • **
  • Post: 130
  • Respect: 0
    • Mostra profilo
Re:Realizzare un grafo
« Risposta #11 il: 04 Febbraio 2012, 10:56:00 CET »
0
proverò e ti farò sapere :D grazie ancora...altrimenti librerie grafiche che mi consiglieresti?

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Realizzare un grafo
« Risposta #12 il: 04 Febbraio 2012, 11:24:01 CET »
0
Non saprei. L'ideale sarebbe trovare un qualcosa di già pronto che disegni il tipo di grafico che vuoi e che possa essere adattato alle tue esigenze, però non ne conosco e non so se ce ne siano. OpenGl ed engine vari li scarterei perché sovradimensionati a ciò che ti serve e più complicati del Canvas da gestire (per esempio già scrivere del testo in openGL diventa una rottura).
Credo che il continuare con la custom view sia la cosa più veloce ed efficiente. Ma magari qualcuno ha qualche altra idea.