Jadi saya menggambar segitiga ini di peta android menggunakan kode di bawah ini dalam metode menggambar saya:
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);
PointX_returned adalah koordinat yang saya dapatkan dari ladang. Mereka pada dasarnya adalah lintang dan bujur. Hasilnya adalah segitiga yang bagus tetapi bagian dalamnya kosong dan oleh karena itu saya dapat melihat peta. Apakah ada cara untuk mengisinya?
Jawaban:
Anda mungkin perlu melakukan sesuatu seperti:
Paint red = new Paint(); red.setColor(android.graphics.Color.RED); red.setStyle(Paint.Style.FILL);
Dan gunakan warna ini untuk jalur Anda, bukan ARGB Anda. Pastikan titik terakhir dari jalur Anda berakhir pada yang pertama, itu juga masuk akal.
Beri tahu saya jika berhasil!
sumber
Ok saya sudah melakukannya. Saya membagikan kode ini jika ada orang lain yang membutuhkannya:
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;
Terima kasih atas petunjuknya, Nicolas!
sumber
lineTo()
.close()
melakukannya secara otomatis.path
ke variabel instan, ingatlah untuk memanggilpath.reset()
setelahnyacanvas.drawPath()
.Anda juga bisa menggunakan 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());
sumber
fungsi ini menunjukkan cara membuat segitiga dari bitmap. Artinya, buat gambar yang dipotong berbentuk segitiga. Coba kode di bawah ini atau unduh contoh demo
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; }
Fungsi di atas mengembalikan gambar segitiga yang digambar di atas kanvas. Baca lebih banyak
sumber
Menggunakan jawaban @ Pavel sebagai panduan, berikut adalah metode pembantu jika Anda tidak memiliki poin tetapi memiliki awal x, y, serta tinggi dan lebar. Juga dapat menggambar terbalik / terbalik - yang berguna bagi saya karena digunakan sebagai ujung diagram batang vertikal.
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); }
sumber
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); }
sumber
Anda perlu menghapus path.moveTo setelah inisial pertama.
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();
sumber
Jangan
moveTo()
setelah masing-masinglineTo()
Dengan kata lain, hapus semua
moveTo()
kecuali yang pertama.Serius, jika saya hanya menyalin-tempel kode OP dan menghapus
moveTo()
panggilan yang tidak perlu , itu berhasil.Tidak ada lagi yang perlu dilakukan.
EDIT: Saya tahu OP sudah memposting "solusi kerja terakhir", tetapi dia tidak menyatakan mengapa itu berhasil. Alasan sebenarnya cukup mengejutkan saya, jadi saya merasa perlu menambahkan jawaban.
sumber