Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android画布上绘制填充三角形_Android_Android Canvas_Shape - Fatal编程技术网

如何在android画布上绘制填充三角形

如何在android画布上绘制填充三角形,android,android-canvas,shape,Android,Android Canvas,Shape,我有一个扩展视图类的类MyView。MyView应该绘制填充三角形。我画了一个三角形,但我不能把它填满。这是我的onDraw()方法: 这就是我得到的结果: 我找到了答案 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setColor(android.graphics.Color.BLACK); can

我有一个扩展视图类的类MyView。MyView应该绘制填充三角形。我画了一个三角形,但我不能把它填满。这是我的onDraw()方法:

这就是我得到的结果:

我找到了答案

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Paint paint = new Paint();

    paint.setColor(android.graphics.Color.BLACK);
    canvas.drawPaint(paint);

    paint.setStrokeWidth(4);
    paint.setColor(android.graphics.Color.RED);
    paint.setStyle(Paint.Style.FILL_AND_STROKE);
    paint.setAntiAlias(true);

    Point a = new Point(0, 0);
    Point b = new Point(0, 100);
    Point c = new Point(87, 50);

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

    canvas.drawPath(path, paint);
}

这些链接非常有用


  • 我想指出的是,您永远不应该初始化onDraw()中的对象,因为它会被多次调用并导致性能问题。

    这个答案提供了一点关于@Egis答案中给出的数字来自何处的清晰信息。(这将绘制一个倒置的等边三角形,并用kotlin书写)

    get height函数始终会发现等边三角形的高度约为其边长的87%


    可以在这里找到,它包含另一个方向的代码

    我最近创建了一个小的演示应用程序,绘制各种形状,包括三角形、矩形和螺旋。下面是绘制三角形的代码。有关完整上下文,请参考项目。在这个应用程序中,用户可以绘制一个三角形作为一个单独的图形,或者在用户滚动时将两个三角形组合成一个。三角形增长是通过三角形相似性原则实现的,每个较小的三角形最终都与大三角形相似

    项目:

    资料来源摘录:


    第一行应该是moveTo。否则它将从点(0,0)开始绘制。在这种情况下这不是一个问题,但我面对它,因为我想从中心绘图。Android建议不要在
    onDraw()
    中进行对象分配,现在IDE中会自动发出警告。但是,请记住在
    canvas.drawPath()
    之后调用
    path.reset()
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint();
    
        paint.setColor(android.graphics.Color.BLACK);
        canvas.drawPaint(paint);
    
        paint.setStrokeWidth(4);
        paint.setColor(android.graphics.Color.RED);
        paint.setStyle(Paint.Style.FILL_AND_STROKE);
        paint.setAntiAlias(true);
    
        Point a = new Point(0, 0);
        Point b = new Point(0, 100);
        Point c = new Point(87, 50);
    
        Path path = new Path();
        path.setFillType(FillType.EVEN_ODD);
        path.lineTo(b.x, b.y);
        path.lineTo(c.x, c.y);
        path.lineTo(a.x, a.y);
        path.close();
    
        canvas.drawPath(path, paint);
    }
    
    class TriangleView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {
    
        val paint = Paint()
        val path = Path()
    
        override fun onDraw(canvas: Canvas?) {
            super.onDraw(canvas)
            canvas ?: return
            canvas.drawPath(configurePath(canvas.width.toFloat(), path), configurePaint(paint))
        }
    
        fun getHeight(width: Double): Float {
            return Math.sqrt((Math.pow(width, 2.0) - Math.pow((width / 2), 2.0))).toFloat()
        }
    
        fun configurePaint(paint: Paint): Paint {
            paint.color = android.graphics.Color.WHITE
            paint.isAntiAlias = true
    
            return paint
        }
    
        fun configurePath(width: Float, path: Path): Path {
            path.lineTo((width / 2f), getHeight(width.toDouble()))
            path.lineTo(width, 0F)
            path.lineTo(0f, 0f)
    
            return path
        }
    }
    
     private void drawTriangleShape(Canvas canvas, RectF bounds,
                TriangleInterpolator triangleInterpolator, Paint paint) {
            paint.setStyle(Paint.Style.FILL);
    
            float baseInterpolation = triangleInterpolator
                    .getInterpolatedValues()[TriangleInterpolator.INTERPOLATION_VALUES_BASE];
            float altitudeInterpolation = triangleInterpolator
                    .getInterpolatedValues()[TriangleInterpolator.INTERPOLATION_VALUES_ALTITUDE];
    
            // *** Construct the Left Triangle ** //
    
            // Bottom left vertex
            float bottomLeftX = bounds.left;
            float bottomLeftY = bounds.bottom;
    
            // Bottom right corner
            float bottomRightX = bottomLeftX + baseInterpolation;
            float bottomRightY = bounds.bottom;
    
            //Top Vertex
            float topX = bottomRightX;
            float topY = bottomRightY - altitudeInterpolation;
    
            Path leftTriangle = new Path();
            leftTriangle.lineTo(bottomLeftX, bottomLeftY);
            leftTriangle.lineTo(bottomRightX, bottomRightY);
            leftTriangle.lineTo(topX, topY);
            leftTriangle.lineTo(bottomLeftX, bottomLeftY);
    
            canvas.drawPath(leftTriangle, paint);
    
            if (triangleInterpolator.isSymmetric()) {
                // *** Construct the Right Triangle ** //
    
                bottomLeftX = bounds.right - baseInterpolation;
                bottomLeftY = bounds.bottom;
    
                bottomRightX = bounds.right;
                bottomRightY = bounds.bottom;
    
                topX = bottomLeftX;
                topY = bottomRightY - altitudeInterpolation;
    
                Path rightTriangle = new Path();
                rightTriangle.lineTo(bottomLeftX, bottomLeftY);
                rightTriangle.lineTo(bottomRightX, bottomRightY);
                rightTriangle.lineTo(topX, topY);
                rightTriangle.lineTo(bottomLeftX, bottomLeftY);
    
                canvas.drawPath(rightTriangle, paint);
            }
        }