--- /dev/null
+package com.folioreader.view;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.support.v7.widget.AppCompatSeekBar;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+
+/**
+ * Created by priyank on 4/19/16.
+ */
+
+public class VerticalSeekbar extends AppCompatSeekBar {
+
+ public VerticalSeekbar(Context context) {
+ super(context);
+ }
+
+ public VerticalSeekbar(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ public VerticalSeekbar(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(h, w, oldh, oldw);
+ }
+
+ @Override
+ protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(heightMeasureSpec, widthMeasureSpec);
+ setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
+ }
+
+ protected void onDraw(Canvas c) {
+ c.rotate(90);
+ c.translate(0, -getWidth());
+
+ super.onDraw(c);
+ }
+
+ private OnSeekBarChangeListener mOnChangeListener;
+
+ @Override
+ public void setOnSeekBarChangeListener(OnSeekBarChangeListener mOnChangeListener) {
+ this.mOnChangeListener = mOnChangeListener;
+ }
+
+ private int mLastProgress = 0;
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (!isEnabled()) {
+ return false;
+ }
+
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ if (mOnChangeListener != null)
+ mOnChangeListener.onStartTrackingTouch(this);
+ setPressed(true);
+ setSelected(true);
+ break;
+ case MotionEvent.ACTION_MOVE:
+ super.onTouchEvent(event);
+ int progress = getMax() - (int) (getMax() * event.getY() / getHeight());
+
+ // Ensure progress stays within boundaries
+ if (progress < 0) {
+ progress = 0;
+ }
+ if (progress > getMax()) {
+ progress = getMax();
+ }
+ setProgress(progress); // Draw progress
+ if (progress != mLastProgress) {
+ // Only enact listener if the progress has actually changed
+ mLastProgress = progress;
+ if (mOnChangeListener != null)
+ mOnChangeListener.onProgressChanged(this, progress, true);
+ }
+
+ onSizeChanged(getWidth(), getHeight(), 0, 0);
+ setPressed(true);
+ setSelected(true);
+ break;
+ case MotionEvent.ACTION_UP:
+ if (mOnChangeListener != null)
+ mOnChangeListener.onStopTrackingTouch(this);
+ setPressed(false);
+ setSelected(false);
+ break;
+ case MotionEvent.ACTION_CANCEL:
+ super.onTouchEvent(event);
+ setPressed(false);
+ setSelected(false);
+ break;
+ }
+ return true;
+ }
+
+ public synchronized void setProgressAndThumb(int progress) {
+ setProgress(progress);
+ onSizeChanged(getWidth(), getHeight(), 0, 0);
+ if (progress != mLastProgress) {
+ // Only enact listener if the progress has actually changed
+ mLastProgress = progress;
+ if (mOnChangeListener != null)
+ mOnChangeListener.onProgressChanged(this, progress, true);
+ }
+ }
+
+ public synchronized void setMaximum(int maximum) {
+ setMax(maximum);
+ }
+
+ public synchronized int getMaximum() {
+ return getMax();
+ }
+
+}