안드로이드 캔버스에 채워진 삼각형을 그리는 방법은?
이 삼각형을 Android 맵에 그리는 방법은 다음과 같습니다.
paint.setARGB(255, 153, 29, 29);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setAntiAlias(true);
Path path = new Path();
path.moveTo(point1_returned.x, point1_returned.y);
path.lineTo(point2_returned.x, point2_returned.y);
path.moveTo(point2_returned.x, point2_returned.y);
path.lineTo(point3_returned.x, point3_returned.y);
path.moveTo(point3_returned.x, point3_returned.y);
path.lineTo(point1_returned.x, point1_returned.y);
path.close();
canvas.drawPath(path, paint);
X_returned 포인트는 필드에서 얻은 좌표입니다.기본적으로 위도와 경도입니다.결과는 멋진 삼각형이지만 내부자가 비어있어서 지도를 볼 수 있습니다.어떻게 해서든 채울 수 있는 방법이 있나요?
알았어, 다 했어.다른 사람이 필요할 경우를 대비해서 이 코드를 공유합니다.
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;
니콜라스 힌트 고마워요!
다음과 같은 작업이 필요할 수 있습니다.
Paint red = new Paint();
red.setColor(android.graphics.Color.RED);
red.setStyle(Paint.Style.FILL);
경로에는 ARGB 대신 이 색상을 사용합니다.경로의 마지막 지점이 첫 번째 지점인지 확인하십시오. 그것도 말이 됩니다.
효과가 있으면 말해 주세요!
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());
@Pavel의 답변을 참고하여 포인트는 없지만 시작 x, y, 높이와 폭이 있는 도우미 방법을 소개합니다.또한 거꾸로/위로 아래로 그릴 수 있어 수직 바르차트의 끝부분으로 사용되었기 때문에 나에게 유용합니다.
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);
}
이 함수는 비트맵에서 삼각형을 만드는 방법을 보여줍니다.즉, 삼각형 모양의 잘라낸 이미지를 만듭니다.아래 코드를 시험하거나 데모 예를 다운로드하십시오.
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;
}
위 함수는 캔버스에 그려진 삼각형 이미지를 반환합니다.자세한 것은 이쪽
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);
}
하지 마moveTo()
각각 다음에lineTo()
다시 말해, 다음 시간마다 제거합니다.moveTo()
첫 번째 것만 빼고.
OP의 코드를 복사해서 붙여넣기만 하면moveTo()
전화, 작동해
달리 할 일은 없어요.
편집: OP가 이미 그의 "최종 작업 솔루션"을 게시한 것은 알고 있지만, 그는 왜 그것이 효과가 있는지 설명하지 않았습니다.실제 이유는 매우 놀라웠기 때문에 답변을 추가할 필요성을 느꼈습니다.
첫 번째 초기화 후 path.moveTo를 제거해야 합니다.
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();
언급URL : https://stackoverflow.com/questions/3501126/how-to-draw-a-filled-triangle-in-android-canvas
'programing' 카테고리의 다른 글
휴지 상태: "필드 'id'에 기본값이 없습니다." (0) | 2023.01.20 |
---|---|
PHP 알림을 해제하려면 어떻게 해야 합니까? (0) | 2023.01.20 |
PHP shell_exec() vs exec() (0) | 2023.01.20 |
프로그램 실행 시간을 계산하는 방법은 무엇입니까? (0) | 2023.01.20 |
다음 항목 중 하나가 목록에 있는지 확인하는 방법은 무엇입니까? (0) | 2023.01.20 |