我现在有一个代码片段生成了android-wear手表表面和外部的记号。
float innerMainTickRadius = mCenterX - 35;
for(int tickIndex = 0; tickIndex < 12; tickIndex++) {
float tickRot = (float) (tickIndex * Math.PI * 2 / 12);
float innerX = (float) Math.sin(tickRot) * innerMainTickRadius;
float innerY = (float) -Math.cos(tickRot) * innerMainTickRadius;
float outerX = (float) Math.sin(tickRot) * mCenterX;
float outerY = (float) -Math.cos(tickRot) * mCenterX;
canvas.drawLine(mCenterX + innerX, mCenterY + innerY, mCenterX + outerX, mCenterY + outerY, mTickPaint);
}
在圆形观察面上很容易产生滴答声,但在正方形上却变成这样:
但我希望它们不是圆形的,而是更适合形状,例如:
有标准的方法吗?我想我不能再使用trig了…
最佳答案
当然你用几何和三角。例如,你放在你想要指向中心的钟面上的任何一条线,其中一部分是给定的(x,y),另一部分是arctan2(cy-y,cx-x),给出你从你的点到中心的角度(cx,cy),然后简单地沿着给定透镜中心的方向画一条线。gth r,通过绘制从x,y到cos(角度)*r,sin(角度)*r的线。
但是,考虑到您的示例图像,您可能希望绘制从x,y到x+r,y的直线,然后按角度旋转画布,以便您可以绘制那些像那样调整的数字。在调整画布的矩阵和调整后的canvas.restore()之前,请确保执行canvas.save()。
这就留下了你想从哪种形状画出你的勾号以及它们的位置的数学公式。你可以在一条路径内完成。因此,定义圆角矩形的路径,然后使用PathMeasure类获取getPostan(),然后忽略切线,只使用它提供的位置来查找圆角矩形周围的位置。或者简单地计算这些位置作为通过线段或贝塞尔截面的位置,这取决于所决定的形状。
例如:
static final int TICKS = 12;
static final float TICKLENGTH = 20;
在抽签程序中,
float left = cx - 50;
float top = cy - 50;
float right = cx + 50;
float bottom = cy + 50;
float ry = 20;
float rx = 20;
float width = right-left;
float height = bottom-top;
Path path = new Path();
path.moveTo(right, top + ry);
path.rQuadTo(0, -ry, -rx, -ry);
path.rLineTo(-(width - (2 * rx)), 0);
path.rQuadTo(-rx, 0, -rx, ry);
path.rLineTo(0, (height - (2 * ry)));
path.rQuadTo(0, ry, rx, ry);
path.rLineTo((width - (2 * rx)), 0);
path.rQuadTo(rx, 0, rx, -ry);
path.rLineTo(0, -(height - (2 * ry)));
path.close();
PathMeasure pathMeasure = new PathMeasure();
pathMeasure.setPath(path,true);
float length = pathMeasure.getLength();
float[] pos = new float[2];
float r = TICKLENGTH;
for (int i = 0; i < TICKS; i++) {
pathMeasure.getPosTan(i * (length/TICKS),pos,null);
double angle = Math.atan2(cy - pos[1], cx - pos[0]); //yes, y then x.
double cos = Math.cos(angle);
double sin = Math.sin(angle);
canvas.drawLine(pos[0], pos[1], (float)(pos[0] + cos * r), (float)(pos[1] + sin * r), paint);
}
诚然,它看起来像:
所以要想让它看起来像你的形象还需要很多工作。但是,这是完全可行的。路径测量技巧对任何形状都有效。由于棒棒糖+限制,我避免使用path.addroundrect。你可以看到我对那个问题的回答。其他的答案对如何画出一个圆形的长方形很有帮助。你可以,如果你想写一个包络函数,只需根据因子t将当前图片缩放到矩形的包络,因为它是全天候的。