Android用canvas画随意方向箭头

来源:互联网 发布:淘宝店铺售假多久恢复 编辑:程序博客网 时间:2024/06/06 20:38

Android用canvas画随意方向箭头

主要是通过正弦余弦(sin、cos、tan)来计算箭头两边形成的三角形的角度,然后计算出箭头两条边的起点位置(终点位置就是尖端)
效果如下图:



主要代码如下:
</pre><pre name="code" class="java">/** *  * @param canvas * @param color  颜色 *            * @param arrowSize 箭头的边的长度 *             * @param x1  中心点坐标 *             * @param y1  中心点坐标 *             * @param x2  中心点坐标 *             * @param y2  中心点坐标 *             */void DrawArrows(Canvas canvas, int color, float arrowSize, float x1,float y1, float x2, float y2) {paint.setAntiAlias(true);paint.setStyle(Paint.Style.STROKE);paint.setColor(color);// 画直线canvas.drawLine(x1, y1, x2, y2, paint);// 箭头中的第一条线的起点int x3 = 0;int y3 = 0;// 箭头中的第二条线的起点int x4 = 0;int y4 = 0;double awrad = Math.atan(3.5 / 8);double[] arrXY_1 = rotateVec(x2 - x1, y2 - y1, awrad, arrowSize);double[] arrXY_2 = rotateVec(x2 - x1, y2 - y1, -awrad, arrowSize);// 第一端点Double X3 = Double.valueOf(x2 - arrXY_1[0]);x3 = X3.intValue();Double Y3 = Double.valueOf(y2 - arrXY_1[1]);y3 = Y3.intValue();// 第二端点Double X4 = Double.valueOf(x2 - arrXY_2[0]);x4 = X4.intValue();Double Y4 = Double.valueOf(y2 - arrXY_2[1]);y4 = Y4.intValue();Path arrowsPath = new Path();arrowsPath.moveTo(x2, y2);arrowsPath.lineTo(x3, y3);arrowsPath.lineTo(x4, y4);arrowsPath.close();canvas.drawLine(x3, y3, x2, y2, paint);canvas.drawLine(x4, y4, x2, y2, paint);}private double[] rotateVec(float px, float py, double ang, double arrowSize) {double mathstr[] = new double[2];double vx = px * Math.cos(ang) - py * Math.sin(ang);double vy = px * Math.sin(ang) + py * Math.cos(ang);double d = Math.sqrt(vx * vx + vy * vy);vx = vx / d * arrowSize;vy = vy / d * arrowSize;mathstr[0] = vx;mathstr[1] = vy;return mathstr;}

基本都是高中数学的问题,没啥难度。

0 0