关于View 和SurfaceView:
View 必须在UI的主线程中更新画面,如果你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。
SurfaceView可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度
使用方法:
首先继承SurfaceView并实现SurfaceHolder.Callback接口。
使用接口的原因:因为使用SurfaceView 有一个原则,所有的绘图工作必须得在Surface 被创建之后才能开始,而在Surface被销毁之前必须结束。所以Callback中的surfaceCreated(创建) 和surfaceDestroyed(销毁) 就成了绘图处理代码的边界。(1)、abstract void addCallback(SurfaceHolder.Callback callback);
给SurfaceView当前的持有者一个回调对象。
(2)、abstract Canvas lockCanvas();
锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
(3)、abstract Canvas lockCanvas(Rect rect);
锁定画布的某个区域进行画图等,不用重画rect外的其它区域的像素,可以提高速度。
(4)、abstract void unlockCanvasAndPost(Canvas canvas);
结束锁定画布并提交。
1 自定义一个类继承,实现其中的方法,没什么好说的。
public classMyLineViewextendsSurfaceView
2 在布局添加你的控件
<com.example.k555l.test.MyLineView
android:id="@+id/mylineview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
3 初始化,实现接口。
MyLineView lineView = (MyLineView) findViewById(R.id.mylineview); holder = lineView.getHolder();//得当前SurfaceView中的surface对应的SurfaceHolder path = new Path(); //路径 holder.addCallback(new SurfaceHolder.Callback() { //添加回调,匿名实现 @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { //绘图代码写在这里Canvas canvas = surfaceHolder.lockCanvas();//锁定画布 canvas.drawColor(Color.WHITE);//画布背景色 surfaceHolder.unlockCanvasAndPost(canvas);
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
//在surface的大小发生改变时激发 }
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
});
4 触摸事件
lineView.setOnTouchListener(newView.OnTouchListener() {
@Override
public booleanonTouch(View view,MotionEvent event) {
floatx = event.getX();
floaty = event.getY();
switch(event.getAction()) {
caseMotionEvent.ACTION_DOWN:
isdrawing=true; //标志设为true;
new DrawThread().start();//开启绘制线程
lastX= x;
lastY= y;
path.moveTo(lastX,lastY);
break;
case MotionEvent.ACTION_UP:
isdrawing=false;//标志设为false
break;
case MotionEvent.ACTION_MOVE:
floatdx = Math.abs(x -lastX);
floatdy = Math.abs(y -lastY);
if (dx>3||dy>3){
path.quadTo((lastX+ x) / 2,(lastY+ y) / 2,x,y);//x1,y1 控制点 x2,y2结束点
}
lastX= x;
lastY= y;
break;
}
return true;
}
});
5 绘图线程
classDrawThreadextendsThread {//绘制线程
CanvasmCanvas;//画布
@Override
public voidrun() {
while(isdrawing) {
Drawing();
}
}
private voidDrawing() {
try{
mCanvas=holder.lockCanvas();//锁定画布
mCanvas.drawColor(Color.WHITE);//画布背景色
Paint paint =newPaint();//定义画笔
paint.setStrokeWidth(15);//画笔粗细
paint.setColor(Color.RED);//画笔颜色
paint.setStyle(Paint.Style.STROKE);//画笔风格 这里是描边
paint.setAntiAlias(true); //抗锯齿
mCanvas.drawPath(path,paint);//绘制
}finally{
holder.unlockCanvasAndPost(mCanvas);//解锁提交画布
}
}
}
----不足之处还请留言指出,谢谢!