android 背景画三角形,如何在Android canvas中绘制实心三角形?

博客分享了在Android背景绘制三角形的代码。包含使用Paint和Path绘制三角形,通过canvas.drawPath实现;还介绍了用canvas.drawVertices绘制,以及从位图创建三角形图像的方法。此外,给出了根据起始坐标、宽高绘制三角形和箭头的代码,并指出绘制时移除多余moveTo()的要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Ok I've done it. I'm sharing this code in case someone else will need it:

super.draw(canvas, mapView, true);

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

paint.setStrokeWidth(2);

paint.setColor(android.graphics.Color.RED);

paint.setStyle(Paint.Style.FILL_AND_STROKE);

paint.setAntiAlias(true);

Point point1_draw = new Point();

Point point2_draw = new Point();

Point point3_draw = new Point();

mapView.getProjection().toPixels(point1, point1_draw);

mapView.getProjection().toPixels(point2, point2_draw);

mapView.getProjection().toPixels(point3, point3_draw);

Path path = new Path();

path.setFillType(Path.FillType.EVEN_ODD);

path.moveTo(point1_draw.x,point1_draw.y);

path.lineTo(point2_draw.x,point2_draw.y);

path.lineTo(point3_draw.x,point3_draw.y);

path.lineTo(point1_draw.x,point1_draw.y);

path.close();

canvas.drawPath(path, paint);

//canvas.drawLine(point1_draw.x,point1_draw.y,point2_draw.x,point2_draw.y, paint);

return true;

Thanks for the hint Nicolas!

You probably need to do something like :

Paint red = new Paint();

red.setColor(android.graphics.Color.RED);

red.setStyle(Paint.Style.FILL);

And use this color for your path, instead of your ARGB. Make sure the last point of your path ends on the first one, it makes sense also.

Tell me if it works please !

you can also use vertice :

private static final int verticesColors[] = {

Color.LTGRAY, Color.LTGRAY, Color.LTGRAY, 0xFF000000, 0xFF000000, 0xFF000000

};

float verts[] = {

point1.x, point1.y, point2.x, point2.y, point3.x, point3.y

};

canvas.drawVertices(Canvas.VertexMode.TRIANGLES, verts.length, verts, 0, null, 0, verticesColors, 0, null, 0, 0, new Paint());

065cb706118ca1a832419b91fe165e09.png

this function shows how to create a triangle from bitmap. That is, create triangular shaped cropped image. Try the code below or download demo example

public static Bitmap getTriangleBitmap(Bitmap bitmap, int radius) {

Bitmap finalBitmap;

if (bitmap.getWidth() != radius || bitmap.getHeight() != radius)

finalBitmap = Bitmap.createScaledBitmap(bitmap, radius, radius,

false);

else

finalBitmap = bitmap;

Bitmap output = Bitmap.createBitmap(finalBitmap.getWidth(),

finalBitmap.getHeight(), Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(output);

Paint paint = new Paint();

final Rect rect = new Rect(0, 0, finalBitmap.getWidth(),

finalBitmap.getHeight());

Point point1_draw = new Point(75, 0);

Point point2_draw = new Point(0, 180);

Point point3_draw = new Point(180, 180);

Path path = new Path();

path.moveTo(point1_draw.x, point1_draw.y);

path.lineTo(point2_draw.x, point2_draw.y);

path.lineTo(point3_draw.x, point3_draw.y);

path.lineTo(point1_draw.x, point1_draw.y);

path.close();

canvas.drawARGB(0, 0, 0, 0);

paint.setColor(Color.parseColor("#BAB399"));

canvas.drawPath(path, paint);

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

canvas.drawBitmap(finalBitmap, rect, rect, paint);

return output;

}

The function above returns an triangular image drawn on canvas. Read more

Using @Pavel's answer as guide, here's a helper method if you don't have the points but have start x,y and height and width. Also can draw inverted/upside down - which is useful for me as it was used as end of vertical barchart.

private void drawTriangle(int x, int y, int width, int height, boolean inverted, Paint paint, Canvas canvas){

Point p1 = new Point(x,y);

int pointX = x + width/2;

int pointY = inverted? y + height : y - height;

Point p2 = new Point(pointX,pointY);

Point p3 = new Point(x+width,y);

Path path = new Path();

path.setFillType(Path.FillType.EVEN_ODD);

path.moveTo(p1.x,p1.y);

path.lineTo(p2.x,p2.y);

path.lineTo(p3.x,p3.y);

path.close();

canvas.drawPath(path, paint);

}

private void drawArrows(Point[] point, Canvas canvas, Paint paint) {

float [] points = new float[8];

points[0] = point[0].x;

points[1] = point[0].y;

points[2] = point[1].x;

points[3] = point[1].y;

points[4] = point[2].x;

points[5] = point[2].y;

points[6] = point[0].x;

points[7] = point[0].y;

canvas.drawVertices(VertexMode.TRIANGLES, 8, points, 0, null, 0, null, 0, null, 0, 0, paint);

Path path = new Path();

path.moveTo(point[0].x , point[0].y);

path.lineTo(point[1].x,point[1].y);

path.lineTo(point[2].x,point[2].y);

canvas.drawPath(path,paint);

}

You need remove path.moveTo after first initial.

Path path = new Path();

path.moveTo(point1_returned.x, point1_returned.y);

path.lineTo(point2_returned.x, point2_returned.y);

path.lineTo(point3_returned.x, point3_returned.y);

path.lineTo(point1_returned.x, point1_returned.y);

path.close();

Don't moveTo() after each lineTo()

In other words, remove every moveTo() except the first one.

Seriously, if I just copy-paste OP's code and remove the unnecessary moveTo() calls, it works.

Nothing else needs to be done.

EDIT: I know the OP already posted his "final working solution", but he didn't state why it works. The actual reason was quite surprising to me, so I felt the need to add an answer.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值