一个很基础的surfaceView使用
来源:互联网 发布:sql注入语句示例大全 编辑:程序博客网 时间:2024/05/18 10:06
surfaceView可以用来自定义view,与view的区别是:view是在主线程绘制的,如果cpu垃圾或者计算量大,超过16MS的刷新频率,页面就GG。对于surfaceview,他的绘制是在子线程进行的。
一个简单的demo,surfaceview的简单使用:
1.跟自定义view一样,继承surfaceview。然后拿到重要的surfaceviewHolder和该surfaceview的canvas,然后画笔paint和自定义view一样,自己新建
public class MySurfaceView extends SurfaceView { public SurfaceHolder surfaceHolder; public Canvas canvas; public boolean CanDraw; public MySurfaceView(Context context) { super(context); } public MySurfaceView(Context context, AttributeSet attrs) { super(context, attrs); surfaceHolder = getHolder(); surfaceHolder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(final SurfaceHolder surfaceHolder) { CanDraw = true; //当创建完成,就开始绘制//开始绘制 new Thread() { @Override public void run() { //拿到画布 canvas = surfaceHolder.lockCanvas(); //清屏操作, canvas.drawColor(Color.WHITE); Paint paint = new Paint(); //抗锯齿 paint.setAntiAlias(true); //FC3C39 paint.setColor(Color.parseColor("#00ffff")); paint.setStrokeWidth((float) 20.0); canvas.drawLine(0, 0, 100, 100, paint); //提交所做的修改 surfaceHolder.unlockCanvasAndPost(canvas); } }.start(); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { CanDraw = false; } }); } public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); }}
2.在主线程中通过新开子线程去操作surfaceview的绘制。
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //点击按钮之后,重新画一根线 new Thread() { @Override public void run() { if(surfaceView.CanDraw){ //此时canvas没有被销毁,还可以绘制,当走到surfaceDestroyed时,surfaceViewHolder就销毁了 surfaceView.canvas = surfaceView.surfaceHolder.lockCanvas(); //清屏操作, surfaceView.canvas.drawColor(Color.WHITE); Paint paint = new Paint(); //抗锯齿 paint.setAntiAlias(true); //FC3C39 paint.setColor(Color.parseColor("#00ffff")); paint.setStrokeWidth((float) 20.0); Random random = new Random(); surfaceView.canvas.drawLine(random.nextInt(10)*10, 0, 500, 500, paint); //提交所做的修改 surfaceView.surfaceHolder.unlockCanvasAndPost(surfaceView.canvas); }else { Toast.makeText(MainActivity.this,"surfaceviewHolder已经被销毁",Toast.LENGTH_SHORT).show(); } } }.start(); }
阅读全文
0 0
- 一个很基础的surfaceView使用
- SurfaceView的使用基础
- SurfaceView--扩展SurfaceView的基础模版代码
- 如何去使用一个SurfaceView
- 使用 SurfaceView 实现一个下雨的天气效果
- SurfaceView的基本使用
- Android的SurfaceView使用
- SurfaceView的基本使用
- SurfaceView的简单使用
- SurfaceView的基本使用
- SurfaceView的使用实例
- surfaceview的使用
- SurfaceView的基本使用
- surfaceView的使用
- Android的SurfaceView使用
- SurfaceView的基本使用
- SurfaceView的使用
- SurfaceView的使用
- mmp c%s%d%n%
- uwp 简单尝试计算器
- PPT控件Spire.Presentation 教程:在PPT中设置表行高度和列宽度
- Linux下编译原理
- spring boot中使用generator插件自动生成代码
- 一个很基础的surfaceView使用
- Python接口测试之moco(八)
- 自定义 非常好用水平进度条工具类
- 排序
- 算法学习记录七(C++)--->二分法找有序旋转数组最小值
- Floyd+Bellman-ford求正环 hdu1317 XYZZY
- Lucene(三)索引域选项
- 二叉树
- MongoDB 数据同步至 ElasticSearch (Mongo-connector)