অ্যান্ড্রয়েড ক্যানভাসে ভরা ত্রিভুজটি কীভাবে আঁকবেন?


88

সুতরাং আমি আমার আঁকার পদ্ধতিতে নীচের কোডটি ব্যবহার করে অ্যান্ড্রয়েড মানচিত্রে এই ত্রিভুজটি আঁকছি:

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

আমি জানি এটি একটি পুরানো প্রশ্ন যার ইতিমধ্যে একটি (ভুল) স্বীকৃত উত্তর রয়েছে, এবং আপনি আপনার চূড়ান্ত সমাধানও পোস্ট করেছেন যা কাজ করে ... তবে আপনি কেন বলছেন না যে এটি কেন কাজ করে, এবং আমি আশা করি যে আমার মন্তব্যটি আমার সময়টি কেউ বাঁচাতে পারে ' সবেমাত্র
এটিতে

উত্তর:


42

আপনার সম্ভবত এমন কিছু করা দরকার:

Paint red = new Paint();

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

এবং আপনার এআরজিবি পরিবর্তে আপনার রঙের জন্য এই রঙটি ব্যবহার করুন। আপনার পথের শেষ পয়েন্টটি প্রথমটি শেষ হবে তা নিশ্চিত করুন, এটিও বোধগম্য।

দয়া করে এটি কাজ করে যদি বলুন!


দুর্ভাগ্যক্রমে এটি কোনও
উপকারে

@ নিকোলাস এআরজিবি এর পরিবর্তে কী ব্যবহার করতে হবে, যদি আমাদের প্রাক-সংজ্ঞায়িত মান ব্যবহারের পরিবর্তে আরজিবি মান সহ রঙটি কাস্টমাইজ করতে হয়?
পল্লভ বোহারা

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()যে স্বয়ংক্রিয়ভাবে না।
টিএমএমএম

@ টিএমএমএম আমি পরীক্ষা করেছি, আপনি ঠিক বলেছেন, শেষ লাইনটির দরকার নেই () আপনাকে ধন্যবাদ।
banxi1988

তোমাকে অনেক ধন্যবাদ. আমি কেন জানি না কেন আমার ত্রিভুজ আঁকতে এতো সমস্যা হয়েছে, তবে আমি এই ক্ষুদ্র সমস্যাটিতে বিগত 20 মিনিট সময় কাটিয়েছি।
আচল দাভে

4
কপি-পেস্ট করার জন্য সহজ পদ্ধতিটি এখানে রয়েছে (@ পাভেলের কোডের উপর ভিত্তি করে): gist.github.com/ZirconCode/59cae1e2615279eafb29
জিরকন

4
আপনি যদি 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());

4
আমি মনে করি না এই সমাধানটি ভরাট আকারগুলি পরিচালনা করে। (পরীক্ষা করতে পারবেন না, এই মুহুর্তে আমার আইডিই নেই)
নিকোলাস সি

4
এটি আরও পারফরম্যান্ট সমাধানের মতো বলে মনে হচ্ছে, তবে দুর্ভাগ্যক্রমে এই পদ্ধতিটি হার্ডওয়্যার-গতিযুক্ত দৃষ্টিভঙ্গিতে সমর্থিত নয়। আপনি হার্ডওয়্যার ত্বরণকে অক্ষম করতে পারেন, তবে তারপরে আপনি তার কার্যকারিতা লাভগুলি হারাবেন: developer.android.com/guide/topics/ographicics/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);

}

এই কাজ করছে! মসৃণ ত্রিভুজটি পেতে পেইন্ট.সেটআন্তিআলিয়াস (সত্য) ব্যবহার করতে ভুলবেন না।
বোলদিজার পল

4
আঁকাবার্টিস কাকে বলে?
PsiX

3

প্রথম প্রাথমিকের পরে আপনার পাথ.মোভটো অপসারণ করতে হবে।

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

আমার কাছে তিনটি পয়েন্ট নেই তবে কেবলমাত্র একটি পয়েন্ট x নাদ y আছে আমি কীভাবে সেই বিন্দু থেকে ত্রিভুজ আঁকতে পারি।
প্রণব 5'15

2

moveTo()প্রতিটি পরে নাlineTo()

অন্য কথায়, moveTo()প্রথমটি বাদে প্রতিটি অপসারণ করুন ।

গুরুতরভাবে, আমি যদি ওপি-র কোডটি কেবল কপি-পেস্ট করি এবং অপ্রয়োজনীয় moveTo()কলগুলি সরিয়ে ফেলি তবে এটি কার্যকর হয়।

আর কিছু করার দরকার নেই।


সম্পাদনা: আমি জানি ওপি ইতিমধ্যে তার "চূড়ান্ত কার্যনির্বাহী সমাধান" পোস্ট করেছে, তবে কেন এটি কাজ করে তা তিনি জানালেন না । আসল কারণটি আমার কাছে বেশ অবাক হয়েছিল, তাই আমি উত্তর যুক্ত করার প্রয়োজনীয়তা অনুভব করেছি।


আপনি এই জন্য একটি মন্তব্য যুক্ত করা উচিত ছিল। এটি কোনও উত্তর নয়।
অঙ্গদ সিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.