Android SurfaceView绘制
2013-09-27 16:02
295 查看
MainActivity 作为主界面,平时的Android工程用Layout作为mainActivity的界面布局,这里用SurfaceView 来绘制界面作为界面显示。
在MainActivity中通过 this.setContentView(gameView); 设置SurfaceView为主界面显示。
MainActivity源码:
如何设置为全屏,横屏?
这里引用了MySurfaceView来创建一个SurfaceView作为mainAcvity界面显示。
MySurfaceView是继承自SurfaceView的,并且实现了 SurfaceHolder.Callback 接口。
在MySurfaceView中画了一张图片。
在SurfaceView 构造器内,设置了可点击、获取焦点、
在SurfaceView创建之时,创建了画笔,打开抗锯齿。然后加载图片资源、创建绘制线程、开始绘制。
进入到 DrawThread 线程绘制 。
通过一个while循环,不停的执行gameView.onDraw() 来绘执行SurfaceView的onDraw()进行界面绘制。并且设置睡眠100ms。
在MainActivity中通过 this.setContentView(gameView); 设置SurfaceView为主界面显示。
MainActivity源码:
package com.example.surfaceview; import android.os.Bundle; import android.app.Activity; import android.content.pm.ActivityInfo; import android.view.Menu; import android.view.Window; import android.view.WindowManager; public class MainActivity extends Activity { MySurfaceView gameView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); gameView=new MySurfaceView(this); this.setContentView(gameView); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
如何设置为全屏,横屏?
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
gameView=new MySurfaceView(this);
这里引用了MySurfaceView来创建一个SurfaceView作为mainAcvity界面显示。
MySurfaceView是继承自SurfaceView的,并且实现了 SurfaceHolder.Callback 接口。
在MySurfaceView中画了一张图片。
package com.example.surfaceview; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.view.SurfaceHolder; import android.view.SurfaceView; //implements实现接口 //extends 继承类 public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { MainActivity activity; //activity 引用 Paint paint; //画笔引用 DrawThread drawThread; //绘制线程引用 Bitmap bgBmp; //背景图片 Bitmap bulletBmp; //炮弹位图 public MySurfaceView(MainActivity activity) { super(activity); this.activity = activity; this.requestFocus(); //获取焦点 this.setFocusableInTouchMode(true); //设置为可触控 getHolder().addCallback(this); //注册回调接口 } @Override protected void onDraw(Canvas canvas) //绘制界面 { super.onDraw(canvas); canvas.drawBitmap(bgBmp, 0, 0,paint); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub paint=new Paint(); //创建画笔 paint.setAntiAlias(true); //打开抗锯齿 bgBmp=BitmapFactory.decodeResource(this.getResources(), R.drawable.lol); drawThread = new DrawThread(this);//创建绘制线程 drawThread.start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub drawThread.setFlag(false); //停止绘制 } }
在SurfaceView 构造器内,设置了可点击、获取焦点、
在SurfaceView创建之时,创建了画笔,打开抗锯齿。然后加载图片资源、创建绘制线程、开始绘制。
进入到 DrawThread 线程绘制 。
package com.example.surfaceview; import android.R.integer; import android.graphics.Canvas; import android.view.SurfaceHolder; public class DrawThread extends Thread { private boolean flag=true; private int sleepSpan = 100; MySurfaceView gameView; //父界面引用 SurfaceHolder surfaceHolder; //surfaceHolder引用 public DrawThread(MySurfaceView gameView) { this.gameView = gameView; this.surfaceHolder = gameView.getHolder(); // } public void run() { Canvas canvas; while(this.flag) { canvas=null; try { canvas=this.surfaceHolder.lockCanvas(null);//锁定画布 synchronized (this.surfaceHolder) { gameView.onDraw(canvas); } } finally { if(canvas!=null) { this.surfaceHolder.unlockCanvasAndPost(canvas); //释放锁 } } try { Thread.sleep(sleepSpan); //线程指定休眠 } catch (Exception e) { // TODO: handle exception e.printStackTrace(); //打印错误堆栈信息 } } } public void setFlag(boolean flag) //设置工作标志位的方法 { this.flag=flag; } }
通过一个while循环,不停的执行gameView.onDraw() 来绘执行SurfaceView的onDraw()进行界面绘制。并且设置睡眠100ms。
相关文章推荐
- Android: 利用SurfaceView绘制股票滑动直线解决延迟问题
- Android: 利用SurfaceView绘制股票滑动直线解决延迟问题
- Android UI SurfaceView的使用-绘制单个图型或多个图形
- Android SurfaceView绘制组合图形
- android SurfaceView绘制 重新学习--控制动画移动
- android游戏开发初学之SurfaceView绘制界面
- Android UI SurfaceView的使用-绘制组合图型,并使其移动
- android SurfaceView绘制实现原理解析
- android--(绘制几何图形、图片、surfaceView)
- Android: 利用SurfaceView绘制股票滑动直线解决延迟问题
- Android UI SurfaceView的使用-绘制单个图型或多个图形
- Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView)
- Android隐喻(三) 图形绘制: Canvas、SurfaceView、Paint、Surface、SurfaceHolder、Bitmap
- android图像绘制(四)——SurfaceView问题,自定义控件
- Android UI SurfaceView的使用-绘制单个图型或多个图形
- Android中使用SurfaceView和Canvas来绘制动画
- Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整(原理:底层SurfaceView+上层绘制ImageView)
- 【Android】SurfaceView中使用线程绘制图形
- Android开发:SurfaceView上新建线程绘制旋转图片 及 刷新特定区域(脏矩形)
- 容易忽视的问题之:surfaceview绘制兼容性(android 4.3 libskia.so libui.so crash)