How do I draw an arrowhead (in Android)?
How about using "Path myPath = new Path();" where you would give the x and y positions to create a triangle using lines and filling it. You can read about it, here is an example I took from somewhere.
// 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,0paint.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 previouspath.offset(50, 100);canvas.drawPath(path, paint);
My Arrow Drawing code, maybe it can be of some use for somebody:
/** * 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);}
I try this code it has been working perfectly:
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;}