web-dev-qa-db-ja.com

Androidキャンバスで塗りつぶされた三角形を描画する方法?

だから、私はこの三角形を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は、フィールドから取得している座標です。基本的には緯度と経度です。結果は素敵な三角形ですが、インサイダーは空なので、地図を見ることができます。何とかそれを埋める方法はありますか?

83
Pavel

あなたはおそらく次のようなことをする必要があります:

Paint red = new Paint();

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

そして、ARGBの代わりにパスにこの色を使用します。パスの最後のポイントが最初のポイントで終わっていることを確認してください。

うまくいったら教えてください!

40
Nicolas C.

了解しました。他の誰かがそれを必要とする場合に備えて、私はこのコードを共有しています:

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;

ヒントをありがとうニコラス!

74
Pavel

頂点も使用できます:

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

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

上記の関数は、キャンバスに描かれた三角形の画像を返します。 続きを読む

6
Daniel Nyamasyo

@Pavelの答えをガイドとして使用して、ポイントがなくても開始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);
    }
5
scottyab
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
Faakhir

最初のイニシャルの後に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
kaftanati

moveTo()の後にlineTo()しないでください

言い換えると、最初のものを除くすべてのmoveTo()を削除します。

真剣に、OPのコードをコピーして貼り付け、不要なmoveTo()呼び出しを削除するだけで機能します。

他に何もする必要はありません。


編集:私はOPがすでに彼の「最終的な作業ソリューション」を投稿したことを知っていますが、彼はそれが動作する理由を述べませんでした。実際の理由は非常に驚きでしたので、答えを追加する必要があると感じました。

1
oli.G