Android自定义view六线性列表(一)

自定义view针对线性图所做的控件,横纵坐标和线性图
第一步创建整体的父类:

public class CharterBase extends View {
    static final int ANIM_DELAY_MILLIS = 30;
    static final boolean DEFAULT_ANIM = true;
    static final long DEFAULT_ANIM_DURATION = 500;
    static final boolean DEFAULT_AUTOSHOW = true;

final Runnable doNextAnimStep = new Runnable() {
    @Override
    public void run() {
        invalidate();
    }
};

float minY;
float maxY;

float[] values;
float[] valuesTransition;

boolean anim;
long animDuration;
boolean animFinished;
Handler handlerAnim;

private CharterAnimListener animListener;

protected CharterBase(Context context) {
    this(context, null);
}

protected CharterBase(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

protected CharterBase(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
protected CharterBase(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    init();
}

private void init() {
    if (isInEditMode()) {
        return;
    }

    animFinished = false;
    handlerAnim = new Handler();
}

public void show() {
    setWillNotDraw(false);
    invalidate();
}

public float[] getValues() {
    return values;
}

public void setValues(float[] values) {
    if (values == null || values.length == 0) {
        return;
    }

    this.values = values;
    getMaxMinValues(values);
    initValuesTarget(values);

    animFinished = false;
    invalidate();
}

public void resetValues() {
    if (values == null || values.length == 0) {
        return;
    }

    for (int i = 0; i < values.length; i++) {
        values[i] = minY;
    }

    setValues(values);
}

private void getMaxMinValues(float[] values) {
    if (values != null && values.length > 0) {
        maxY = values[0];
        minY = values[0];
        for (float y : values) {
            if (y > maxY) {
                maxY = y;
            }
            if (y < minY) {
                minY = y;
            }
        }
    }
}

private void initValuesTarget(float[] values) {
    this.valuesTransition = values.clone();
    for (int i = 0; i < valuesTransition.length; i++) {
        valuesTransition[i] = minY;
    }
}

public float getMaxY() {
    return maxY;
}

public void setMaxY(float maxY) {
    if (values == null) {
        throw new IllegalStateException("You must call setValues() first");
    }
    this.maxY = maxY;
    invalidate();
}

public float getMinY() {
    return minY;
}

public void setMinY(float minY) {
    if (values == null) {
        throw new IllegalStateException("You must call setValues() first");
    }
    this.minY = minY;
    invalidate();
}

void calculateNextAnimStep() {
    animFinished = true;
    for (int i = 0; i < valuesTransition.length; i++) {
        float diff = values[i] - minY;
        float step = (diff * ANIM_DELAY_MILLIS) / animDuration;

        if (valuesTransition[i] + step >= values[i]) {
            valuesTransition[i] = values[i];
        } else {
            valuesTransition[i] = valuesTransition[i] + step;
            animFinished = false;
        }
    }

    if (animFinished && animListener != null) {
        animListener.onAnimFinish();
    }
}

public void replayAnim() {
    if (values == null || values.length == 0) {
        return;
    }

    initValuesTarget(values);
    animFinished = false;
    invalidate();
}

public boolean isAnim() {
    return anim;
}

public void setAnim(boolean anim) {
    this.anim = anim;
    replayAnim();
}

public long getAnimDuration() {
    return animDuration;
}

public void setAnimDuration(long animDuration) {
    this.animDuration = animDuration;
    replayAnim();
}

public void setAnimListener(CharterAnimListener animListener) {
    this.animListener = animListener;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值