android SurfaceView使用

来源:互联网 发布:足疗店软件 编辑:程序博客网 时间:2024/06/06 00:18

SurfaceView绘制在子线程中,而且采用双缓冲策略,提高绘制效率.

/** * Created by fung on 2016/3/2. */public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback,Runnable {    private SurfaceHolder holder;    private Canvas mCanvas;    private Paint mPaint;    private boolean flag;    private float x,y;    private float LastX,LastY;   private Path mPath;    public MySurfaceView(Context context) {        this(context,null);    }    public MySurfaceView(Context context, AttributeSet attrs) {        this(context, null, 0);    }    public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        holder=this.getHolder();        holder.addCallback(this);        this.setFocusable(true);        this.setFocusableInTouchMode(true);        this.setKeepScreenOn(true);        mPaint=new Paint();        mPaint.setAntiAlias(true);        mPaint.setDither(true);        mPaint.setColor(Color.BLACK);        mPaint.setStrokeWidth(3);        mPaint.setStyle(Paint.Style.STROKE);        mPath=new Path();    }    @Override    public void surfaceCreated(SurfaceHolder holder) {        flag=true;        //开启线程绘制        new Thread(this).start();    }    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {         flag=false;    }    @Override    public boolean onTouchEvent(MotionEvent event) {        x= (int) event.getX();        y= (int) event.getY();        switch(event.getAction()){            case MotionEvent.ACTION_DOWN:               mPath.moveTo(x,y);                break;            case MotionEvent.ACTION_MOVE:                mPath.lineTo(x,y);                break;            case MotionEvent.ACTION_UP:                break;        }        LastX=x;        LastY=y;        return true;    }    @Override    public void run() {        while (flag){            draw();/*            LastX=x;            LastY=y;*/            /*x=x+1;            y= (int) (400+Math.sin(x*2*Math.PI/180)*100);            mPath.lineTo(x,y);*/         //   mPath.moveTo(x,y);            try {                Thread.sleep(50);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }    /**     * 绘制     */    private void draw() {        try {            mCanvas=holder.lockCanvas();            //绘制背景            mCanvas.drawColor(Color.WHITE);            mCanvas.drawRect(new RectF(x,y,x+100,y+100),mPaint);        }catch (Exception E){        }finally {            if(mCanvas!=null){                holder.unlockCanvasAndPost(mCanvas);            }        }    }}
0 0
原创粉丝点击