在界面中画出一条线段以及线段的箭头。做完后发现网上的箭头种类各样,也有用圆形画出箭头的方法,这里画出一条箭头的底与线段垂直,箭头大小可修改的方案。
工具/原料
安卓开发工具Ecilpse
方法/步骤
1、设置布局文件,添加2个控件,一个Button,一个ImageView
2、在MainAcitvity添加两个控件的全局变量,以及画图工具的全局变量 privateButtonbtn_drawline; privateImageViewiv_canvas; privateBitmapbaseBitmap; privateCanvascanvas; privatePaintpaint;
3、在oncreate()方法中初始化Button控件和ImageView控件,并给Button添加按键监听按键监听中调用画图方法://初始化一个画笔,笔触宽度为5,颜色为红色 paint=newPaint(); paint.setStrokeWidth(1); paint.setColor(Color.RED);iv_canvas=(ImageView)findViewById(R.id.iv_canvas); btn_drawline.setOnClickListener(click); btn_drawline.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ drawTria((float)300,(float)100,(float)100,(float)400, 50,10); } });
4、画线段和箭头的方法,处理芟镊圭薅箭头指向任何方向都能显示出来protectedvoiddrawTria(floatfromX,floatfromY,fl泠贾高框oattoX,floattoY, intheigth,intbottom){ //heigth和bottom分别为三角形的高与底的一半,调节三角形大小 baseBitmap=Bitmap.createBitmap(iv_canvas.getWidth(), iv_canvas.getHeight(),Bitmap.Config.ARGB_8888); canvas=newCanvas(baseBitmap); canvas.drawColor(Color.YELLOW);//设置底色 canvas.drawLine(fromX,fromY,toX,toY,paint); floatjuli=(float)Math.sqrt((toX-fromX)*(toX-fromX) +(toY-fromY)*(toY-fromY));//获取线段距离 floatjuliX=toX-fromX;//有正负,不要取绝对值 floatjuliY=toY-fromY;//有正负,不要取绝对值 floatdianX=toX-(heigth/juli*juliX); floatdianY=toY-(heigth/juli*juliY); floatdian2X=fromX+(heigth/juli*juliX); floatdian2Y=fromY+(heigth/juli*juliY); //终点的箭头 Pathpath=newPath(); path.moveTo(toX,toY);//此点为三边形的起点 path.lineTo(dianX+(bottom/juli*juliY),dianY -(bottom/juli*juliX)); path.lineTo(dianX-(bottom/juli*juliY),dianY +(bottom/juli*juliX)); path.close();//使这些点构成封闭的三边形 canvas.drawPath(path,paint); //显示图像 iv_canvas.setImageBitmap(baseBitmap); }
5、画出的箭头便随着线段的斜率而画出来了。线段的四个方向,以及线段平行X轴,平行Y轴的情况都能正常显示。
6、如果要画双向箭头,只需要再添加一个箭头议陬涸渎即可,调用以下方法:protectedvoiddrawTria烫喇霰嘴(floatfromX,floatfromY,floattoX,floattoY, intheigth,intbottom){ //heigth和bottom分别为三角形的高与底的一半,调节三角形大小 baseBitmap=Bitmap.createBitmap(iv_canvas.getWidth(), iv_canvas.getHeight(),Bitmap.Config.ARGB_8888); canvas=newCanvas(baseBitmap); canvas.drawColor(Color.YELLOW);//设置底色 canvas.drawLine(fromX,fromY,toX,toY,paint); floatjuli=(float)Math.sqrt((toX-fromX)*(toX-fromX) +(toY-fromY)*(toY-fromY));//获取线段距离 floatjuliX=toX-fromX;//有正负,不要取绝对值 floatjuliY=toY-fromY;//有正负,不要取绝对值 floatdianX=toX-(heigth/juli*juliX); floatdianY=toY-(heigth/juli*juliY); floatdian2X=fromX+(heigth/juli*juliX); floatdian2Y=fromY+(heigth/juli*juliY); //终点的箭头 Pathpath=newPath(); path.moveTo(toX,toY);//此点为三边形的起点 path.lineTo(dianX+(bottom/juli*juliY),dianY -(bottom/juli*juliX)); path.lineTo(dianX-(bottom/juli*juliY),dianY +(bottom/juli*juliX)); path.close();//使这些点构成封闭的三边形 canvas.drawPath(path,paint); //起点的箭头 Pathpath2=newPath(); path2.moveTo(fromX,fromY);//此点为边形的起点 path2.lineTo(dian2X+(bottom/juli*juliY),dian2Y -(bottom/juli*juliX)); path2.lineTo(dian2X-(bottom/juli*juliY),dian2Y +(bottom/juli*juliX)); path2.close();//使这些点构成封闭的三边形 canvas.drawPath(path2,paint); //显示图像 iv_canvas.setImageBitmap(baseBitmap); }