最近需要做一个类似于淘宝平台会员等级的动态效果 度娘并没有给出想要的东西,于是乎,自己动手做了一个
先上效果图
先谈谈主要的思路
1.先把需要的图标画在屏幕的指定位置,当然,这个需要自己去计算和调节
2.让他动起来并且不会有卡顿的感觉 这个问题很简单,在Activity中new 一个线程 每隔40ms时间发送一个Message,message里面包含需要移动距离,并且调用View的postInvalidate()方法,重新绘制View,在Handler里面判断控件的位置,在指定范围内去改变控件的位置即可!
3.至于颜色的更换 我的做法是在底层防止有颜色的背景图,上面放置同样大小的灰色图片,不停去改变灰色图片的位置即可。
好,接下来上代码
当然 图片文件需要各位自己去添加 并且我在这里有去计算屏幕的像素密度。后面贴出来
下面是控件的代码 继承View 所有代码都是在 onDraw方法中 当然,你也可以把计算的部分放在onMeasure方法里面
import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import com.azt.common.utils.CommonUtil;
public class MyLevelView extends View {
private Context context;
//总长度 ,各个等级的对应长度,当前位置
private int totalLength, levelLength, currentLength;
//
private int totalLevel = 5, cunrrentLevel;
public final static int LEVEL0 = 208, LEVEL1 = 552, LEVEL2 = 828, LEVEL3 = 1104, LEVEL4 = 1380, LEVEL5 = 1656;
private float level0, level1, level2, level3, level4, level5;
//等级图标位置
private float gradeY;
//文字位置
private float textY = 0;
//头像照片位置
private float headY = 0;
//等级图标位置
private float gradeX;
private final static String STR_LEVEL0 = "0", STR_LEVEL1 = "300", STR_LEVEL2 = "1300", STR_LEVEL3 = "3300", STR_LEVEL4 = "8300", STR_LEVEL5 = "18300";
public int level = 0;
private Bitmap headImage;
private float denistyX, denistyY;
private Paint paint = new Paint();
public MyLevelView(Context context) {
this(context, null);
}
public MyLevelView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyLevelView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
denistyX = CommonUtil.getAdapterRatio((Activity) context)[0];
denistyY = CommonUtil.getAdapterRatio((Activity) context)[1];
level0 = (LEVEL0 * denistyX);
level1 = (LEVEL1 * denistyX);
level2 = (LEVEL2 * denistyX);
level3 = (LEVEL3 * denistyX);
level4 = (LEVEL4 * denistyX);
level5 = (LEVEL5 * denistyX);
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.grade0_ash);
gradeY &#