Timer 实现 public class SurfaceViewTest extends SurfaceView implements SurfaceHolder.Callback { private Timer timer; SurfaceHolder holder; private MyTimerTask timerTask;//----------------------------- private final int HEIGHT = 800; // 要绘
public class SurfaceViewTest extends SurfaceView implements SurfaceHolder.Callback { private Timer timer; SurfaceHolder holder; private MyTimerTask timerTask; //----------------------------- private final int HEIGHT = 800; // 要绘制的曲线的水平宽度 private final int WIDTH = 1000; // 离屏幕左边界的起始距离 private final int X_OFFSET = 5; // 初始化X坐标 private int cx = X_OFFSET; // 实际的Y轴的位置 private int centerY = HEIGHT / 2; private int cy = 0; public SurfaceViewTest(Context context) { super(context); init(); } public SurfaceViewTest(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { holder = getHolder(); holder.addCallback(this); // 设置画布 背景透明 holder.setFormat(PixelFormat.TRANSLUCENT); // --焦点设置---------------------------- setFocusable(true); // 设置触屏 setFocusableInTouchMode(true); // 设置常亮 setKeepScreenOn(true); timer=new Timer(); timerTask = new MyTimerTask(); } @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { timer.schedule(timerTask, 30, 50); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { timer.cancel(); timer.purge(); } class MyTimerTask extends TimerTask { Paint paint; Canvas c = null; int deltax = 0; int count = 0; private Queue线程实现queue; public MyTimerTask() { paint = new Paint(); paint.setColor(Color.BLUE); paint.setStyle(Paint.Style.STROKE);// 空心 paint.setStrokeWidth(2); paint.setTextSize(25); queue= new LinkedList (); } @Override public void run() { cy = (int) (Math.sin((cx - X_OFFSET) / 20f) * 300) + centerY; queue.add(new Point(cx, cy)); cx++; count++; if (cx > 1000) { deltax++; queue.poll(); } if (count % 1 == 0) { // 提交修改 Canvas canvas = holder.lockCanvas(new Rect(0, 0, HEIGHT, WIDTH)); canvas.drawColor(Color.WHITE); canvas.drawLine(X_OFFSET, centerY, WIDTH, centerY, paint); canvas.drawLine(X_OFFSET, 40, X_OFFSET, HEIGHT, paint); for (int i=0;i<100;i++){ canvas.drawText(""+i*10,X_OFFSET+i*50,centerY,paint); } // 根据X,Y坐标画点 List list = (List ) queue; Point prev = list.get(0); for (int i = 1; i < list.size(); i++) { Point cur = list.get(i); canvas.drawLine(prev.x - deltax, prev.y, cur.x - deltax, cur.y, paint); prev = cur; } holder.unlockCanvasAndPost(canvas); } } }; }
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { LoopThread thread; public MySurfaceView(Context context) { super(context); init(); } private void init() { SurfaceHolder holder=getHolder(); holder.addCallback(this); // 设置画布 背景透明 holder.setFormat(PixelFormat.TRANSLUCENT); // --焦点设置---------------------------- setFocusable(true); // 设置触屏 setFocusableInTouchMode(true); // 设置常亮 setKeepScreenOn(true); thread=new LoopThread(holder,getContext()); } @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { thread.isRunning=true; thread.start(); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { thread.isRunning=false; try { thread.join(); //Java Thread中, // join() 方法主要是让调用该方法的thread完成run方法里面的东西后, 再执行join()方法后面的代码。示例: } catch (InterruptedException e) { e.printStackTrace(); } } class LoopThread extends Thread{ SurfaceHolder surfaceHolder; Context context; boolean isRunning; float radius=10f; Paint paint; public LoopThread(SurfaceHolder surfaceHolder,Context context){ this.surfaceHolder=surfaceHolder; this.context=context; isRunning=false; paint=new Paint(); paint.setColor(Color.YELLOW); paint.setStyle(Paint.Style.STROKE);// 空心 } @Override public void run() { super.run(); Canvas c=null; while (isRunning){ try { synchronized(surfaceHolder){ c=surfaceHolder.lockCanvas(null); doDraw(c); // Thread.sleep(50); } } catch (InterruptedException e) { e.printStackTrace(); }finally { surfaceHolder.unlockCanvasAndPost(c); } } } public void doDraw(Canvas c) { //这个很重要,清屏操作,清楚掉上次绘制的残留图像 c.drawColor(Color.BLACK); /// surfaceView 默认为黑色背景; c.translate(200,200); c.drawCircle(0,0,radius++,paint); if (radius>100) { radius=10f; } } } }