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.
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.
bisogna usare Path
.Docs dire:
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:
o può aspetto:
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.
@mpp Vedi le mie modifiche. – hasanghaforian
@mpp Ho aggiunto un'altra risposta, per favore guardatelo. Spero che vi aiuti. – hasanghaforian
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:
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.
Esempio molto bello ma non funziona correttamente. – voidRy
Hey mi puoi suggerire come posso usare questo stesso codice estendendo SurfaceView? Grazie. – voidRy
@voidRy puoi vedere [questo tutorial] (http://www.mindfiresolutions.com/Using-Surface-View-for-Android-1659.php#top). – hasanghaforian
cosa intendi per motivo qui? –
Puoi pubblicare il link dell'applicazione che fa lo stesso? Giusto per capire cosa intendi per modello di rete? –
Sì signore, ora lo faccio. –