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;
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章