/*
* This file is part of WhereYouGo.
*
* WhereYouGo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* WhereYouGo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with WhereYouGo. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright (C) 2012 Menion <whereyougo@asamm.cz>
*/
package menion.android.whereyougo.guiding;
import menion.android.whereyougo.R;
import menion.android.whereyougo.settings.Loc;
import menion.android.whereyougo.utils.A;
import menion.android.whereyougo.utils.Images;
import menion.android.whereyougo.utils.Utils;
import menion.android.whereyougo.utils.UtilsFormat;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
/**
* @author menion
* @since 25.1.2010 2010
*/
public class CompassView extends View {
private float mAzimuth;
/* azimuth for target arrow */
private float mAzimuthToTarget;
/* distance to target */
private double mDistanceToTarget;
private float cX1, cY1;
private float r1;
private Paint mPaintBitmap;
private Paint paintValueLabel;
private Paint paintValueDistance;
private Paint paintValueAzimuth;
private Paint paintValueTilt;
private Drawable bitCompassBg;
private Drawable bitCompassArrow;
public CompassView(Context context, AttributeSet attr) {
super(context, attr);
initialize();
}
public CompassView(Context context) {
super(context);
initialize();
}
private void initialize() {
mAzimuth = 0.0f;
mAzimuthToTarget = 0.0f;
// load images
bitCompassBg = Images.getImageD(R.drawable.var_compass);
bitCompassArrow = Images.getImageD(R.drawable.var_compass_arrow);
// set paint methods
mPaintBitmap = new Paint();
mPaintBitmap.setAntiAlias(true);
mPaintBitmap.setFilterBitmap(true);
paintValueLabel = new Paint();
paintValueLabel.setAntiAlias(true);
paintValueLabel.setTextAlign(Align.CENTER);
paintValueLabel.setColor(Color.WHITE);
paintValueLabel.setTextSize(Utils.getDpPixels(12.0f));
paintValueDistance = new Paint(paintValueLabel);
paintValueAzimuth = new Paint(paintValueDistance);
paintValueTilt = new Paint(paintValueDistance);
paintValueTilt.setColor(Color.parseColor("#00a2e6"));
paintValueTilt.setTypeface(Typeface.DEFAULT_BOLD);
paintValueTilt.setShadowLayer(Utils.getDpPixels(3), 0, 0, Color.BLACK);
}
private int lastWidth;
private void setConstants(Canvas c) {
if (lastWidth == c.getWidth())
return;
lastWidth = c.getWidth();
// set basic constants
int w = c.getClipBounds().width();
int h = c.getClipBounds().height();
float neededHeight = Math.min(w, h);
r1 = neededHeight / 2 * 0.90f;
cX1 = w / 2.0f;
cY1 = h / 2.0f;
// center distance text
paintValueDistance.setTextSize(r1 / 5);
paintValueAzimuth.setTextSize(r1 / 6);
paintValueTilt.setTextSize(r1 / 8);
}
public void draw(Canvas c) {
// init basic values
setConstants(c);
// draw background
c.save();
c.translate(cX1, cY1);
c.rotate(-mAzimuth);
bitCompassBg.setBounds((int) (-r1), (int) (-r1), (int) (+r1), (int) (+r1));
bitCompassBg.draw(c);
c.restore();
if (A.getGuidingContent().isGuiding()) {
c.save();
c.translate(cX1, cY1);
c.rotate(mAzimuthToTarget - mAzimuth);
bitCompassArrow.setBounds((int) (-r1), (int) (-r1), (int) (+r1), (int) (+r1));
bitCompassArrow.draw(c);
c.restore();
}
// draw compass texts
drawCompassTexts(c);
}
private void drawCompassTexts(Canvas c) {
float space = r1 / 20;
c.drawText(Loc.get(R.string.distance),
cX1, cY1 - paintValueDistance.getTextSize() - space, paintValueLabel);
c.drawText(UtilsFormat.formatDistance(mDistanceToTarget, false),
cX1, cY1 - space, paintValueDistance);
c.drawText(Loc.get(R.string.azimuth),
cX1, cY1 + paintValueLabel.getTextSize() + space, paintValueLabel);
c.drawText(UtilsFormat.formatAngle(mAzimuth),
cX1, cY1 + paintValueLabel.getTextSize() +
paintValueAzimuth.getTextSize() + space, paintValueAzimuth);
}
/**
* Function which rotate arrow and compas (angles in degrees)
* @param azimuth new angle for compas north
* @param azimuthDiff new angle for arrow
*/
public void moveAngles(float azimuthToTarget, float azimuth, float pitch, float roll) {
this.mAzimuthToTarget = azimuthToTarget;
this.mAzimuth = azimuth;
invalidate();
}
public void setDistance(double distance) {
this.mDistanceToTarget = distance;
invalidate();
}
}