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()); } } }