سؤال

لذلك أرسم هذا المثلث في خرائط 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);

pointx_returned هي الإحداثيات التي أحصل عليها من الحقول. هم في الأساس خطوط العرض وخطوط الطول. والنتيجة هي مثلث جميل ولكن من الداخل فارغ وبالتالي يمكنني رؤية الخريطة. هل هناك طريقة لملئها بطريقة أو بأخرى؟

هل كانت مفيدة؟

المحلول

ربما تحتاج إلى القيام بشيء مثل:

Paint red = new Paint();

red.setColor(android.graphics.Color.RED);
red.setStyle(Paint.Style.FILL);

واستخدم هذا اللون لمسارك ، بدلاً من ARGB. تأكد من أن النقطة الأخيرة من مسارك تنتهي على الأول ، فمن المنطقي أيضًا.

قل لي إذا كان يعمل من فضلك!

نصائح أخرى

حسنًا ، لقد فعلت ذلك. أشارك هذا الرمز في حالة حاجة شخص آخر إلى:

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;

شكرا على تلميح نيكولاس!

يمكنك أيضًا استخدام 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());

enter image description here

توضح هذه الوظيفة كيفية إنشاء مثلث من صورة نقطية. وهذا هو ، إنشاء صورة مزخرفة ثلاثي الشكل. جرب الرمز أدناه أو قم بتنزيل مثال التجريبي

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

تُرجع الوظيفة أعلاه صورة ثلاثية مرسومة على قماش. اقرأ أكثر

باستخدام إجابة @Pavel كدليل ، إليك طريقة مساعد إذا لم يكن لديك النقاط ولكن لديك بدء X و Y و Hight and Width. يمكن أيضًا رسم/مقلوب رأسًا على عقب - وهو أمر مفيد بالنسبة لي حيث تم استخدامه كنهاية من البارشارت العمودي.

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

}

تحتاج إلى إزالة 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();

لا moveTo() بعد كل lineTo()

بمعنى آخر ، أزل كل moveTo() ما عدا الأول.

على محمل الجد ، إذا قمت فقط بنسخ رمز OP وأزلت غير ضرورية moveTo() المكالمات ، فهي تعمل.

لا شيء آخر يجب القيام به.


تحرير: أعرف أن البروتوكول الاختياري نشر بالفعل "حل العمل النهائي" ، لكنه لم يذكر لماذا إنها تعمل. كان السبب الفعلي مفاجئًا بالنسبة لي ، لذلك شعرت بالحاجة إلى إضافة إجابة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top