diff options
Diffstat (limited to 'app/src/com/google/android/DemoKit/Slider.java')
-rw-r--r-- | app/src/com/google/android/DemoKit/Slider.java | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/app/src/com/google/android/DemoKit/Slider.java b/app/src/com/google/android/DemoKit/Slider.java new file mode 100644 index 0000000..3517bff --- /dev/null +++ b/app/src/com/google/android/DemoKit/Slider.java @@ -0,0 +1,133 @@ +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()); + } + } + +} |