ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

SurfaceView杂记,来自阿里巴巴佛系Android程序员的指南

2022-01-14 14:58:11  阅读:199  来源: 互联网

标签:canvas paint 佛系 Canvas Surface SurfaceView SurfaceHolder Android


/**

  • 继承SurfaceView类并实现SurfaceHolder.Callback接口就可以实现一个自定义的SurfaceView了,SurfaceHolder.Callback在底层的Surface状态发生变化的时候通知View

*/

public class MySurfaceView extends SurfaceView implements Callback, Runnable {

/** Called when the activity is first created. */

private SurfaceHolder sfh;

private Thread th;

private Canvas
canvas;

private Paint paint;

private int ScreenW, ScreenH;

public MySurfaceView(Context context) {

super(context);

th = new Thread(this);

sfh = this.getHolder();//通过SurfaceView的getHolder()函数可以获取SurfaceHolder对象,Surface 就在SurfaceHolder对象内。SurfaceView不会直接地处理Surface对象,必须通过SurfaceHolder来处理。因此当创建一个SurfaceView时,必须调用getHolder来取得SurfaceHolder。由辅助线程来描绘Surface。

sfh.addCallback(this); // 添加一个回调函数;执行完成后,马上就会回调 surfaceCreated方法了 然后开启线程 执行绘图方法这里这个执行顺序要搞清楚

paint = new Paint();

paint.setAntiAlias(true);

paint.setColor(Color.RED);

paint.setTextSize(16);

this.setKeepScreenOn(true);// 保持屏幕常亮

}

@Override

public void startAnimation(Animation animation) {

super.startAnimation(animation);

}

/**

  • 当Surface第一次创建后会立即调用该函数。程序可以在该函数中做些和绘制界面相关的初始化工作,一般情况下都是在另外的线程来绘制界面,所以不要在这个函数中绘制Surface。

*/

public void surfaceCreated(SurfaceHolder holder) {

ScreenW = this.getWidth();// 备注2

ScreenH = this.getHeight();

th.start();

}

//绘图方法  注意这里是另起一个线程来执行绘图方法了不是在UI 线程了

private void draw() {

try {

//在 unlockCanvas() 和 lockCanvas()中Surface的内容是不缓存的,所以需要完全重绘Surface的内容,为了提高效率只重绘变化的部分则可以调用lockCanvas(Rect dirty)函数来指定一个dirty区域,这样该区域外的内容会缓存起来。

canvas = sfh.lockCanvas(); // 得到一个canvas实例,由SurfaceHolder的Canvas lockCanvas()或则Canvas lockCanvas(Rect dirty)函数来获取Canvas对象,但是在上面的画图是不会缓存的

canvas.drawColor(Color.WHITE);// 刷屏;

paint.setColor(Color.BLUE);

Bitmap bitmap = ((BitmapDrawable)(getResources().getDrawable(R.drawable.icon))).getBitmap();

Rect r = new Rect(20, 20, 20, 100);

canvas.drawBitmap(bitmap, DRAWING_CACHE_QUALITY_AUTO, DRAWING_CACHE_QUALITY_AUTO, paint);

} catch (Exception ex) {

} finally { // 备注3

if (canvas != null)

//当在Canvas中绘制完成后,调用函数unlockCanvasAndPost(Canvas canvas)来通知系统Surface已经绘制完成,这样系统会把绘制完的内容显示出来。

sfh.unlockCanvasAndPost(canvas);

}

}

public void run() {

while (true) {

draw();

try {

Thread.sleep(100);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

Thread.sleep(100);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

标签:canvas,paint,佛系,Canvas,Surface,SurfaceView,SurfaceHolder,Android
来源: https://blog.csdn.net/sa3221sa/article/details/122494541

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有