android 绘图的一点总结
2014-11-06 17:46
309 查看
第一次写博客啊,可谓是处作。开始学做安卓,好多东西都不会,上网查,才发现,写技术博客这么有用啊,希望以后能经常写,与大家交流。
水平太浅,只能去读别人的代码,在总结。
在写一个视频播放器的时候用到了绘图的surfaceview和SurfaceHolder.Callback等类,经过自己上网查资料,总结了以下的东西
一个绘图文件的分析:
1.建一个活动,在活动中去启动绘图类
2.绘图类中要引用 SurfaceHolder类 private surfaceholder suf。绘图类要继承surfaceview类,这时需要重写构造器,在构造器中用 suf = this.getHolder()得到实例对象;为对象添加回调方法,上下文是自己, suf.addCallback(this);这时绘画类又要去实现SurfaceHolder.Callback的接口方法;三个回调方法
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
具体的绘图行为在surfaceCreated方法中起一个线程去实现,要想实现图片的切换可以在这些方法的外面写一个函数,在线程里去调用这个方法;
我们要绘画实际是在surface中去绘制,surface提供了画布canvas,画图实质是调用了画布的方法再加一个自己实现的画笔(可绘文字,可绘图片,等);而我们要去操作画布就得需要surface,而对surface的操作是由SurfaceHolder对象完成的,这就需要调用surfaceview的getholder方法得到一个SurfaceHolder的对象,经过这些复杂的关系:
可以得到以下的代码:
//#########画布锁上后去绘画,解锁后,图像才会显示出来
public class Suu extends SurfaceView implements SurfaceHolder.Callback {
public Suu(Surfaceview_testActivity sp) {
super(sp);
t
4000
his.sb = sp;
// TODO Auto-generated constructor stub
// 通过SurfaceView获得SurfaceHolder对象
suf = this.getHolder();
Log.i("new", "getholder");
// 为SurfaceHolder添加回调结构SurfaceHolder.Callback
suf.addCallback(this);
Log.i("new", "添加回调函数");
}
Surfaceview_testActivity sb;//本类中包含了活动类,资源文件属于活动类的
private String str = "hello";
private SurfaceHolder suf;
private Boolean flag;
private int counter;
private Canvas canvas;
Bitmap[] bt = new Bitmap[1];//bitmap数组,不能单用
//按back键时会返回异常,activity虽然退出,但线程仍然在执行画图,所以就出问题了
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
Log.i(str, "surfaceChanged");
}
// public void lo(){
// Log.i("", "########$$");//线程体内可以调用此方法,这样就能实现动画效果了
// }
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
Log.i(str, "surfaceCreated");
counter = 0;
flag = true;
new Thread(){
public void run() {
while (flag) {
// 锁定画布,得到Canvas对象
canvas = suf.lockCanvas();
// 设定Canvas对象的背景颜色
canvas.drawColor(Color.BLUE);
// 创建画笔
Paint p = new Paint();
// 设置画笔颜色
p.setColor(Color.YELLOW);
// 设置文字大小
p.setTextSize(40);
// 创建一个Rect对象rect __-_-位置参数的对象
// public Rect (int left, int top, int right, int bottom)
Rect rect = new Rect(100, 50, 400, 350);
// 在canvas上绘制rect
canvas.drawRect(rect, p);
// 在canvas上显示时间
// public void drawText (String text, float x, float y, Paint
// paint)
canvas.drawText("时间 = " + (counter++) + " 秒", 500, 200, p);
// lo();可以调用外部方法的哦
bt[0]= BitmapFactory.decodeResource(sb.getResources(), R.drawable.ic_launcher);
// canvas.drawBitmap(bitmap, left, top, paint)
canvas.drawBitmap(bt[0], 500,200, p);
if (canvas != null) {
// 解除锁定,并提交修改内容,更新屏幕
//画布用过了,就解锁
// for(int i = 0;i<20;i++){
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// Log.i("", "**"+i);
// }
suf.unlockCanvasAndPost(canvas);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start() ;
}
//函数中加上结束线程标记即
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
Log.i(str, "surfaceDESTORY");
}
}
1> 所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。渲染线程所要访问的各种变量应该作同步处理。
2> 由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的surface。
2.SurfaceHolder
显示一个surface的抽象接口,使你可以控制surface的大小和格式, 以及在surface上编辑像素,和监视surace的改变。这个接口通常通过SurfaceView类实现。
3. SurfaceHolder.Callback
用户可以实现此接口接收surface变化的消息。当用在一个SurfaceView 中时, 它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之间有效。设置Callback的方法是SurfaceHolder.addCallback.
水平太浅,只能去读别人的代码,在总结。
在写一个视频播放器的时候用到了绘图的surfaceview和SurfaceHolder.Callback等类,经过自己上网查资料,总结了以下的东西
一个绘图文件的分析:
1.建一个活动,在活动中去启动绘图类
2.绘图类中要引用 SurfaceHolder类 private surfaceholder suf。绘图类要继承surfaceview类,这时需要重写构造器,在构造器中用 suf = this.getHolder()得到实例对象;为对象添加回调方法,上下文是自己, suf.addCallback(this);这时绘画类又要去实现SurfaceHolder.Callback的接口方法;三个回调方法
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
具体的绘图行为在surfaceCreated方法中起一个线程去实现,要想实现图片的切换可以在这些方法的外面写一个函数,在线程里去调用这个方法;
我们要绘画实际是在surface中去绘制,surface提供了画布canvas,画图实质是调用了画布的方法再加一个自己实现的画笔(可绘文字,可绘图片,等);而我们要去操作画布就得需要surface,而对surface的操作是由SurfaceHolder对象完成的,这就需要调用surfaceview的getholder方法得到一个SurfaceHolder的对象,经过这些复杂的关系:
可以得到以下的代码:
//#########画布锁上后去绘画,解锁后,图像才会显示出来
public class Suu extends SurfaceView implements SurfaceHolder.Callback {
public Suu(Surfaceview_testActivity sp) {
super(sp);
t
4000
his.sb = sp;
// TODO Auto-generated constructor stub
// 通过SurfaceView获得SurfaceHolder对象
suf = this.getHolder();
Log.i("new", "getholder");
// 为SurfaceHolder添加回调结构SurfaceHolder.Callback
suf.addCallback(this);
Log.i("new", "添加回调函数");
}
Surfaceview_testActivity sb;//本类中包含了活动类,资源文件属于活动类的
private String str = "hello";
private SurfaceHolder suf;
private Boolean flag;
private int counter;
private Canvas canvas;
Bitmap[] bt = new Bitmap[1];//bitmap数组,不能单用
//按back键时会返回异常,activity虽然退出,但线程仍然在执行画图,所以就出问题了
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
Log.i(str, "surfaceChanged");
}
// public void lo(){
// Log.i("", "########$$");//线程体内可以调用此方法,这样就能实现动画效果了
// }
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
Log.i(str, "surfaceCreated");
counter = 0;
flag = true;
new Thread(){
public void run() {
while (flag) {
// 锁定画布,得到Canvas对象
canvas = suf.lockCanvas();
// 设定Canvas对象的背景颜色
canvas.drawColor(Color.BLUE);
// 创建画笔
Paint p = new Paint();
// 设置画笔颜色
p.setColor(Color.YELLOW);
// 设置文字大小
p.setTextSize(40);
// 创建一个Rect对象rect __-_-位置参数的对象
// public Rect (int left, int top, int right, int bottom)
Rect rect = new Rect(100, 50, 400, 350);
// 在canvas上绘制rect
canvas.drawRect(rect, p);
// 在canvas上显示时间
// public void drawText (String text, float x, float y, Paint
// paint)
canvas.drawText("时间 = " + (counter++) + " 秒", 500, 200, p);
// lo();可以调用外部方法的哦
bt[0]= BitmapFactory.decodeResource(sb.getResources(), R.drawable.ic_launcher);
// canvas.drawBitmap(bitmap, left, top, paint)
canvas.drawBitmap(bt[0], 500,200, p);
if (canvas != null) {
// 解除锁定,并提交修改内容,更新屏幕
//画布用过了,就解锁
// for(int i = 0;i<20;i++){
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// Log.i("", "**"+i);
// }
suf.unlockCanvasAndPost(canvas);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start() ;
}
//函数中加上结束线程标记即
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
Log.i(str, "surfaceDESTORY");
}
}
1> 所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。渲染线程所要访问的各种变量应该作同步处理。
2> 由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的surface。
2.SurfaceHolder
显示一个surface的抽象接口,使你可以控制surface的大小和格式, 以及在surface上编辑像素,和监视surace的改变。这个接口通常通过SurfaceView类实现。
3. SurfaceHolder.Callback
用户可以实现此接口接收surface变化的消息。当用在一个SurfaceView 中时, 它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之间有效。设置Callback的方法是SurfaceHolder.addCallback.
相关文章推荐
- android开发的一点小总结,小杂言,小记录
- Android 的一点总结
- drawRect:一点绘图知识总结
- 黑马程序员------Android自学的一点总结
- Android - View绘图原理总结
- Android绘图具体应用方式总结
- Android绘图总结(Bitmap,Canvas,Paint,圆角)
- android源码编译apk的一点小总结
- 学习android过程的一点总结
- 图像处理(基于android)---滤镜实现的一点看法和总结
- android 2D绘图总结1
- android学习之绘图总结
- android学习之绘图总结
- Android - View绘图原理总结
- android学习之绘图总结
- android源码编译apk的一点小总结
- 近期找工作的一点总结 Android
- android图像绘制(七)ClipRect局部绘图/切割原图绘制总结
- Android - View绘图原理总结
- 关于新建android项目时 appcompat_v7报错问题的一点总结