blob: 3517bffa0559e2693a495d89df2b6197553db28d [file] [log] [blame]
package com.google.android.DemoKit;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class Slider extends View {
interface SliderPositionListener {
void onPositionChange(double value);
}
private Drawable mIndicator;
private Drawable mBackground;
private double mPosition;
private SliderPositionListener mListener;
private boolean mVertical;
public Slider(Context context) {
super(context);
initSliderView(context, false);
}
public Slider(Context context, AttributeSet attrs) {
super(context, attrs);
initSliderView(context, false);
}
public void setSliderBackground(Drawable background) {
mBackground = background;
invalidate();
}
public void setPositionListener(SliderPositionListener listener) {
mListener = listener;
}
public void setPosition(double position) {
if (mPosition != position) {
invalidate();
mPosition = position;
if (mListener != null) {
mListener.onPositionChange(mPosition);
}
}
}
private OnTouchListener mClickListener = new OnTouchListener() {
public boolean onTouch(View v, MotionEvent m) {
Rect r = new Rect();
getDrawingRect(r);
double position;
if (mVertical) {
double y = m.getY();
position = Math.max(0, (r.bottom - y) / r.height());
} else {
double x = m.getX();
position = Math.max(0, (x - r.left) / r.width());
}
position = Math.min(1, position);
setPosition(position);
return true;
}
};
protected void initSliderView(Context context, boolean vertical) {
mPosition = 0;
mVertical = vertical;
Resources res = context.getResources();
if (mVertical) {
mBackground = res
.getDrawable(R.drawable.scrubber_vertical_blue_holo_dark);
} else {
mBackground = res
.getDrawable(R.drawable.scrubber_horizontal_holo_dark);
}
mIndicator = res.getDrawable(R.drawable.scrubber_control_holo_dark);
this.setOnTouchListener(mClickListener);
}
protected void onDraw(Canvas canvas) {
Rect r = new Rect();
getDrawingRect(r);
if (mVertical) {
int lineX = r.centerX();
int bgW = mBackground.getIntrinsicWidth() / 2;
if (bgW == 0) {
bgW = 5;
}
mBackground.setBounds(lineX - bgW, r.top + 10, lineX + bgW,
r.bottom - 10);
mBackground.draw(canvas);
final int kMargin = 48;
int indicatorY = (int) (r.bottom - (r.height() - kMargin)
* mPosition)
- kMargin / 2;
Utilities.centerAround(lineX, indicatorY, mIndicator);
mIndicator.draw(canvas);
} else {
int lineY = r.centerY();
int bgH = mBackground.getIntrinsicHeight() / 2;
if (bgH == 0) {
bgH = 5;
}
mBackground.setBounds(r.left + 10, lineY - bgH, r.right - 10, lineY
+ bgH);
mBackground.draw(canvas);
final int kMargin = 48;
int indicatorX = (int) ((r.width() - kMargin) * mPosition) + r.left
+ kMargin / 2;
Utilities.centerAround(indicatorX, lineY, mIndicator);
mIndicator.draw(canvas);
}
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mVertical) {
setMeasuredDimension(mIndicator.getIntrinsicWidth(),
getMeasuredHeight());
} else {
setMeasuredDimension(getMeasuredWidth(),
mIndicator.getIntrinsicHeight());
}
}
}