/* * Copyright 2013, Edmodo, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with the License. * You may obtain a copy of the License in the LICENSE file, or at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package com.edmodo.rangebar; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.util.TypedValue; /** * This class represents the underlying gray bar in the RangeBar (without the * thumbs). */ class Bar { // Member Variables //////////////////////////////////////////////////////// private final Paint mPaint; // Left-coordinate of the horizontal bar. private final float mLeftX; private final float mRightX; private final float mY; private int mNumSegments; private float mTickDistance; private final float mTickHeight; private final float mTickStartY; private final float mTickEndY; // Constructor ///////////////////////////////////////////////////////////// Bar(Context ctx, float x, float y, float length, int tickCount, float tickHeightDP, float BarWeight, int BarColor) { mLeftX = x; mRightX = x + length; mY = y; mNumSegments = tickCount - 1; mTickDistance = length / mNumSegments; mTickHeight = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, tickHeightDP, ctx.getResources().getDisplayMetrics()); mTickStartY = mY - mTickHeight / 2f; mTickEndY = mY + mTickHeight / 2f; // Initialize the paint. mPaint = new Paint(); mPaint.setColor(BarColor); mPaint.setStrokeWidth(BarWeight); mPaint.setAntiAlias(true); } // Package-Private Methods ///////////////////////////////////////////////// /** * Draws the bar on the given Canvas. * * @param canvas Canvas to draw on; should be the Canvas passed into {#link * View#onDraw()} */ void draw(Canvas canvas) { canvas.drawLine(mLeftX, mY, mRightX, mY, mPaint); drawTicks(canvas); } /** * Get the x-coordinate of the left edge of the bar. * * @return x-coordinate of the left edge of the bar */ float getLeftX() { return mLeftX; } /** * Get the x-coordinate of the right edge of the bar. * * @return x-coordinate of the right edge of the bar */ float getRightX() { return mRightX; } /** * Gets the x-coordinate of the nearest tick to the given x-coordinate. * * @param x the x-coordinate to find the nearest tick for * @return the x-coordinate of the nearest tick */ float getNearestTickCoordinate(Thumb thumb) { final int nearestTickIndex = getNearestTickIndex(thumb); final float nearestTickCoordinate = mLeftX + (nearestTickIndex * mTickDistance); return nearestTickCoordinate; } /** * Gets the zero-based index of the nearest tick to the given thumb. * * @param thumb the Thumb to find the nearest tick for * @return the zero-based index of the nearest tick */ int getNearestTickIndex(Thumb thumb) { final int nearestTickIndex = (int) ((thumb.getX() - mLeftX + mTickDistance / 2f) / mTickDistance); return nearestTickIndex; } /** * Set the number of ticks that will appear in the RangeBar. * * @param tickCount the number of ticks */ void setTickCount(int tickCount) { final float barLength = mRightX - mLeftX; mNumSegments = tickCount - 1; mTickDistance = barLength / mNumSegments; } // Private Methods ///////////////////////////////////////////////////////// /** * Draws the tick marks on the bar. * * @param canvas Canvas to draw on; should be the Canvas passed into {#link * View#onDraw()} */ private void drawTicks(Canvas canvas) { // Loop through and draw each tick (except final tick). for (int i = 0; i < mNumSegments; i++) { final float x = i * mTickDistance + mLeftX; canvas.drawLine(x, mTickStartY, x, mTickEndY, mPaint); } // Draw final tick. We draw the final tick outside the loop to avoid any // rounding discrepancies. canvas.drawLine(mRightX, mTickStartY, mRightX, mTickEndY, mPaint); } }