package net.naonedbus.widget; import net.naonedbus.utils.ColorUtils; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.widget.TextView; public class StopStepView extends TextView { public static enum Type { FIRST, LAST, MIDDLE; } private static final int COLUMN_WIDTH = 40; private static final int DOT_RADIUS = 4; private static final int DOT_RADIUS_HEADSIGN = 8; private static final float DOT_RADIUS_BORDER = 1f; private static final float STROKE_WIDTH = 3f; private Paint mPaint; private int mColor; private int mSecondaryColor; private int mColumnWidth; private int mDotRadius; private int mDotRadiusHeadsign; private float mStrokeWidth; private float mDotRadiusBorder; private Type mType = Type.MIDDLE; public StopStepView(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); init(); } public StopStepView(final Context context, final AttributeSet attrs) { super(context, attrs); init(); } public StopStepView(final Context context) { super(context); init(); } private void init() { final DisplayMetrics metrics = getContext().getResources().getDisplayMetrics(); mColumnWidth = Math.round(COLUMN_WIDTH * metrics.density); mDotRadius = Math.round(DOT_RADIUS * metrics.density); mDotRadiusHeadsign = Math.round(DOT_RADIUS_HEADSIGN * metrics.density); mDotRadiusBorder = Math.round(DOT_RADIUS_BORDER * metrics.density); mStrokeWidth = STROKE_WIDTH * metrics.density; mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(mStrokeWidth); setColor(Color.rgb(100, 100, 100)); } public void setType(final Type type) { if (mType != type) { mType = type; invalidate(); } } public void setColor(final int color) { mColor = color; mSecondaryColor = ColorUtils.getLighterColor(color); mPaint.setColor(mColor); } @Override protected void onDraw(final Canvas canvas) { switch (mType) { case MIDDLE: drawLine(canvas); drawNormalDot(canvas); break; case FIRST: drawBottomLine(canvas); drawHeadsignDot(canvas); break; case LAST: drawTopLine(canvas); drawHeadsignDot(canvas); break; } super.onDraw(canvas); } private void drawLine(final Canvas canvas) { drawLine(canvas, 0, getMeasuredHeight()); } private void drawTopLine(final Canvas canvas) { drawLine(canvas, 0, getMeasuredHeight() / 2); } private void drawBottomLine(final Canvas canvas) { drawLine(canvas, getMeasuredHeight() / 2, getMeasuredHeight()); } private void drawLine(final Canvas canvas, final int top, final int bottom) { mPaint.setColor(mColor); mPaint.setStrokeWidth(mStrokeWidth); canvas.drawLine(mColumnWidth / 2, top, mColumnWidth / 2, bottom, mPaint); } private void drawHeadsignDot(final Canvas canvas) { final int x = mColumnWidth - mColumnWidth / 2; final int y = getHeight() / 2; mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(mColor); canvas.drawCircle(x, y, mDotRadiusHeadsign, mPaint); mPaint.setStyle(Paint.Style.STROKE); } private void drawNormalDot(final Canvas canvas) { final int x = mColumnWidth - mColumnWidth / 2; final int y = getHeight() / 2; mPaint.setStyle(Paint.Style.FILL); // Outter circle mPaint.setColor(mColor); canvas.drawCircle(x, y, mDotRadius + mDotRadiusBorder, mPaint); // Inner circle mPaint.setColor(mSecondaryColor); canvas.drawCircle(x, y, mDotRadius, mPaint); mPaint.setStyle(Paint.Style.STROKE); } }