/*
* Copyright (C) 2013 YIXIA.COM
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.yixia.zi.widget.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Handler;
import android.os.Message;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.widget.SeekBar;
import com.yixia.zi.R;
import com.yixia.zi.utils.WeakHandler;
public class SegmentSeekBar extends SeekBar {
private static final int MSG_UPDATE = 42;
private Handler mHandler;
private RectF mBounds;
private Paint mPaint;
private double[] mSegments;
public SegmentSeekBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public SegmentSeekBar(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public SegmentSeekBar(Context context) {
super(context);
init(context);
}
private void init(Context ctx) {
mBounds = new RectF(0, 0, 0, 0);
mHandler = new WeakHandler<Context>(ctx) {
@Override
public void handleMessage(Message msg) {
if (msg.what == MSG_UPDATE) {
invalidate();
}
}
};
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(ctx.getResources().getColor(R.color.seekbar_buffer_color));
}
public void setSegments(double[] segments) {
if (segments != null && segments.length > 0) {
mSegments = segments;
mHandler.removeMessages(MSG_UPDATE);
mHandler.sendEmptyMessage(MSG_UPDATE);
}
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mSegments == null) {
return;
}
for (int i = 0; i < mSegments.length; i += 2) {
double begin = mSegments[i];
double end = mSegments[i + 1];
int available = getWidth() - getPaddingLeft() - getPaddingRight();
int length = (int) ((end - begin) * available);
mBounds.left = (int) (begin * available);
mBounds.right = mBounds.left + length;
mBounds.top = getHeight() / 2 - 4;
mBounds.bottom = getHeight() / 2 + 2;
canvas.save();
canvas.translate(getPaddingLeft(), getPaddingTop());
canvas.drawRect(mBounds, mPaint);
canvas.restore();
}
}
public static class SavedState extends BaseSavedState {
private double[] mSegments;
public SavedState(Parcelable superState) {
super(superState);
}
private SavedState(Parcel in) {
super(in);
in.readDoubleArray(mSegments);
}
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeDoubleArray(mSegments);
}
public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() {
@Override
public SavedState createFromParcel(Parcel parcel) {
return new SavedState(parcel);
}
@Override
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}
@Override
public Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
if (isSaveEnabled()) {
SavedState ss = new SavedState(superState);
ss.mSegments = mSegments;
return ss;
}
return superState;
}
@Override
public void onRestoreInstanceState(Parcelable state) {
if (!(state instanceof SavedState)) {
super.onRestoreInstanceState(state);
return;
}
SavedState ss = (SavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
mSegments = ss.mSegments;
}
}