*即刻点赞效果的实现
思路:每次点赞数字的动画效果是根据变化的数字去做动画,例如1001 点赞只有末尾的1变化了所以只有1这个数字会有动画效果
1099 如果点赞就会变成1100 变化了三个数字 099 就会变为100 才会有动画效果.*
我们把变化前的数字和变化后的数字的每一位保存到集合里面
//变化前的文本集合
private void setListBeforeText(long number){
listBeforeText.clear();
long textNumber = number;
while (textNumber/10 != 0){
listBeforeText.add((textNumber % 10)+"");
textNumber = textNumber/10;
}
listBeforeText.add((textNumber % 10)+"");
}
//变化后的文本集合
private void setListAfterText(long number){
listAfterText.clear();
long textNumber = number;
while (textNumber/10 != 0){
listAfterText.add((textNumber % 10)+"");
textNumber = textNumber/10;
}
listAfterText.add((textNumber % 10)+"");
}
比较两个变化的文本集合找出变化的文本 和没有变化的文本
我们已1099->1100为例子
//找出变化的文本信息
private String[] compareText(){
setListBeforeText(beforeNumber);
setListAfterText(number);
StringBuilder sb = new StringBuilder();//找出不一样的文本 1099 -> 1100 就会保存100
StringBuilder sbEquals = new StringBuilder();//找出一样的文本1099->1100 会保存1
StringBuilder sb1 = new StringBuilder();//找变化文本初始数字的文本1099->1100 会保存099
int count = listBeforeText.size() <= listAfterText.size() ? listBeforeText.size():listAfterText.size();
for(int i = 0; i < count; i++){
if(!listAfterText.get(i).equals(listBeforeText.get(i))){
sb.append(listAfterText.get(i));
sb1.append(listBeforeText.get(i));
}else{
sbEquals.append(listAfterText.get(i));
}
}
for(int i = count; i < listAfterText.size(); i++){
sb.append(listAfterText.get(i));
}
//以数组的形式返回1 100 099
// Log.d("LikeView",sbEquals.reverse().toString()+" not equal: "+sb.reverse().toString());
return new String[]{sbEquals.reverse().toString(),sb.reverse().toString(),sb1.reverse().toString()};
}
下面就开始绘制数字1099->1100 099->变化为100
private void drawNumber(Canvas canvas){
String[] strs = compareText();
float width = 0;
if(!TextUtils.isEmpty(strs[0])){//绘制没有变化的文本 1
width = paint.measureText(strs[0],0,strs[0].length());
canvas.drawText(strs[0],95,100,paint);
}
if(!TextUtils.isEmpty(strs[1])){//绘制变化后的文本100 高度根据属性动画 做动画效果
canvas.drawText(strs[1]+"",95+width,currentTextY,paint);
}
if(!TextUtils.isEmpty(strs[2])){//绘制099 099会随着文本100的高度的变化而变化 移动出控件范围外不可见 作为一个顶起的效果
if(isLike){
canvas.drawText(strs[2]+"",95+width,currentTextY+120,paint);
}else{
canvas.drawText(strs[2]+"",95+width,currentTextY-120,paint);
}
}
}
项目地址 https://github.com/gacmy/dianzan.git