1、遇到不平滑的问题,是因为你每次刷新的时间,半径变化太大,人眼已能识别出这种变化,但是多久刷新一次,是根据手机不同来确定的,当手机每秒刷新25帧以上的时间(即:每秒25次以上),所以,你先得到绘制一帧的时间,然后与它比1000/25(即,我们设定的标准绘制每帧要多少秒)如果绘制完一次后,它小于某个时间则让其等待到我们设定的1000/25ms的时间再去绘制,即要保证绘制一次最短也要1000/25 ms,如果太快就在性能好的手机上太快了,如果绘制一次超过了这个时间,那么绘制完之后就立即绘制。
try{ if(end - start < 1000/MAX_FPS){ Thread.sleep(1000/MAX_FPS - (end - start)); } } catch (InterruptedException e){ e.printStackTrace(); }
2、通过接口回调数据,你在自定义View中把一些值动态传输出去。
首先,先定义一个View.
interface Listener{ public void afterDraw(long delay); }
其次,在成员定义它,然后在构造函数里面赋值。
private int width; private int height; private Listener listener; private LinkedList<MyCircle> myCircles = null; public GameView(Context context,Listener listener) { super(context); myCircles = new LinkedList<MyCircle>(); MyCircle myCircle = new MyCircle(); myCircles.add(myCircle); this.listener = listener; }
最后,在调用的时间
mGameView = new GameView(this,new GameView.Listener() { @Override public void afterDraw(long delay) { System.out.println("测试数据 "+delay); } });
3、雷达的逻辑是什么?
就是一些有序列的circle,
每次都把这些个圆给画出来,画出来之后把每个圆的半径增加,透明度降低,这个算是做了一次。
private void myDraw(Canvas canvas) { for (MyCircle circle : myCircles) { canvas.drawCircle(width / 2, height / 2, circle.getRadius(), circle.getPaint()); } } private void logic() { boolean flag = false; for (MyCircle circle : myCircles) { circle.addRadius(2); flag = circle.desAlpha(1); } // 如果最外层的半径已经到达某个值,就再创建新的。、 if (myCircles.get(myCircles.size() - 1).getRadius() > width / 5) { MyCircle myCircle = new MyCircle(); myCircles.add(myCircle); } // 如果透明度为0就结束它 if (!flag) { myCircles.remove(0); } }
4、项目中用new Thread()这样的东西,它根本不会自动结束,所以在项目中要尽量少用这些个东西。
直接看代码吧
http://download.csdn.net/detail/dacainiao007/6881087