博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android中SurfaceView组件使用解析
阅读量:6972 次
发布时间:2019-06-27

本文共 3723 字,大约阅读时间需要 12 分钟。

hot3.png

SurfaceView组件可以实现高效率的绘制二维图或者显示图像,在游戏开发中经常用到。在android中,已经提供了SurfaceView组件。使用时,一般是通过继承的方法实现自定义surfaceView,也可以在MainActivity中通过接口surfaceHolder.callback接口实现,这里介绍通过接口实现surfaceView绘图,当然,绘图可以是静态图(在指定区域只绘制一次),也可以是动态图(指定区域-->绘制-->再循环)。

SurfaceView组件的使用流程:通过findViewById()实例化SurfaceView组件,得到实例化对象;利用getHolder()方法得到SurfaceViewHolder类对象,为该对象添加callBack(Context context)回调;在surfaceCreate()方法中添加surfaceView刚显示的初始化代码,这个方法在实例化SurfaceView组件时执行,比如可以初始化背景颜色,绘图区显示出的形状、坐标等;surfaceChanged()方法主要是在surfaceView对象大小、形状改变时调用;surfaceDestroyed()方法是在surfaceView销毁时调用,一般是添加kill代码。

在SurfaceView组件显示区域上,实现绘制二维图形需要三个类:Paint、Canvas和SurfaceHolder类。其中Paint类指的是画笔,可以设置画笔的颜色(类似于红笔芯还是蓝笔芯),画笔显示的线宽(类似于0.35mm还是0.5mm)等;Canvas类相当于画布,它通过SurfaceHolder类中的lockCanvas()方法获得,这个lockCanvas()方法可以带有参数,用来指定锁定画布的区域(也就是说,画布锁定的区域不一定是surfaceView定义的全部区域,也可以是参数指定的部分区域),当锁定了区域之后,就可以通过Canvas类实例对象所提供的方法来绘制点、线、圆、矩形、图像等,这些方法中的参数一般会有Paint类对象。

需要注意的一点是,在锁定画布区域进行绘制图形或者图像的代码,一般是开一个独立线程进行的,这个线程可以在surfaceCreate()方法中开启。

唉,图片加不上去,只能贴代码了。

package com.main.dfa_surfaceview; import android.support.v7.app.ActionBarActivity;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.os.Bundle;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast; public class MainActivity extends ActionBarActivity implements SurfaceHolder.Callback {    Button btn1=null;    SurfaceView sfc=null;    SurfaceHolder holder=null;    Paint paint_one=null;    Paint paint_two=null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                 btn1=(Button)findViewById(R.id.btn1);        sfc=(SurfaceView)findViewById(R.id.surfaceView1);        holder=sfc.getHolder(); //得到surfaceView的holder,类似于surfaceView的控制器        holder.addCallback(this);                paint_one=new Paint(); //获取画笔实例        paint_two=new Paint();        paint_one.setColor(Color.BLUE); //画笔颜色        paint_two.setColor(Color.GREEN);        paint_one.setStrokeWidth(20); //设置线宽        paint_two.setStrokeWidth(10);         btn1.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View arg0) {                // TODO Auto-generated method stub                Toast.makeText(MainActivity.this, "asdgdsgas", Toast.LENGTH_SHORT).show();                MyThread mthread=new MyThread();                mthread.start();            }        });           }    @Override    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {        // TODO Auto-generated method stub            }    @Override    public void surfaceCreated(SurfaceHolder arg0) {        // TODO Auto-generated method stub        //当surfaceView创建的时候执行        init_background();//初始化绘图界面    }    @Override    public void surfaceDestroyed(SurfaceHolder arg0) {        // TODO Auto-generated method stub            }        private void init_background(){        Canvas canvas=null;        canvas=holder.lockCanvas();//获取目标画图区域        canvas.drawColor(Color.RED);//画布背景颜色           holder.unlockCanvasAndPost(canvas); //解除锁定并显示     }         private class MyThread extends Thread{                public void run(){            Canvas canvas=null;            canvas=holder.lockCanvas();//获取目标画图区域,无参数表示锁定的是全部绘图区            canvas.drawColor(Color.RED);//画布背景颜色设置            canvas.drawCircle(100, 100, 50, paint_one);//以(100,100)为圆心,画一个半径为50像素的圆            canvas.drawCircle(50, 50, 50, paint_two);            holder.unlockCanvasAndPost(canvas); //解除锁定并显示         }       }}

转载于:https://my.oschina.net/u/2243176/blog/355711

你可能感兴趣的文章
zoj 1597 Circular Area
查看>>
v-solt插槽
查看>>
OCM_第六天课程:Section3 —》数据库可用性
查看>>
ORA-00257 archiver error. 错误的处理方法
查看>>
开发Servlet的方法(2)
查看>>
Apache mod_wsgi部署Django项目
查看>>
玲珑杯#20 C 漆黑的太阳——莫队
查看>>
MySQL数据库建立外键失败的原因总结
查看>>
网络资源收集工具编码规范
查看>>
ZOJ3778 Talented Chef(贪心)
查看>>
iOS上的反射用法
查看>>
CF1072A Palindromic Twist 思维
查看>>
Leetcode c语言-Permutations
查看>>
《javascript设计模式》阅读笔记
查看>>
JQuery基础总结上
查看>>
postgresql 备份
查看>>
Cocos2d-x调用Java 代码
查看>>
close方法
查看>>
如何为crontab调度运行的多脚本设置共享的环境变量?
查看>>
bash字符串匹配
查看>>