一、demo介绍
自定义View 有动画递增效果的柱状图
二、代码介绍 自定义View
重写onDraw()进行画图:
1.获取的是view控件的宽高,没有获取屏幕宽高 且留了点空间 别太靠边
int width = getWidth()-10;
height = getHeight()-10;
2.通过canvas.drawLine画X Y 轴:
canvas.drawLine( xoffset ,height-yoffset, xoffset,0,mypaint );
canvas.drawLine( xoffset, height-yoffset,width,height-yoffset,mypaint);
3.通过canvas.drawText绘制Y轴刻度 这儿设置Y分了5部分
for( int j = 0 ; j < 5; j++) {
double markers = ymarkers*j;
canvas.drawText( nf.format(markers), xoffset-40,height-yoffset-(yUnit_value*(j)), mypaint);
}
4.添加动画效果
延时绘制,实现动画效果。数字越大,延时越久,动画效果就会越慢
handler.postDelayed(this, 1);
for( int j = 0; j<list.size();j++ ) {
//定义统计图中,柱体的宽度 xUnit_value 一个的整体总宽度 -3是为了有间距
int barWidth = ( int )( xUnit_value-3);
//j+1,使得x轴的每一个区间从坐标原点,向后平移一个区间。
int startPos = xoffset +2 +xUnit_value*(j+1);
EntityDataInfo map = list.get(j);
int temp = map.getValue();
int barHeight = (int) (temp*(yUnit_value/ymarkers));
int top = height-2-yoffset-barHeight;
int top1 = 0 ;
//绘制柱状图
mypaint.setColor(0xFFfbfbfb);
if (animHeight >= barHeight) {
top1 =top;
} else {
top1 = (int) (height-2-yoffset-animHeight);
}
canvas.drawRect(startPos-barWidth, top1,
startPos,height-2-yoffset,mypaint);
}
实现柱子增长的动画效果,当高度达到高度时,结束动画
@Override
public void run() {
animHeight += 5;
if (animHeight >= height-2-(int)(height*0.1)) {
return;
} else {
invalidate();
}
}