Come disegnare una linea curva in android?

Io sono nuovo di android e sto sviluppando un progetto di esempio sul disegno di linee. Voglio disegnare una curva o elevati di linea che collega due punti(x1,y1 e x2,y2). Ho cercato di tela.drawArc() il metodo, ma il RectF valori all’interno del drawArc metodo è solo l’x,y centro punti del cerchio. Mi sta dando un arco tra i miei due punti. Ma io voglio una linea curva esattamente il collegamento di due punti. Qualcuno può aiutarmi? Grazie in anticipo.

ecco un semplice esempio per il disegno utilizzando tela coderzheaven.com/2013/01/10/draw-arcs-android-canvas

OriginaleL’autore Surendar | 2014-12-30

2 Replies
  1. 7

    Dichiarare questo metodo interno metodo onDraw:

    private void drawOvalAndArrow(Canvas canvas){
    
    
        Paint circlePaint = new Paint();
        circlePaint.setStyle(Paint.Style.FILL_AND_STROKE);
        circlePaint.setAntiAlias(true);
        circlePaint.setStrokeWidth(2);
        circlePaint.setColor(Color.CYAN);
    
        float centerWidth = canvas.getWidth()/2; //get center x of display
        float centerHeight = canvas.getHeight()/2; //get center y of display
        float circleRadius = 20; //set radius 
        float circleDistance = 200; //set distance between both circles
    
        //draw circles
        canvas.drawCircle(centerWidth, centerHeight, circleRadius, circlePaint);
        canvas.drawCircle(centerWidth+circleDistance, centerHeight, circleRadius, circlePaint);
    
    
        //to draw an arrow, just lines needed, so style is only STROKE
        circlePaint.setStyle(Paint.Style.STROKE);       
        circlePaint.setColor(Color.RED);
    
        //create a path to draw on
        Path arrowPath = new Path();
    
        //create an invisible oval. the oval is for "behind the scenes" ,to set the path´
        //area. Imagine this is an egg behind your circles. the circles are in the middle of this egg
        final RectF arrowOval = new RectF();
        arrowOval.set(centerWidth, 
                centerHeight-80, 
                centerWidth + circleDistance, 
                centerHeight+80);
    
        //add the oval to path
        arrowPath.addArc(arrowOval,-180,180);
    
        //draw path on canvas
        canvas.drawPath(arrowPath, circlePaint);
    
    
        //draw arrowhead on path start
         arrowPath.moveTo(centerWidth,centerHeight ); //move to the center of first circle
         arrowPath.lineTo(centerWidth-circleRadius, centerHeight-circleRadius);//draw the first arrowhead line to the left
         arrowPath.moveTo(centerWidth,centerHeight );//move back to the center
         arrowPath.lineTo(centerWidth+circleRadius, centerHeight-circleRadius);//draw the next arrowhead line to the right
    
         //same as above on path end
         arrowPath.moveTo(centerWidth+circleDistance,centerHeight );
         arrowPath.lineTo((centerWidth+circleDistance)-circleRadius, centerHeight-circleRadius);
         arrowPath.moveTo(centerWidth+circleDistance,centerHeight );
         arrowPath.lineTo((centerWidth+circleDistance)+circleRadius, centerHeight-circleRadius);
    
         //draw the path
         canvas.drawPath(arrowPath,circlePaint);
    
    }

    Anche questo sarà trovare i due lati dello schermo (modalità Paesaggio) e disegnare una curva perfetta sullo schermo

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    
        PointF mPoint1 = new PointF(w/1.2F, h/1.2F);
        PointF mPoint2 = new PointF(w/24, h/1.2F);
        Path myPath1 = new Path();
        Paint paint  = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Style.STROKE);
        paint.setStrokeWidth(2);
        paint.setColor(Color.WHITE);
    
        myPath1 = drawCurve(canvas, paint, mPoint1, mPoint2);
        canvas.drawPath(myPath1, paint);
    
    }
    
    private Path drawCurve(Canvas canvas, Paint paint, PointF mPointa, PointF mPointb) {
    
        Path myPath = new Path();
        myPath.moveTo(63*w/64, h/10);
        myPath.quadTo(mPointa.x, mPointa.y, mPointb.x, mPointb.y);
        return myPath;  
    }

    Riferimenti utili sulla pittura di android:

    Come disegnare Archi in Android utilizzando tela?

    Pittura di base con Vista

    Ya. Grazie amico. Ma io ho già visto in un tutorial. Ho controllato e cambiato alcuni parametri. Ha funzionato
    puoi dare il link del tutorial??

    OriginaleL’autore BzH

  2. 5

    Potrebbe non essere quello che vuoi tu, ma dare un’occhiata a http://developer.android.com/reference/android/graphics/Path.html e più precisamente in moveTo, lineTo, quadTo e cubicTo. (Gli ultimi 2 metodi di disegnare le curve di bezier, quadratica o cubica. Se u non sanno cosa sono queste cose, dare un’occhiata a http://en.wikipedia.org/wiki/B%C3%A9zier_curve Hai solo bisogno di capire i parametri della funzione, non la matematica dietro di esso). Per il vostro scopo, si può fare come questo:

    Path mPath;
    Paint paint;
    mPath = new Path();
    mPath.moveTo(x1, y1);
    mPath.cubicTo(anchor1_x, anchor1_y, anchor2_x, anchor2_y, x2, y2); /*the anchors you want, the curve will tend to reach these anchor points; look at the wikipedia article to understand more */
    paint = new Paint();
    paint.setColor(0xFFFFFFFF);
    paint.setAntiAlias(true);
    paint.setStrokeCap(Paint.Cap.ROUND);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(width); //the width you want 
    canvas.drawPath(mPath, paint);

    OriginaleL’autore caution2toxic

Lascia un commento