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.youkuaiyun.com/detail/dacainiao007/6881087