package org.schmivits.airball.display.climbrate;
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import org.schmivits.airball.display.DisplayConfiguration;
import org.schmivits.airball.widget.Container;
import org.schmivits.airball.widget.Rectangle;
import org.schmivits.airball.widget.Text;
import org.schmivits.airball.widget.Widget;
public class ClimbRateTapeCore extends Container {
public interface Model {
float getClimbRate();
}
private static final int INDICATOR_COLOR = Color.argb(255, 204, 102, 255);
private final Model mModel;
private final DisplayConfiguration mConfig;
private final float mIndicatorThickness;
private final Paint mIndicatorPaint;
private final Typeface mTypeface;
private final float mTapePixelsPerFpm;
public ClimbRateTapeCore(DisplayConfiguration config, Resources res, AssetManager assets,
float x, float y, float w, float h, Model model) {
moveTo(x, y);
sizeTo(w, h);
mModel = model;
mConfig = config;
mIndicatorThickness = (float) Math.floor(w * 0.45);
mIndicatorPaint = new Paint();
mIndicatorPaint.setColor(INDICATOR_COLOR);
mTypeface = Typeface.createFromAsset(assets, config.mTextTypeface);
mTapePixelsPerFpm = (float) 0.9 * (getHeight() / 2) / 2000;
addConstantItems(res);
}
private float getYCoordinate(float value) {
return getHeight() / 2f - value * mTapePixelsPerFpm;
}
private void addTickMark(float thickness, float length, float textSize, float value,
String text) {
float y = getYCoordinate(value);
float mTextLeftBoundaryFromLeft = (float) Math.floor(getWidth() * 0.7);
Widget tick = new Rectangle(mConfig.mLineColor);
tick.moveTo(0, y - thickness / 2f);
tick.sizeTo(length, thickness);
mChildren.add(tick);
if (text != null) {
Widget textWidget = new Text(text, textSize, mConfig.mTextColor, mTypeface);
textWidget.moveTo(mTextLeftBoundaryFromLeft, y - textWidget.getHeight() / 2f);
mChildren.add(textWidget);
}
}
private void addConstantItems(Resources res) {
float mTickMarkLength1000 = (float) Math.floor(getWidth() * 0.55);
float mTickMarkLength500 = (float) Math.floor(getWidth() * 0.45);
float mTextSize1000 = (float) Math.floor(getWidth() * 0.6);
Widget line = new Rectangle(mConfig.mLineColor);
line.moveTo(0f, 0f);
line.sizeTo(mConfig.mThinLineThickness, getHeight());
mChildren.add(line);
for (int i = -2; i <= 2; i++) {
addTickMark(
mConfig.mThickLineThickness,
mTickMarkLength1000,
mTextSize1000,
i * 1000f,
"" + Math.abs(i));
}
for (int i = -3; i <= 3; i += 2) {
addTickMark(
mConfig.mThinLineThickness,
mTickMarkLength500,
0f,
i * 500f,
null);
}
}
@Override
protected void drawContents(Canvas canvas) {
float[] yCoordinates = new float[]{
getHeight() / 2f,
getYCoordinate(mModel.getClimbRate()),
};
canvas.drawRect(
mConfig.mThinLineThickness * 2f, Math.min(yCoordinates[0], yCoordinates[1]),
mConfig.mThinLineThickness + mIndicatorThickness,
Math.max(yCoordinates[0], yCoordinates[1]),
mIndicatorPaint);
super.drawContents(canvas);
}
}