2017-04-17 42 views
-1

我想创建一个圆形按钮,但中间有一个三角形。 用于发送按钮。我尝试使用XML和可绘制的,但总是有问题,当涉及到屏幕尺寸和意见不居中等总是等。如何在一个定向为播放按钮的圆圈内绘制完美的三角形

那么我怎么能只使用画布? 像我如何得到我需要绘制的点,例如,给定圆的半径,以及各种比例尺,给我三角形的点和绘制圆。 这里是什么,我想

this what I need一个图像

+0

为什么不使用的图像可在网上里面? (除非你真的想从头开始编码,包括按钮) – ItamarG3

+0

为什么不在Inkscape中绘制SVG? –

+0

这里是创建一个“完美”n-gon的代码:https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ui/shape/PolygonFactory.java – ControlAltDel

回答

0

我最近创建非常相似,你想要什么东西..

看看这个:https://www.desmos.com/calculator/2wpnxwwnty 怎么看数学/缩放作品。

这是导致该类:

public class TriangleInscribedCircle { 

    private Triangle inscribedTriangle; 

    private double s = 1; 
    private double r = 100; 

    public TriangleInscribedCircle(float radius, float scale) { 
     setScale(scale); 
     this.r = radius; 
     calculateTriangle(); 
    } 

    public Triangle getInscribedTriangle() { 
     return this.inscribedTriangle; 
    } 

    public double getScale() { 
     return this.s; 
    } 

    public void setScale(double scale) { 
     if (scale < 0 || scale > 12) { 
      throw new IllegalArgumentException("Scale must be between 0 and 12."); 
     } 
     this.s = scale; 
     calculateTriangle(); 
    } 

    public double getCircleRadius() { 
     return this.r; 
    } 

    public void setCircleRadius(double radius) { 
     this.r = radius; 
     calculateTriangle(); 
    } 

    private void calculateTriangle() { 
     double u = -((r)/(s + 1)) + r; 
     double x = (6 * u + 10 * r - Math.sqrt(36 * Math.pow(r, 2) + 24 * r * u - 12 * Math.pow(u, 2)))/(8); 
     double ax = x; 
     double ay = -Math.tan(Math.toRadians(30)) * (x - 2 * r + u) + r; 
     double bx = -u + 2 * r; 
     double by = r; 
     double cx = x; 
     double cy = Math.tan(Math.toRadians(30)) * (x - 2 * r + u) + r; 

     Point a = new Point(ax, ay); 
     Point b = new Point(bx, by); 
     Point c = new Point(cx, cy); 

     if (this.inscribedTriangle == null) { 
      this.inscribedTriangle = new Triangle(a, b, c); 
     } else { 
      this.inscribedTriangle.setA(a); 
      this.inscribedTriangle.setB(b); 
      this.inscribedTriangle.setC(c); 
     } 
    } 

} 

那么你的自定义视图

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    int width = getWidth(); 
    int height = getHeight(); 
    int radius = width/2; 

    canvas.drawCircle(width/2, height/2, radius, mTextFieldEmpty ? mCircleDisabledPaint : mCirclePaint); 
    canvas.drawPath(mTrianglePath, mTextFieldEmpty ? mTriangleDisabledPaint : mTrianglePaint); 
} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
    mTriangle = new TriangleInscribedCircle(w/2, 1); 
    calculatePath(); 
} 


private void calculatePath() { 
    mTrianglePath.reset(); 
    mTrianglePath.moveTo((int) mTriangle.getInscribedTriangle().getA().x, (int) mTriangle.getInscribedTriangle().getA().y); 
    mTrianglePath.lineTo((int) mTriangle.getInscribedTriangle().getB().x, (int) mTriangle.getInscribedTriangle().getB().y); 
    mTrianglePath.lineTo((int) mTriangle.getInscribedTriangle().getC().x, (int) mTriangle.getInscribedTriangle().getC().y); 
    mTrianglePath.lineTo((int) mTriangle.getInscribedTriangle().getA().x, (int) mTriangle.getInscribedTriangle().getA().y); 
} 
+0

什么是TangleInscribedCircle类中的三角形?它显示为红色 – thechosenone

+0

它只是一个持有人类3点,A,B,C。 Point是X和Y的持有者。 – Linxy