2013-01-08 13 views
6

Ehi, voglio disegnare una linea con motivi diversi usando la tela.Come disegnare linee in diversi modelli usando la tela?

Qualsiasi idea o suggerimento sono apprezzati .. !!!!

Grazie in anticipo.

+0

cosa intendi per motivo qui? –

+0

Puoi pubblicare il link dell'applicazione che fa lo stesso? Giusto per capire cosa intendi per modello di rete? –

+0

Sì signore, ora lo faccio. –

risposta

3

bisogna usare Path .Docs dire:

classe

Il percorso incapsula composto (contorno multipli) geometrici percorsi costituite da segmenti retti di linea, curve quadratiche e curve cubiche. ...

Ad esempio, è possibile estendere un view e aggiungere posizioni evento di tocco ad un path in onTouchEvent(MotionEvent event) metodo della vostra view.Then è necessario generare posizioni casuali corrispondono alla più recente evento di tocco e aggiungere il loro alle altre istanze di path.Finally in onDraw() metodo per la visualizzazione, disegnare tutti paths.I spero che questo aiuto frammento a capire la mia idea:

public class NetCanvas extends View { 

    private static final double MAX_DIFF = 15; 
    Path path0 = new Path(); 
    Path path = new Path(); 
    private Paint p0; 
    private Paint p; 

    public NetCanvas(Context context) { 
     super(context); 
     p0 = new Paint(); 
     p0.setShader(new LinearGradient(0, 0, 230, getHeight(), Color.GREEN, 
       Color.RED, Shader.TileMode.CLAMP)); 
     p0.setStyle(Style.STROKE); 

     p = new Paint(); 
     p.setShader(new LinearGradient(0, 0, 230, getHeight(), Color.BLUE, 
       Color.MAGENTA, Shader.TileMode.CLAMP)); 
     p.setStyle(Style.STROKE); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     float x0 = event.getX(); 
     float y0 = event.getY(); 
     float x = generateFloat(event.getX()); 
     float y = generateFloat(event.getY()); 

     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      path0.moveTo(x0, y0); 
      path0.lineTo(x0, y0); 

      path.moveTo(x, y); 
      path.lineTo(x, y); 
     } else if (event.getAction() == MotionEvent.ACTION_MOVE) { 
      path0.lineTo(x0, y0); 

      path.lineTo(x, y); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      path0.lineTo(x0, y0); 

      path.lineTo(x, y); 
     } 
     invalidate(); 
     return true; 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     canvas.drawPath(path0, p0); 
     canvas.drawPath(path, p); 
    } 

    private float generateFloat(Float f){ 
     double d = (Math.signum(2*Math.random() - 1)) * Math.random() * MAX_DIFF; 
     return (float) (f + d); 
    } 
} 

nel codice di cui sopra, ho usato due path s, ma è possibile utilizzare tre o altro .Anche il risultato, dipende dal vostro tasso dito sull'esempio screen.For:
enter image description here

o può aspetto:

enter image description here

Edit:

Sopra classe (NetCanvas) estende View, quindi è possibile creare un'istanza di esso e utilizzare tale istanza, come le altre viste. Ad esempio, è possibile semplicemente impostare un'istanza o f come ContentView del vostro Activity.Here sovrascrivo onCreate() modalità di attività:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new NetCanvas(this)); 
    } 

Sebbene sia possibile modificare NetCanvas di estendere SurfaceView con alcune altre modifiche.

+0

@mpp Vedi le mie modifiche. – hasanghaforian

+0

@mpp Ho aggiunto un'altra risposta, per favore guardatelo. Spero che vi aiuti. – hasanghaforian

1

ho cambiato NetCanvas disegnare uno sguardo forma seconda immagine nella sua domanda come:

public class NetCanvas1 extends View { 

    Path path0 = new Path(); 
    private Paint p0; 
    private int points_Num = 20; 
    private int first_Points_Num = 5; 

    public NetCanvas1(Context context) { 
     super(context); 
     p0 = new Paint(); 
     p0.setShader(new LinearGradient(0, 0, 230, getHeight(), Color.GREEN, 
       Color.RED, Shader.TileMode.CLAMP)); 
     p0.setStyle(Style.STROKE); 

    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     float x0 = event.getX(); 
     float y0 = event.getY(); 

     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      path0.moveTo(x0, y0); 
      path0.lineTo(x0, y0); 

     } else if (event.getAction() == MotionEvent.ACTION_MOVE) { 
      path0.lineTo(x0, y0); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      path0.lineTo(x0, y0); 
      invalidate(); 
     } 
     return true; 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     canvas.drawPath(path0, p0); 
     FlaotPoint[] pointArray = getPoints(); 
     try { 
      for (int i = 0; i < first_Points_Num; i++) { 
       for (int j = i; j < pointArray.length; j++) { 
        canvas.drawLine(pointArray[i].getX(), pointArray[i].getY(), 
          pointArray[j].getX(), pointArray[j].getY(), p0); 
       } 
      } 
      path0.reset(); 
     } catch (Exception e) { 
     } 
    } 

    private FlaotPoint[] getPoints() { 
     FlaotPoint[] pointArray = new FlaotPoint[points_Num]; 
     PathMeasure pm = new PathMeasure(path0, false); 
     float length = pm.getLength(); 
     float distance = 0f; 
     float speed = length/points_Num; 
     int counter = 0; 
     float[] aCoordinates = new float[2]; 

     while ((distance < length) && (counter < points_Num)) { 
      // get point from the path 
      pm.getPosTan(distance, aCoordinates, null); 
      pointArray[counter] = new FlaotPoint(aCoordinates[0], 
        aCoordinates[1]); 
      counter++; 
      distance = distance + speed; 
     } 

     return pointArray; 
    } 

    class FlaotPoint { 
     float x, y; 

     public FlaotPoint(float x, float y) { 
      this.x = x; 
      this.y = y; 
     } 

     public float getX() { 
      return x; 
     } 

     public float getY() { 
      return y; 
     } 
    } 
} 

risultato dipende valori di points_Num, first_Points_Num e l'ordine dei punti che sono collegati con linee in cicli for:

for (int i = 0; i < first_Points_Num; i++) { 
       for (int j = i; j < pointArray.length; j++) { 
        canvas.drawLine(pointArray[i].getX(), pointArray[i].getY(), 
          pointArray[j].getX(), pointArray[j].getY(), p0); 
       } 
      } 

È possibile modificare il valore di ciascuna variabile o l'ordine dei punti per modificare il risultato.Risultato può essere sguardi come questi:

enter image description hereenter image description here

La mia idea è semplice: ottiene punti da percorso e collegarli con le linee .Se si desidera visualizzare maggiori dettagli in circa ottenere punti dal percorso, quello è fatto nel metodo getPoints(), potete vedere this answer ed i suoi riferimenti. Io la speranza questo vi aiuta.

+1

Esempio molto bello ma non funziona correttamente. – voidRy

+0

Hey mi puoi suggerire come posso usare questo stesso codice estendendo SurfaceView? Grazie. – voidRy

+0

@voidRy puoi vedere [questo tutorial] (http://www.mindfiresolutions.com/Using-Surface-View-for-Android-1659.php#top). – hasanghaforian

Problemi correlati