Android SurfaceView onDraw()绘图问题

原创 2012年06月29日 11:32:20

 

在继承SurfaceView的类中即使重写了onDraw()方法也是没有用的,因为SurfaceView虽然继承自View,但并没
重写onDraw(),其子类可以重写onDraw()但并不能自动调用。
解决办法:
首先SurfaceView的子类XXX要 implements SurfaceHolder.Callback,然后定义private SurfaceHolder sh = null;
在其构造函数中:
public XXX(Context context, AttributeSet attrs) {
     super(context, attrs);
     // TODO Auto-generated constructor stub
        sh = getHolder();
        sh.addCallback(this);
}
//自定义绘制函数
public void doDraw(){
    Paint p = new Paint(); // 笔触
    p.setAntiAlias(true); // 反锯齿
    p.setColor(Color.RED);
    p.setStyle(Style.STROKE);
    Canvas canvas = sh.lockCanvas();
    canvas.drawColor(Color.WHITE);//背景
    canvas.drawRect(10, 10, 100, 100, p);  
    sh.unlockCanvasAndPost(canvas); //提交绘制内容

}
在需要绘制的地方调用doDraw()即可。
//继承自view的onDraw方法
@Override
 protected void onDraw(Canvas canvas) {
  // TODO Auto-generated method stub
      super.onDraw(canvas);
      Paint p = new Paint(); // 笔触
      p.setAntiAlias(true); // 反锯齿
      p.setColor(Color.RED);
      p.setStyle(Style.STROKE);
      canvas = sh.lockCanvas();
      canvas.drawColor(Color.WHITE);//背景色
      canvas.drawRect(10, 10, 200, 200, p); 
      sh.unlockCanvasAndPost(canvas); //提交绘制内容
 }
在需要绘制的地方调用onDraw(null)即可。
注:重写SurfaceView的draw(),最终还是调用的onDraw(),但是调用draw(null)时会有异常。

 

 

 

 

 

 

 

 

 

 

SurfaceView onDraw()方法问题

View的onDraw函数是protected的。protected 表明被它修饰的成员变量为保护类型,在同一个包里和 public 类型是一样的,也是能够访问到的。但是如果在不同包里的 protec...
  • qiuxiaolong007
  • qiuxiaolong007
  • 2011年07月03日 10:47
  • 3660

在继承SurfaceView的类中如何重写onDraw()方法使其有效

在项目中遇到画一个类似于扫面二维码的界面效果,中间的框为了让客户去对准需要拍摄的点。 一开始觉得很简单,本来这个拍摄照片的就是个自定义的控件继承了SurfaceView,觉得只要在onDraw函数里...
  • xiangwang666
  • xiangwang666
  • 2016年03月08日 10:08
  • 1119

Android中SurfaceView的使用详解

通过之前介绍的如何自定义View, 我们知道使用它可以做一些简单的动画效果。它通过不断循环的执行View.onDraw方法,每次执行都对内部显示的图形做一些调整,我们假设 onDraw方法每秒执行...
  • Listening_music
  • Listening_music
  • 2011年10月10日 22:05
  • 39970

【android 使用两个surfaceview 在摄像机画面上绘图】

使用双surface,将第一个设置为透明背景,在摄像机上绘制图像,纠结搞了一天。 其中参考了http://blog.csdn.net/yanzi1225627/article/details/793...
  • Jesse__Zhong
  • Jesse__Zhong
  • 2014年05月03日 21:03
  • 9487

Android中SurfaceView使用详解

1.什么是SurfaceView?     Surface意为表层、表面,顾名思义SurfaceView就是指一个在表层的View对象。为什么说是在表层呢,这是因为它有点特殊跟其他View不一样,其...
  • android_cmos
  • android_cmos
  • 2017年04月03日 12:54
  • 780

初学Android,图形图像之使用SurfaceView(三十九)

SurfaceView支持双缓冲,在实现游戏绘图上面比View更出色它有几个重要方法Canvas lockCanvas(): 锁定整个SurfaceView对象,获取该Surface上的CanvasC...
  • lee576
  • lee576
  • 2012年09月04日 16:59
  • 6267

Android SurfaceView的绘制详解

在Android系统中,有一种特殊的视图,称为SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面。由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独...
  • aa841538513
  • aa841538513
  • 2016年08月23日 11:51
  • 6433

Android双SurfaceView实现底部拍照,顶部绘图

当SurfaceHolder对象的类型设置为SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS时就只能拍照不能绘制了。 为了既能通过SurfaceView拍照又能在上面绘...
  • xinzheng_wang
  • xinzheng_wang
  • 2012年07月04日 10:36
  • 16604

SurfaceView 实现高性能的绘制

先说说自定义 View 绘图机制的缺陷: 1. View 缺乏双缓冲机制; 2. 当程序需要更新 View 上的图片时,程序必须重绘 View 上显示的整张图片; 3. 新线程无法直接更新 Vi...
  • antimage08
  • antimage08
  • 2015年12月27日 10:45
  • 2059

Android开发:SurfaceView上新建线程绘制旋转图片 及 刷新特定区域(脏矩形)

何为脏矩形?比如surfaceview上绘制旋转图片的时候,只刷新一个特定的矩形区域就可以了。这个矩形区域就是脏矩形。在surfaceview上  canvas = holder.lockCanvas...
  • yanzi1225627
  • yanzi1225627
  • 2013年02月15日 09:47
  • 20073
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android SurfaceView onDraw()绘图问题
举报原因:
原因补充:

(最多只允许输入30个字)