Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.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_Wear Os_Watch Face Api - Fatal编程技术网

Android 如何绘制手表表面';滴答声';在方形手表上?

Android 如何绘制手表表面';滴答声';在方形手表上?,android,wear-os,watch-face-api,Android,Wear Os,Watch Face Api,我现在有一段代码,它生成了android wear watchface外部的刻度 float innerMainTickRadius = mCenterX - 35; for(int tickIndex = 0; tickIndex < 12; tickIndex++) { float tickRot = (float) (tickIndex * Math.PI * 2 / 12); float inn

我现在有一段代码,它生成了android wear watchface外部的刻度

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);
            }
float-innerMainTickRadius=mCenterX-35;
对于(int-tickIndex=0;tickIndex<12;tickIndex++){
float tickRot=(float)(ticklindex*Math.PI*2/12);
float innerX=(float)Math.sin(tickRot)*innerMainTickRadius;
float innerY=(float)-Math.cos(tickRot)*innerMainTickRadius;
float outerX=(float)数学sin(tickRot)*mCenterX;
float outerY=(float)-Math.cos(tickRot)*mCenterX;
画布.抽绳(mCenterX+innerX、mCenterY+innerY、mCenterX+outerX、mCenterY+outerY、mTickPaint);
}
它在圆形表盘上产生滴答声,但在方形表盘上则是这样: 但我希望它们不是圆形的,而是更适合形状,例如:


有没有标准的方法可以做到这一点?我猜我不能再使用trig了…

现在角度是位置的函数。在这种情况下,我并没有立即看到获取封闭表单的诀窍。但在最一般的情况下,你可能只需要存储每个记号的位置,然后你只需要画一条穿过该点和中心的线。所以秒i的角度就是

theta(i)=arctan(y_pos(i) / x_pos(i))

假设中心有坐标(0,0)。在这种情况下,您只需要存储8个连续记号的位置,因为面是周期性的,每90度一次,并且关于对角线也是对称的。

当然,您可以使用几何体和三角。例如,您在时钟面上放置的任何一条线,您希望指向中心,这样一个部分将是给定的(x,y),另一部分将是arctan2(cy-y,cx-x),给出从点到中心的角度(cx,cy),然后简单地在给定长度r的中心方向上绘制该线,方法是从x,y到cos(角度)绘制该线*r,sin(角度)*r

但是,给定示例图像,您可能希望绘制从x,y到x+r的线,然后按角度旋转画布,以便可以绘制像这样调整的数字。确保在调整画布的矩阵之前执行canvas.save(),并在调整之后执行canvas.restore()

这就留下了你想要画记号的形状和位置的数学。您可以在一个路径中执行此操作。因此,为圆角矩形定义路径,然后使用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);
    }
float left=cx-50;
浮顶=cy-50;
右浮动=cx+50;
浮底=cy+50;
浮动ry=20;
浮点数rx=20;
浮动宽度=左右;
浮动高度=底部-顶部;
路径路径=新路径();
path.moveTo(右,上+右);
路径rQuadTo(0,-ry,-rx,-ry);
路径rLineTo(-(宽度-(2*rx)),0);
路径rQuadTo(-rx,0,-rx,ry);
路径rLineTo(0,(高度-(2*ry));
路径rQuadTo(0,ry,rx,ry);
路径rLineTo((宽度-(2*rx)),0);
路径rQuadTo(rx,0,rx,-ry);
路径rLineTo(0,-(高度-(2*ry));
path.close();
PathMeasure PathMeasure=新的PathMeasure();
setPath(path,true);
float length=pathMeasure.getLength();
浮动[]位置=新浮动[2];
浮点数r=长度;
对于(int i=0;i
诚然,它看起来像:


因此,要让它看起来像你的图像,需要做更多的工作。但是,这是完全可行的。路径测量技巧适用于任何形状。由于棒棒糖+的限制,我避免使用path.addRoundRect。你可以看到我对这个问题的回答。还有其他的答案,这些答案对于如何画一个圆形的矩形很好。如果你想写一个包络函数,你可以简单地根据因子t将当前图片缩放到矩形的包络,因为它是24小时运行的。

如果你有矢量模型,你可以使用矢量图形,在绘制过程中把图标放大。在SVG中绘制您想要的内容将其转换为android矢量图形,然后将可绘制的图形绘制到画布上,它将非常小且不含糊。这其实不是一个坏主意。我使用了你的第一个答案,经过一点调整,最终效果相当不错