最近在mooc网上看了一个课程---网页前端html5中的利用canvas机制制作出了一个灿烂的倒计时效果,一时兴起仿着在android上也做了一个类似效果的自定义View ,因为只是出于兴趣,没有考虑到实际需求中的接口,这个只能算是一半成品,仅仅实现了倒计时的效果,各位可自行根据需求编写合适的接口,效果图在最后: 下面是几个关键的部分: 数字的绘制采用的是常规的01矩阵,倒计时功能是通过内部一个自定义的Updatethread实现的 重载OnMeaSure方法,初始化一些绘制用的数据
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
WINDOW_WIDTH = MeasureSpec.getSize(widthMeasureSpec);
WINDOW_HEIGHT = MeasureSpec.getSize(heightMeasureSpec);
MARGIN_LEFT = WINDOW_WIDTH / 10;
MARGIN_TOP = WINDOW_HEIGHT / 5;
RADIUS = WINDOW_WIDTH * 4 / 5 / 108 - 1;
Log.i(tag, "Width + Height " + WINDOW_WIDTH + " " + WINDOW_HEIGHT);
}
彩色小球的运动模拟的是自由上抛运动,更新小球位置的方法:
public void updateBallPosition() {
for(int i =0;i<balls.size();i++){
balls.get(i).x += balls.get(i).vx;
balls.get(i).y += balls.get(i).vy;
balls.get(i).vy += balls.get(i).g;
if(balls.get(i).y >= WINDOW_HEIGHT - RADIUS){
balls.get(i).y = WINDOW_HEIGHT -RADIUS;
balls.get(i).vy = (int) (- balls.get(i).vy * u);
}
}
//性能优化
int count = 0;
for(int i=0;i<balls.size();i++){
if(balls.get(i).x+RADIUS >0 && balls.get(i).x - RADIUS < WINDOW_WIDTH){
balls.set(count++, balls.get(i));
}
}
for(int j = count;j<balls.size();j++ ){
balls.remove(j);
}
//具体ArrayList大小与特定绘图区域大小相关
// Log.i(tag, balls.size()+"");
}