एंड्रॉइड कैनवास में एक भरा हुआ त्रिकोण कैसे खींचना है?


87

इसलिए मैं अपने ड्रा विधि में नीचे दिए गए कोड का उपयोग करके एंड्रॉइड के नक्शे में इस त्रिकोण को आकर्षित कर रहा हूं:

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 वे निर्देशांक हैं जो मुझे खेतों से मिल रहे हैं। वे मूल रूप से अक्षांश और देशांतर हैं। परिणाम एक अच्छा त्रिकोण है लेकिन अंदरूनी सूत्र खाली है और इसलिए मैं नक्शा देख सकता हूं। क्या किसी तरह इसे भरने का कोई तरीका है?


जैसा कि मैंने अपने उत्तर में पोस्ट किया है, बस प्रत्येक लाइनटॉ () के बाद हिलना मत (), बस यही है।
oli.G

मुझे पता है कि यह एक पुराना प्रश्न है जिसमें पहले से ही एक (गलत) स्वीकृत उत्तर है, और आपने अपना अंतिम समाधान भी पोस्ट किया है जो काम करता है ... लेकिन आप यह नहीं बता रहे हैं कि यह क्यों काम करता है, और मुझे आशा है कि मेरी टिप्पणी किसी को मेरे समय को बचा सकती है ' इस पर खर्च किया गया है :)
oli.G

जवाबों:


41

आपको शायद कुछ करने की ज़रूरत है:

Paint red = new Paint();

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

और अपने ARGB के बजाय, अपने पथ के लिए इस रंग का उपयोग करें। सुनिश्चित करें कि आपके पथ का अंतिम बिंदु पहले एक पर समाप्त होता है, यह भी समझ में आता है।

मुझे बताओ अगर यह काम करता है कृपया!


दुर्भाग्य से यह मदद नहीं करता है
oli.G

@ एनआईओसीएल को एआरजीबी के बजाय क्या उपयोग करना है, अगर हमें पूर्व-परिभाषित मूल्यों का उपयोग करने के बजाय आरजीबी मूल्य के साथ रंग को अनुकूलित करना है?
पल्लव बोहरा

75

ठीक है, मैंने कर दिया है। मैं इस कोड को साझा कर रहा हूँ अगर किसी और को इसकी आवश्यकता होगी:

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;

संकेत निकोलस के लिए धन्यवाद!


7
मुझे पूरा यकीन है कि आपको आखिरी जरूरत नहीं है lineTo()close()स्वचालित रूप से करता है।
टिमम्म

@Timmmm मैंने परीक्षण किया है, आप सही हैं, अंतिम लाइन की आवश्यकता नहीं है () धन्यवाद।
banxi1988

बहुत बहुत धन्यवाद। मुझे नहीं पता कि मेरे पास त्रिकोण बनाने के लिए इतने सारे मुद्दे क्यों थे, लेकिन मैंने इस छोटी सी समस्या पर विभिन्न कीड़े के साथ पिछले 20 मिनट बिताए हैं।
अचल दवे

1
यहां कॉपी- पेस्टिंग
ZirconCode

1
यदि आप बदल pathएक उदाहरण चर के लिए, कॉल करने के लिए याद path.reset()करने के बाद canvas.drawPath()
सिरा लैम

11

तुम भी उपयोग कर सकते हैं अनुलंब:

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

2
मुझे नहीं लगता कि यह समाधान भरे हुए आकृतियों को संभालता है। (परीक्षण नहीं कर सकता, मेरे पास इस समय मेरी आईडीई नहीं है)
निकोलस सी।

3
यह अधिक निष्पादित समाधान की तरह लगता है, लेकिन दुर्भाग्य से यह विधि हार्डवेयर-त्वरित विचारों पर समर्थित नहीं है। आप हार्डवेयर त्वरण को अक्षम कर सकते हैं, लेकिन फिर आप इसके प्रदर्शन लाभ खो देते हैं: developer.android.com/guide/topics/graphics/hardware-accel.html
SurlyDre

8

यहां छवि विवरण दर्ज करें

यह फ़ंक्शन दिखाता है कि बिटमैप से एक त्रिकोण कैसे बनाया जाए। यही है, त्रिकोणीय आकार की फसली छवि बनाएं। नीचे दिए गए कोड को आज़माएं या डेमो उदाहरण डाउनलोड करें

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

ऊपर का फ़ंक्शन कैनवास पर खींची गई त्रिकोणीय छवि देता है। अधिक पढ़ें


7

गाइड के रूप में @ पावेल के जवाब का उपयोग करते हुए, यहां एक सहायक विधि है यदि आपके पास अंक नहीं हैं लेकिन 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);
    }

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

}

यह काम कर रहा है! एक चिकनी त्रिभुज प्राप्त करने के लिए paint.setAntiAlias ​​(सच) का उपयोग करना न भूलें।
बोल्डिजर पॉल

2
क्या है आह्वान के लिए आह्वान?
PsiX

3

आपको पहले प्रारंभिक के बाद 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();

मेरे पास 3 बिंदु नहीं है लेकिन केवल एक बिंदु x nad y है मैं उस बिंदु से एक त्रिकोण कैसे खींच सकता हूं।
प्रणव

2

moveTo()प्रत्येक के बाद मत करोlineTo()

दूसरे शब्दों में, moveTo()पहले वाले को छोड़कर हर हटा दें ।

गंभीरता से, अगर मैं सिर्फ ओपी के कोड को कॉपी-पेस्ट करता हूं और अनावश्यक moveTo()कॉल हटाता हूं, तो यह काम करता है।

और कुछ नहीं करना है।


संपादित करें: मुझे पता है कि ओपी ने पहले से ही अपना "अंतिम कार्य समाधान" पोस्ट किया था, लेकिन उन्होंने यह नहीं बताया कि यह क्यों काम करता है। वास्तविक कारण मेरे लिए काफी आश्चर्यजनक था, इसलिए मुझे उत्तर जोड़ने की आवश्यकता महसूस हुई।


आपको इसके लिए एक टिप्पणी जोड़नी चाहिए थी। यह कोई जवाब नहीं है।
अंगद सिंह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.