SurfaceView模板

MainSV.java

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.SurfaceView;

/**
 * Created by TPEC on 2016/8/25.
 */
public class MainSV extends SurfaceView implements SurfaceHolder.Callback,Runnable {
    private SurfaceHolder sh;
    private Thread th;
    private boolean flag;
    private Canvas canvas;
    private Paint paint;
    private int FPS;

    private boolean scaleToWidth;
    private float scaleRate,scaleTrans;

    public MainSV(Context context) {
        super(context);
        sh=this.getHolder();
        sh.addCallback(this);
        scaleRate=1;
        scaleTrans=0;
        scaleToWidth=true;
        paint=new Paint();
        paint.setTextSize(32);
        paint.setColor(Color.WHITE);
    }

    private void drawSV(){
        try{
            canvas=sh.lockCanvas();
            if(canvas!=null){
                canvas.save();
                canvas.scale(scaleRate,scaleRate);
                if(scaleToWidth)
                    canvas.translate(0,scaleTrans);
                else
                    canvas.translate(scaleTrans,0);

                canvas.drawColor(Color.YELLOW);
                canvas.drawRect(0,0,1280,720,new Paint());

                canvas.drawText("FPS:"+String.valueOf(FPS)+"  "+String.valueOf(scaleRate)+" "+String.valueOf(scaleToWidth),0,32,paint);
                canvas.restore();
            }
        } catch (Exception e){

        } finally {
            if(canvas!=null)
                sh.unlockCanvasAndPost(canvas);
        }
    }

    private void logicSV(){

    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (scaleToWidth) {
            event.setLocation(event.getX() / scaleRate, event.getY() / scaleRate - scaleTrans);
            if(event.getY()<0||event.getY()>=720)
                return false;
        }else {
            event.setLocation(event.getX() / scaleRate - scaleTrans, event.getY() / scaleRate);
            if(event.getX()<0||event.getX()>=1280)
                return false;
        }
        return false;
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        flag=true;
        th=new Thread(this);
        th.start();
    }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        float srw,srh;
        srw=(float)width/1280;
        srh=(float)height/720;
        if(srw>=srh){
            scaleRate=srh;
            scaleToWidth=false;
            scaleTrans=(width/srh-1280)/2;
        }else{
            scaleRate=srw;
            scaleToWidth=true;
            scaleTrans=(height/srw-720)/2;
        }
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        flag=false;
    }
    @Override
    public void run() {
        while(flag){
            try{
                long tinterval=System.currentTimeMillis();
                logicSV();
                drawSV();
                tinterval=System.currentTimeMillis()-tinterval;
                if(tinterval<33){
                    FPS=30;
                    th.sleep(33-tinterval);
                }
                else{
                    FPS=(int)(1000/tinterval);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章