Pav*_*vel 83 java android google-maps android-canvas
所以我在我的绘图方法中使用下面的代码在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);
Run Code Online (Sandbox Code Playgroud)
pointX_returned是我从字段中获得的坐标.它们基本上是纬度和经度.结果是一个漂亮的三角形,但内部人员是空的,因此我可以看到地图.有办法以某种方式填补它吗?
Pav*_*vel 74
好的,我已经做到了.我正在分享这段代码以防其他人需要它:
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;
Run Code Online (Sandbox Code Playgroud)
感谢尼古拉斯的暗示!
Nic*_* C. 40
您可能需要执行以下操作:
Paint red = new Paint();
red.setColor(android.graphics.Color.RED);
red.setStyle(Paint.Style.FILL);
Run Code Online (Sandbox Code Playgroud)
并使用此颜色作为您的路径,而不是您的ARGB.确保路径的最后一点在第一点结束,这也是有道理的.
告诉我它是否有效!
小智 11
你也可以使用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());
Run Code Online (Sandbox Code Playgroud)
此函数显示如何从位图创建三角形.也就是说,创建三角形裁剪图像.请尝试下面的代码或下载演示示例
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;
}
Run Code Online (Sandbox Code Playgroud)
上面的函数返回在画布上绘制的三角形图像.阅读更多
使用@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);
}
Run Code Online (Sandbox Code Playgroud)
不要moveTo()在每个之后lineTo()
换句话说,删除除moveTo()第一个之外的所有内容。
说真的,如果我只是复制粘贴OP的代码并删除不必要的moveTo()调用,它就可以工作。
无需执行任何其他操作。
编辑:我知道OP已经发布了他的“最终工作解决方案”,但他没有说明为什么它有效。真正的原因让我很惊讶,所以我觉得有必要补充一下答案。
| 归档时间: |
|
| 查看次数: |
93919 次 |
| 最近记录: |