package com.tencent.tws.assistant.drawable;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.widget.ScrollBarDrawable;
import com.tencent.tws.assistant.utils.ReflectUtils;
public class TwsScrollBarDrawable extends ScrollBarDrawable {
private static final String TAG = "com.tencent.tws.assistant.drawable.TwsScrollBarDrawable";
private int twsViewLength, twsViewStart, twsViewEnd;
public void twsSetParameters(int viewLength, int viewStart, int viewEnd) {
Log.d(TAG, "twsSetParameters|len=" + viewLength + "startt=" + viewStart + ",end=" + viewEnd);
twsViewLength = viewLength;
twsViewStart = viewStart;
twsViewEnd = viewEnd;
}
protected void twsDrawThumb(Canvas canvas, Rect bounds, int offset, int length, boolean vertical) {
try {
final Rect thumbRect = (Rect) getField("mTempBounds");
final boolean changed = (Boolean) getField("mRangeChanged") || (Boolean) getField("mChanged");
if (changed) {
if (vertical) {
if (twsViewLength == 0)
twsViewLength = 1;
float factor = ((float) (offset + length) / (float) twsViewLength) > 1.0f ? 1.0f
: ((float) (offset + length) / (float) twsViewLength);
thumbRect.set(bounds.left, bounds.top + offset
+ ((int) ((0 - twsViewStart - twsViewEnd) * factor + twsViewStart)), bounds.right,
bounds.top + offset + ((int) ((0 - twsViewStart - twsViewEnd) * factor + twsViewStart))
+ length);
} else {
thumbRect.set(bounds.left + offset, bounds.top, bounds.left + offset + length, bounds.bottom);
}
}
if (vertical) {
final Drawable thumb = (Drawable) getField("mVerticalThumb");
if (changed)
thumb.setBounds(thumbRect);
thumb.draw(canvas);
} else {
final Drawable thumb = (Drawable) getField("mHorizontalThumb");
if (changed)
thumb.setBounds(thumbRect);
thumb.draw(canvas);
}
} catch (Exception e) {
Log.e(TAG, "twsDrawThumb|exp:" + e.getMessage());
}
}
@Override
public void draw(Canvas canvas) {
final boolean vertical = (Boolean) getField("mVertical");
final int extent = (Integer) getField("mExtent");
final int range = (Integer) getField("mRange");
boolean drawTrack = true;
boolean drawThumb = true;
if (extent <= 0 || range <= extent) {
drawTrack = vertical ? (Boolean) getField("mAlwaysDrawVerticalTrack")
: (Boolean) getField("mAlwaysDrawHorizontalTrack");
drawThumb = false;
}
Rect r = getBounds();
if (canvas.quickReject(r.left, r.top, r.right, r.bottom, Canvas.EdgeType.AA)) {
return;
}
if (drawTrack) {
drawTrack(canvas, r, vertical);
}
if (drawThumb) {
int size = vertical ? r.height() : r.width();
int thickness = vertical ? r.width() : r.height();
int length = Math.round((float) size * extent / range);
int offset = Math.round((float) (size - length) * (Integer) getField("mOffset") / (range - extent));
// avoid the tiny thumb
int minLength = thickness * 2;
if (length < minLength) {
length = minLength;
}
// avoid the too-big thumb
if (offset + length > size) {
offset = size - length;
}
// tws-start recalculate scroll params::2015-1-9
twsDrawThumb(canvas, r, offset, length, vertical);
// tws-end recalculate scroll params::2015-1-9
}
}
private Object getField(String fieldName) {
Object value = null;
try {
Class<?> clz = ReflectUtils.forClassName("android.widget.ScrollBarDrawable");
value = ReflectUtils.getFieldValue(fieldName, this, clz);
} catch (Exception e) {
Log.e(TAG, "twsSetParameters exp:" + e.getMessage());
}
return value;
}
}