我怎样才能绘制在Android应用程序的画布轮廓三角形?

问题描述 投票:0回答:1

我曾试图用油漆划一个三角形遇到了问题。

我试图在油漆使用表示轮廓,然后另外一个在它代表实际三角形路径帆布一个三角形。

public void drawTriangle(int coordX, int coordY, int sideLen, String fillColor, int strokeWidth, String strokeColor) {
        this.marginSTART = coordX;
        this.marginTOP = coordY;

        this.getLayoutParams().width = sideLen;
        this.getLayoutParams().height = sideLen-sideLen/8;

        this.setX(this.marginSTART);
        this.setY(this.marginTOP);

        Paint paint = new Paint();
        Bitmap bitmap = Bitmap.createBitmap(sideLen, sideLen, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);

        paint.setColor(Color.parseColor("#ff0000"));
        canvas.drawPaint(paint);

        paint.setStrokeWidth(0);
        paint.setColor(Color.parseColor(strokeColor));
        paint.setStyle(Paint.Style.FILL_AND_STROKE);
        paint.setAntiAlias(true);

        android.graphics.Point a = new android.graphics.Point(0, sideLen);
        android.graphics.Point b = new android.graphics.Point(sideLen, sideLen);
        android.graphics.Point c = new android.graphics.Point(sideLen/2, 0);

        Path path = new Path();
        path.setFillType(Path.FillType.EVEN_ODD);
        path.setLastPoint(a.x, a.y);
        path.lineTo(b.x, b.y);
        path.lineTo(c.x, c.y);
        path.lineTo(a.x, a.y);
        path.close();

        canvas.drawPath(path, paint);


        Paint paint2 = new Paint();

        paint2.setStrokeWidth(0);
        paint2.setColor(Color.parseColor(fillColor));
        paint2.setStyle(Paint.Style.FILL_AND_STROKE);
        paint2.setAntiAlias(true);

        android.graphics.Point a1 = new android.graphics.Point((strokeWidth*8)/10, sideLen-strokeWidth);
        android.graphics.Point b1 = new android.graphics.Point(sideLen-(strokeWidth*8)/10, sideLen-strokeWidth);
        android.graphics.Point c1 = new android.graphics.Point(sideLen/2, (strokeWidth*8)/10);

        Path path2 = new Path();
        path2.setFillType(Path.FillType.EVEN_ODD);
        path2.setLastPoint(a1.x, a1.y);
        path2.lineTo(b1.x, b1.y);
        path2.lineTo(c1.x, c1.y);
        path2.lineTo(a1.x, a1.y);
        path2.close();

        canvas.drawPath(path2, paint2);

        BitmapDrawable bmpDrawable = new BitmapDrawable(getResources(), bitmap);
        this.setBackground(bmpDrawable);
    }

结果我至今:https://i.imgur.com/FVexwhe.png 它看起来那么糟糕。它的变形。我不明白这一点。哪里是我的错误在哪里?

java android canvas paint
1个回答
0
投票
public void drawTriangle(int coordX, int coordY, int sideLen, String fillColor, int strokeWidth, String strokeColor) {
        this.marginSTART = coordX;
        this.marginTOP = coordY;

        this.fillColor = fillColor;
        this.strokeColor = strokeColor;
        this.strokeWidth = strokeWidth;

        //Съотношение:
        double suotnoshenie = 0.857;

        this.getLayoutParams().width = sideLen;
        this.getLayoutParams().height = (int) Math.floor(sideLen*suotnoshenie);

        this.setX(this.marginSTART);
        this.setY(this.marginTOP);

        //Първи тръигълник, който ще се запълни (реална големина)

        Paint paint = new Paint();
        Bitmap bitmap = Bitmap.createBitmap(sideLen, (int) Math.floor(sideLen*suotnoshenie), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);

        /*paint.setColor(Color.parseColor("#ff0000")); //testing
        canvas.drawPaint(paint);*/

        paint.setStrokeWidth(0);
        paint.setColor(Color.parseColor(fillColor));
        paint.setStyle(Paint.Style.FILL);
        paint.setAntiAlias(true);

        Path path = new Path();
        path.setLastPoint(0, (float) (sideLen*suotnoshenie)); // A
        path.lineTo(sideLen, (float) (sideLen*suotnoshenie)); // B
        path.lineTo((float)(sideLen/2), 0); // C
        path.lineTo(0, (float) (sideLen*suotnoshenie)); // A
        path.close();

        canvas.drawPath(path, paint);

        //Втори тръигълник, който няма да се запълва, а само ще stroke-ва
        // (линиите, който го очертават трябва да влизат вътре в големия до половината stroke, понеже самият stroke минава от двете страни на линиите...)

        Paint paint2 = new Paint();

        paint2.setStrokeWidth(strokeWidth);
        paint2.setColor(Color.parseColor(strokeColor));
        paint2.setStyle(Paint.Style.STROKE);
        paint2.setAntiAlias(true);

        Path path2 = new Path();
        path2.setLastPoint((float) (0+(strokeWidth*1.75)/2), (float) ((sideLen*suotnoshenie)-strokeWidth/2)); // A
        path2.lineTo((float) (sideLen-(strokeWidth*1.75)/2), (float) ((sideLen*suotnoshenie)-strokeWidth/2)); // B
        path2.lineTo((float) (sideLen/2), (float) (0+strokeWidth)); // C
        path2.lineTo((float) (0+(strokeWidth*1.75)/2), (float) ((sideLen*suotnoshenie)-strokeWidth/2)); // A
        path2.close();

        canvas.drawPath(path2, paint2);

        BitmapDrawable bmpDrawable = new BitmapDrawable(getResources(), bitmap);
        this.setBackground(bmpDrawable);
    }
© www.soinside.com 2019 - 2024. All rights reserved.