Android系统中触屏画图中主要需要解决以下问题:
1. 画图的视图,在哪上面画?
2. 怎么画?
3. 画的位置?
Android官方文档描述画图需要自定义视图(Custom View),通过重载OnDraw解决画的内容,OnMeasure处理画图的布局位置。自定义视图后,加入main.xml文件布局中,但加入布局需要在自定义视图中实现带有两个参数的构造函数(Context context,AttributeSet attrs),如自定义视图类DrawView,实现方式如下:
public DrawView(Context context,AttributeSet attrs) { super(context,attrs); //初始化对象 }OnMeasure方法主要用于视图对象的大小(宽和高),在重载此方法时,必须通过调用setMeasuredDimension(int,int)来存储测量后的宽和高,否则会产生IlleagalStateException异常。
protected void onMeasure(int measuredWidth, int measuredHeight) { //计算View对象的宽和高 //调用setMeasureDimension生效 setMeasuredDimension(width|MeasureSpec.EXACTLY, height|MeasureSpec.EXACTLY); }
OnDraw方法在每次调用Invalidate方法后对视图进行重画,画的内容则通过此方法来实现,而画图有两个基本元素:
1. Canvas: 画布,画图的内容,画什么?
2. Paint: 如何画?
例如:Canvas画出一条线段,Paint定义线段的颜色,宽度。
画图的内容则是通过OnDraw方法实现。
public void onDraw(Canvas canvas) { //画一张图片:将一张图片放在此视图中 canvas.drawBitmap(mBmp, 0, 0,paint); //画出记录的点 for (Point point : points) { point.draw(canvas, paint); } }画图的位置通过OnMeasure方法实现后,但由于是触屏画图则需要记录触点的位置,此过程通过实现OnTouchListener接口来捕捉该触屏事件,通过记录ACTION_MOVE和ACTION_DOWN事件中的坐标,最后在OnDraw函数中利用坐标画图一条直线,整个画图过程就完成了。
public boolean onTouch(View view, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_MOVE) { point = new FriendlyPoint(event.getX(), event.getY(), new_col, points.get(points.size() - 1), wid_mode); } else if (event.getAction() == MotionEvent.ACTION_DOWN) { point = new Point(event.getX(), event.getY(), new_col, wid_mode); } else { return false; } }
<p>版权声明:本文为博主原创文章,未经博主允许不得转载。</p>