Comment dessiner une tête de flèche (dans Android)?

Je suis assez nouveau pour Android et j'ai essayé avec Canvas. Je tente de dessiner une flèche, mais je n'ai que la chance de dessiner l'arbre, aucune des flèches ne fonctionne.

J'ai recherché un peu et trouvé un exemple Java, mais Android n'a pas de AffineTransform ou AffineTransform .

  • Ce qui déclenche la mesure d'une vue () à appeler
  • Performances de lecture de fichiers sur les smartphones: stockage interne contre carte SD vs. disque dur PC
  • Impossible de trouver la propriété 'processManifest' sur com.android.build.gradle.internal.api.ApplicationVariantImpl
  • Impossible de résoudre: Erreur: (23, 17) junit: junit: 4.12 dans android studio 1.4
  • Ubuntu PPA pour Android SDK / NDK?
  • Comment démarrer une intention d'un OnClickListener
  • En ce moment, mon code ressemble à ce qui suit (la pointe de la flèche ne ressemble à une tête de flèche):

     public class DrawableView extends View { Context mContext; private int centerX; private int centerY; private int radius; private double arrLength; private double arrHeading; private int margin = 10; public DrawableView(Context context) { super(context); mContext = context; } @Override protected void onDraw(Canvas canvas) { //Paint Background Paint background = new Paint(); background.setColor(getResources().getColor(R.color.background); canvas.drawRect(0, 0, getWidth(), getHeight(), background); //Set vars for Arrow Paint Paint paint = new Paint(); paint.setColor(getResources().getColor(R.color.arrowColor); centerX = getWidth() / 2; centerY = getHeight() / 2; arrLength = radius - 10; if(centerX < centerY) radius = centerX - margin; else radius = centerY - margin; //Draw Shaft int[] xy = findArrowPos(arrLength, arrHeading); canvas.drawLine(centerX, centerY, xy[0], xy[1], paint); //Draw ArrowHead //This is where I'm confused } private int[] findArrowPos(double length, double angle) { int[] points = new int[2]; double theta = Math.toRadians(angle); points[0] = centerX + (int) (length * Math.cos(theta)); points[1] = centerY + (int) (length * Math.sin(theta)); return points; } } 

    J'ai jeté un coup d'œil sur les fils de discussion suivants:
    * Http://www.java-forums.org/awt-swing/6241-how-u-rotate-arrow-mark-line-moves-accordingly.html
    * Comment dessiner une ligne de flèche dirigée en Java?

  • Changer l'état du commutateur sans animation
  • Lire le contenu d'une URL dans Android
  • Android spinner avec applet de soulignement
  • Est-ce que l'Android utilise NTP pour synchroniser l'heure?
  • GridView et excès d'espace
  • BlueZ vs Bluedroid bluetooth stack
  • 6 Solutions collect form web for “Comment dessiner une tête de flèche (dans Android)?”

    Que diriez-vous d'utiliser "Path myPath = new Path ();" Où vous donnerez les positions x et y pour créer un triangle à l'aide de lignes et le remplir. Vous pouvez lire à ce sujet, voici un exemple que j'ai pris de quelque part.

     // create and draw triangles // use a Path object to store the 3 line segments // use .offset to draw in many locations // note: this triangle is not centered at 0,0 paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(2); paint.setColor(Color.RED); Path path = new Path(); path.moveTo(0, -10); path.lineTo(5, 0); path.lineTo(-5, 0); path.close(); path.offset(10, 40); canvas.drawPath(path, paint); path.offset(50, 100); canvas.drawPath(path, paint); // offset is cumlative // next draw displaces 50,100 from previous path.offset(50, 100); canvas.drawPath(path, paint); 

    J'essaie ce code, ça marche parfaitement.

     enter code here switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mPath.reset(); mPath.moveTo(x, y); mX = x; mY = y; startPoint = new PointF(event.getX(), event.getY()); endPoint = new PointF(); invalidate(); break; case MotionEvent.ACTION_MOVE: float dx = Math.abs(x - mX); System.out.println("action move"); float dy = Math.abs(y - mY); if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { // currentDrawingPath.path.quadTo(mX,mY,(x + mX)/2, (y + mY)/2); } mX = x; mY = y; endPoint.x = event.getX(); endPoint.y = event.getY(); isDrawing = true; invalidate(); break; case MotionEvent.ACTION_UP: mPath.lineTo(mX, mY); float deltaX = endPoint.x-startPoint.x; float deltaY = endPoint.y-startPoint.y; float frac = (float) 0.1; float point_x_1 = startPoint.x + (float) ((1 - frac) * deltaX + frac * deltaY); float point_y_1 = startPoint.y + (float) ((1 - frac) * deltaY - frac * deltaX); float point_x_2 = endPoint.x; float point_y_2 = endPoint.y; float point_x_3 = startPoint.x + (float) ((1 - frac) * deltaX - frac * deltaY); float point_y_3 = startPoint.y + (float) ((1 - frac) * deltaY + frac * deltaX); mPath.moveTo(point_x_1, point_y_1); mPath.lineTo(point_x_2, point_y_2); mPath.lineTo(point_x_3, point_y_3); mPath.lineTo(point_x_1, point_y_1); mPath.lineTo(point_x_1, point_y_1); mCanvas.drawPath(mPath, ppaint); endPoint.x = event.getX(); endPoint.y = event.getY(); isDrawing = false; invalidate(); break; default: break; } 

    J'ai eu le même problème, j'ai besoin d'une flèche pour pointer dans une certaine direction. Après avoir joué avec des algorithmes de dessin, j'ai décidé que la méthode la plus simple est d'utiliser un bitmap et simplement d'utiliser Matrix pour le faire pivoter, par exemple

     ImageView image = (ImageView) findViewById(R.id.bitmap_image); Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.test); Matrix mat = new Matrix(); mat.postRotate(90); Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), bMap.getHeight(), mat, true); image.setImageBitmap(bMapRotate); 

    Alors votre carte bitmap peut être une flèche élégante que vous aimez.

    Si vous cherchez la solution pour dessiner des milliers de flèches sous une seconde, avec des lignes de tête à longueur fixe, essayez cette fonction (ne dessine que les têtes de flèche):

     private void fillArrow(Paint paint, Canvas canvas, float x0, float y0, float x1, float y1) { paint.setStyle(Paint.Style.STROKE); int arrowHeadLenght = 10; int arrowHeadAngle = 45; float[] linePts = new float[] {x1 - arrowHeadLenght, y1, x1, y1}; float[] linePts2 = new float[] {x1, y1, x1, y1 + arrowHeadLenght}; Matrix rotateMat = new Matrix(); //get the center of the line float centerX = x1; float centerY = y1; //set the angle double angle = Math.atan2(y1 - y0, x1 - x0) * 180 / Math.PI + arrowHeadAngle; //rotate the matrix around the center rotateMat.setRotate((float) angle, centerX, centerY); rotateMat.mapPoints(linePts); rotateMat.mapPoints(linePts2); canvas.drawLine(linePts [0], linePts [1], linePts [2], linePts [3], paint); canvas.drawLine(linePts2 [0], linePts2 [1], linePts2 [2], linePts2 [3], paint); } 

    Basé sur https://gamedev.stackexchange.com/questions/44456/drawing-lines-on-android-with-matrix

    Utilisez un chemin d' accès comme ci-dessous et réglez les coordonnées en conséquence:

     // Construct a wedge-shaped path Path mPath = new Path(); mPath.moveTo(0, -50); mPath.lineTo(-20, 60); mPath.lineTo(0, 50); mPath.lineTo(20, 60); mPath.close(); 

    Mon code Arrow Drawing, peut-être peut-être utile pour quelqu'un:

      /** * Draw an arrow * change internal radius and angle to change appearance * - angle : angle in degrees of the arrows legs * - radius : length of the arrows legs * @author Steven Roelants 2017 * * @param paint * @param canvas * @param from_x * @param from_y * @param to_x * @param to_y */ private void drawArrow(Paint paint, Canvas canvas, float from_x, float from_y, float to_x, float to_y) { float angle,anglerad, radius, lineangle; //values to change for other appearance *CHANGE THESE FOR OTHER SIZE ARROWHEADS* radius=10; angle=15; //some angle calculations anglerad= (float) (PI*angle/180.0f); lineangle= (float) (atan2(to_y-from_y,to_x-from_x)); //tha line canvas.drawLine(from_x,from_y,to_x,to_y,paint); //tha triangle Path path = new Path(); path.setFillType(Path.FillType.EVEN_ODD); path.moveTo(to_x, to_y); path.lineTo((float)(to_x-radius*cos(lineangle - (anglerad / 2.0))), (float)(to_y-radius*sin(lineangle - (anglerad / 2.0)))); path.lineTo((float)(to_x-radius*cos(lineangle + (anglerad / 2.0))), (float)(to_y-radius*sin(lineangle + (anglerad / 2.0)))); path.close(); canvas.drawPath(path, paint); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.