今天在做一个程序的时候需要画一个带箭头的坐标轴,找了很多办法都没成功,于是google,发现一个兄台使用了java当中的awt实现了画箭头,于是就借过来,改了一下,结果真能用。下面把画的一个箭头成果分享给大家:
- public class MyCanvas extends View{
- private Canvas myCanvas;
- private Paint myPaint=new Paint();
- public MyCanvas(Context context) {
- super(context);
- // TODO Auto-generated constructor stub
- }
- public MyCanvas(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- // TODO Auto-generated constructor stub
- }
- public MyCanvas(Context context, AttributeSet attrs) {
- super(context, attrs);
- // TODO Auto-generated constructor stub
- }
- @Override
- protected void onDraw(Canvas canvas) {
- // TODO Auto-generated method stub
- super.onDraw(canvas);
- this.myCanvas=canvas;
- drawAL(0, 0, 100, 100);
- }
- /**
- * 设置画笔默认样式
- */
- public void setPaintDefaultStyle(){
- myPaint.setAntiAlias(true);
- myPaint.setColor(Color.RED);
- myPaint.setStyle(Paint.Style.STROKE);
- myPaint.setStrokeWidth(3);
- }
- /**
- * 画圆
- * @param x x坐标
- * @param y y坐标
- * @param radius 圆的半径
- */
- public void drawCircle(float x,float y,float radius){
- myCanvas.drawCircle(x, y, radius, myPaint);
- invalidate();
- }
- /**
- * 画一条直线
- * @param fromX 起点x坐标
- * @param fromY 起点Y坐标
- * @param toX 终点X坐标
- * @param toY 终点Y坐标
- */
- public void drawLine(float fromX,float fromY,float toX,float toY){
- Path linePath=new Path();
- linePath.moveTo(fromX, fromY);
- linePath.lineTo(toX, toY);
- linePath.close();
- myCanvas.drawPath(linePath, myPaint);
- invalidate();
- }
- /**
- * 画箭头
- * @param sx
- * @param sy
- * @param ex
- * @param ey
- */
- public void drawAL(int sx, int sy, int ex, int ey)
- {
- double H = 8; // 箭头高度
- double L = 3.5; // 底边的一半
- int x3 = 0;
- int y3 = 0;
- int x4 = 0;
- int y4 = 0;
- double awrad = Math.atan(L / H); // 箭头角度
- double arraow_len = Math.sqrt(L * L + H * H); // 箭头的长度
- double[] arrXY_1 = rotateVec(ex - sx, ey - sy, awrad, true, arraow_len);
- double[] arrXY_2 = rotateVec(ex - sx, ey - sy, -awrad, true, arraow_len);
- double x_3 = ex - arrXY_1[0]; // (x3,y3)是第一端点
- double y_3 = ey - arrXY_1[1];
- double x_4 = ex - arrXY_2[0]; // (x4,y4)是第二端点
- double y_4 = ey - arrXY_2[1];
- Double X3 = new Double(x_3);
- x3 = X3.intValue();
- Double Y3 = new Double(y_3);
- y3 = Y3.intValue();
- Double X4 = new Double(x_4);
- x4 = X4.intValue();
- Double Y4 = new Double(y_4);
- y4 = Y4.intValue();
- // 画线
- myCanvas.drawLine(sx, sy, ex, ey,myPaint);
- Path triangle = new Path();
- triangle.moveTo(ex, ey);
- triangle.lineTo(x3, y3);
- triangle.lineTo(x4, y4);
- triangle.close();
- myCanvas.drawPath(triangle,myPaint);
- }
- // 计算
- public double[] rotateVec(int px, int py, double ang, boolean isChLen, double newLen)
- {
- double mathstr[] = new double[2];
- // 矢量旋转函数,参数含义分别是x分量、y分量、旋转角、是否改变长度、新长度
- double vx = px * Math.cos(ang) - py * Math.sin(ang);
- double vy = px * Math.sin(ang) + py * Math.cos(ang);
- if (isChLen) {
- double d = Math.sqrt(vx * vx + vy * vy);
- vx = vx / d * newLen;
- vy = vy / d * newLen;
- mathstr[0] = vx;
- mathstr[1] = vy;
- }
- return mathstr;
- }
- }
完整例子源码下载地址:http://download.csdn.net/detail/u013184970/9564182