Android用canvas画随意方向箭头

Android用canvas画随意方向箭头

主要是通过正弦余弦(sin、cos、tan)来计算箭头两边形成的三角形的角度,然后计算出箭头两条边的起点位置(终点位置就是尖端)
效果如下图:
Android用canvas画随意方向箭头_第1张图片


主要代码如下:
/**
	 * 
	 * @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;
	}

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

你可能感兴趣的:(Android)