Pertanyaan Cara menggambar segitiga terisi di kanvas android?


Jadi saya menggambar segitiga ini di peta android menggunakan kode di bawah ini dalam metode gambar 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);

TitikX_kembali adalah koordinat yang saya dapatkan dari ladang. Mereka pada dasarnya adalah garis lintang dan garis bujur. Hasilnya adalah segitiga yang bagus tetapi orang dalam kosong dan oleh karena itu saya bisa melihat peta. Apakah ada cara untuk mengisinya entah bagaimana?


75
2017-08-17 09:37


asal


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 jalur pertama, itu juga masuk akal.

Katakan padaku jika itu berhasil, tolong!


36
2017-08-17 09:50



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!


69
2017-08-17 10:58



Anda juga dapat menggunakan simpul:

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());

10
2017-08-18 07:51



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);

}

4
2018-05-08 11:06



enter image description here

fungsi ini menunjukkan cara membuat segitiga dari bitmap. Yaitu, buat gambar terpotong berbentuk segitiga. Coba kode di bawah 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 kanvas. Baca lebih banyak


4
2018-01-01 10:52



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();

3
2017-12-01 15:45



Menggunakan jawaban @ Pavel sebagai panduan, inilah metode pembantu jika Anda tidak memiliki poin tetapi mulai x, y dan tinggi dan lebar. Juga bisa menggambar terbalik / terbalik - yang berguna bagi saya karena digunakan sebagai ujung barchart 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);
    }

3
2018-03-08 17:06



Jangan moveTo() setelah masing-masing lineTo()

Dengan kata lain, hapus semua moveTo() kecuali yang pertama.

Serius, jika saya hanya menyalin-tempel kode OP dan menghapus yang tidak perlu moveTo() panggilan, ini berfungsi.

Tidak ada yang perlu dilakukan.


EDIT: Saya tahu OP sudah memposting "solusi terakhirnya", tetapi dia tidak menyatakan Mengapa berhasil. Alasan sebenarnya cukup mengejutkan saya, jadi saya merasa perlu menambahkan jawaban.


1
2017-07-14 12:29