SurfaceView的经典写法

来源:互联网 发布:外国人在淘宝买东西吗 编辑:程序博客网 时间:2024/06/05 06:58
package com.example.test;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;/** * 继承SurfaceView * 实现SurfaceHolder.Callback,给SurfaceHolder用的 * 创建SurfaceHolder,并addCallback,SurfaceView的一切都有SurfaceHolder控制 */public class MySurfaceView extends SurfaceView implements Callback, Runnable {//SurfaceView基本private SurfaceHolder sfh;//操控SurfaceViewprivate Paint p;private Canvas c;//线程private Thread t;private boolean flag;//数据private int screenW, screenH;private int xx = 100, yy = 100;public MySurfaceView(Context context) {super(context);sfh = this.getHolder();sfh.addCallback(this);p = new Paint();p.setColor(Color.RED);}@Overridepublic boolean onTouchEvent(MotionEvent event) {xx = (int) event.getX();yy = (int) event.getY();return true;}public void myDraw() {try {//当SurfaceView不可编辑或尚未创建,会返回nullc = sfh.lockCanvas();if(c != null) {c.drawColor(Color.GREEN);//刷屏c.drawText("me", xx, yy, p);//画}} catch(Exception e) {} finally {if(c != null) {sfh.unlockCanvasAndPost(c);}}}//游戏逻辑public void logic() {}@Overridepublic void surfaceCreated(SurfaceHolder holder) {screenW = this.getWidth();screenH = this.getHeight();//线程的初始化和启动都写在create里面flag = true;t = new Thread(this);t.start();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {flag = false;}@Overridepublic void run() {while (flag) {//刷屏时间保持一致//一般会在10~20帧左右//每秒20帧:1000ms/20=50ms每帧long start = System.currentTimeMillis();myDraw();logic();long end = System.currentTimeMillis();try {if(end - start < 50) {Thread.sleep(50 - (end-start));}} catch (InterruptedException e) {e.printStackTrace();}}}}

SurfaceView的生命周期:



2 1
原创粉丝点击