Android SurfaceView学习示例
16lz
2021-01-23
View,是Android的一个超类,这个类几乎包含了所有的屏幕类型。每一个View都有一个用于绘图的画布,这个画布可以进行任意扩展。
在游戏开发中叶可以自定义视图(View),这个画布的功能更能满足我们在游戏开发中的需要。在Android中,任何一个View类都只需重写onDraw 方法来实现界面显示,自定义的视图可以是复杂的3D实现,也可以是非常简单的文本形式等。
游戏的核心是不断地绘图和刷新界面,Android中提供了 invalidate 方法来实现界面刷新。注意,invalidate 不能直接在线程中调用, 就是不可以在子线程中调用,因此它违背了 Android的单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI 线程中执行,因此Android中最常用的方法就是利用Handler来实现UI线程的更新。 其实用 AsyncTask 也可以。
具体示例:
Activity:
[java] view plain copy print ?- publicclassActivity01extendsActivity{
- privatestaticfinalStringTAG="mThread";
- privatestaticfinalintREFRESH=0x000001;
- privateGameViewmGameView=null;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- this.mGameView=newGameView(this);
- mGameView.x=320.0f;
- mGameView.y=120.0f;
- setContentView(mGameView);
- newThread(newGameThread()).start();
- }
- HandlermyHandler=newHandler(){
- @Override
- publicvoidhandleMessage(Messagemsg){
- switch(msg.what){
- caseActivity01.REFRESH:
- mGameView.invalidate();//repaintView
- break;
- }
- super.handleMessage(msg);
- }
- };
- classGameThreadimplementsRunnable{
- @Override
- publicvoidrun(){
- while(!Thread.currentThread().isInterrupted()){
- Messagemessage=newMessage();
- message.what=Activity01.REFRESH;
- Activity01.this.myHandler.sendMessage(message);
- try{
- Thread.sleep(1000);
- }catch(InterruptedExceptione){
- Thread.currentThread().interrupt();
- }
- }
- }
- }
- @Override
- publicbooleanonTouchEvent(MotionEventevent){
- if(event.getAction()==MotionEvent.ACTION_DOWN){
- mGameView.x=event.getX();
- mGameView.y=event.getY();
- }
- returntrue;
- }
- @Override
- publicbooleanonKeyDown(intkeyCode,KeyEventevent){
- if(keyCode==KeyEvent.KEYCODE_BACK){
- this.finish();
- }
- returntrue;
- }
- }
gameview
- publicclassGameViewextendsView{
- intcount=0;
- floatx=0,y=0;
- publicGameView(Contextcontext){
- super(context);
- }
- publicvoidonDraw(Canvascanvas){
- if(count<100){
- count++;
- }else{
- count=0;
- }
- PaintmPaint=newPaint();
- switch(count%4){
- case0:
- mPaint.setColor(Color.BLUE);
- break;
- case1:
- mPaint.setColor(Color.GREEN);
- break;
- case2:
- mPaint.setColor(Color.RED);
- break;
- case3:
- mPaint.setColor(Color.YELLOW);
- break;
- default:
- mPaint.setColor(Color.WHITE);
- break;
- }
- canvas.drawRect(x-40,y-20,x+40,y+20,mPaint);
- }
- }
运行效果:
更多信息请查看java进阶网http://www.javady.com
更多相关文章
- android系统中的多线程(一): 关于在android中启动线程以及线程间
- Android开发实践:基于命令模式的异步任务线程
- 学习Android线程模型解析(包括UI的更新)
- 让我们一起来做最漂亮的Android界面
- Android Studio——为什么说android UI操作不是线程安全的
- Android中Handler的使用方法——在子线程中更新界面
- android 使用asynctask结合fragment更新UI(另附线程池管理示例)