// Created by plusminus on 17:36:42 - 03.02.2009
package org.androad.ui.map.hud.impl.basic.views;
import org.androad.adt.UnitSystem;
import org.androad.ui.map.hud.IHUDNextActionView;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
public abstract class HUDBaseNextActionView extends HUDBaseView implements IHUDNextActionView {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private final int HUD_TURNARROW_LEFT_OFFSET;
private final int HUD_TURNARROW_TOP_OFFSET;
private final int HUD_TURNLDISTANCELEFT_LEFT_OFFSET;
private final int HUD_TURNLDISTANCELEFT_TOP_OFFSET;
private final int HUD_TURNDISTANCELEFT_UNIT_LEFT_OFFSET;
private final int HUD_TURNLDISTANCELEFT_UNIT_TOP_OFFSET;
private final int HUD_SPEED_LEFT_OFFSET;
private final int HUD_SPEED_TOP_OFFSET;
private final int HUD_SPEED_UNIT_LEFT_OFFSET;
private final int HUD_SPEED_UNIT_TOP_OFFSET;
private final Bitmap TURN_ARROW_LEFT_90;
private final Bitmap TURN_ARROW_LEFT_45;
private final Bitmap TURN_ARROW_LEFT_25;
private final Bitmap TURN_ARROW_RIGHT_90;
private final Bitmap TURN_ARROW_RIGHT_45;
private final Bitmap TURN_ARROW_RIGHT_25;
private final Bitmap TURN_ARROW_STRAIGHT;
private final Bitmap TURN_TARGET_REACHED;
protected float mNextTurnAngle = NOT_SET;
protected float mCurrentSpeed = NOT_SET;
protected boolean showTargetReachedInsteadOfAngle = false;
// ===========================================================
// Constructors
// ===========================================================
public HUDBaseNextActionView(final Context context, final AttributeSet attrs, final int hud_turnarrow_left_offset,
final int hud_turnarrow_top_offset,
final int hud_turnldistanceleft_left_offset,
final int hud_turnldistanceleft_top_offset,
final int hud_turndistanceleft_unit_left_offset,
final int hud_turnldistanceleft_unit_top_offset,
final int hud_speed_left_offset,
final int hud_speed_top_offset,
final int hud_speed_unit_left_offset,
final int hud_speed_unit_top_offset,
final Bitmap turn_arrow_left_90,
final Bitmap turn_arrow_left_45,
final Bitmap turn_arrow_left_25,
final Bitmap turn_arrow_right_90,
final Bitmap turn_arrow_right_45,
final Bitmap turn_arrow_right_25,
final Bitmap turn_arrow_straight,
final Bitmap turn_target_reaced) {
super(context, attrs);
this.TURN_ARROW_LEFT_90 = turn_arrow_left_90;
this.TURN_ARROW_LEFT_45 = turn_arrow_left_45;
this.TURN_ARROW_LEFT_25 = turn_arrow_left_25;
this.TURN_ARROW_RIGHT_90 = turn_arrow_right_90;
this.TURN_ARROW_RIGHT_45 = turn_arrow_right_45;
this.TURN_ARROW_RIGHT_25 = turn_arrow_right_25;
this.TURN_ARROW_STRAIGHT = turn_arrow_straight;
this.TURN_TARGET_REACHED = turn_target_reaced;
this.HUD_TURNARROW_LEFT_OFFSET = hud_turnarrow_left_offset;
this.HUD_TURNARROW_TOP_OFFSET = hud_turnarrow_top_offset;
this.HUD_TURNLDISTANCELEFT_LEFT_OFFSET = hud_turnldistanceleft_left_offset;
this.HUD_TURNLDISTANCELEFT_TOP_OFFSET = hud_turnldistanceleft_top_offset;
this.HUD_TURNDISTANCELEFT_UNIT_LEFT_OFFSET = hud_turndistanceleft_unit_left_offset;
this.HUD_TURNLDISTANCELEFT_UNIT_TOP_OFFSET = hud_turnldistanceleft_unit_top_offset;
this.HUD_SPEED_LEFT_OFFSET = hud_speed_left_offset;
this.HUD_SPEED_TOP_OFFSET = hud_speed_top_offset;
this.HUD_SPEED_UNIT_LEFT_OFFSET = hud_speed_unit_left_offset;
this.HUD_SPEED_UNIT_TOP_OFFSET = hud_speed_unit_top_offset;
onInitiatePaint(super.mHudTextPaint);
}
// ===========================================================
// Getter & Setter
// ===========================================================
@Override
public void setTurnAngle(final float aAngle){
this.mNextTurnAngle = aAngle;
this.showTargetReachedInsteadOfAngle = false;
}
@Override
public void setCurrentMeterSpeed(final float aMeterSpeed){
this.mCurrentSpeed = aMeterSpeed * this.mUnitSystem.mScaleToMetersPerSecond;
}
@Override
public void reset(){
super.reset();
this.mNextTurnAngle = NOT_SET;
}
@Override
public void showTargetReached() {
this.showTargetReachedInsteadOfAngle = true;
}
// ===========================================================
// Methods from SuperClass/Interfaces
// ===========================================================
protected abstract void onInitiatePaint(final Paint pHudTextPaint);
protected abstract void onConfigureValuePaint(final Paint pHudTextPaint);
protected abstract void onConfigureUnitPaint(final Paint pHudTextPaint);
@Override
public void recycle() {
this.TURN_ARROW_LEFT_90.recycle();
this.TURN_ARROW_LEFT_45.recycle();
this.TURN_ARROW_LEFT_25.recycle();
this.TURN_ARROW_RIGHT_90.recycle();
this.TURN_ARROW_RIGHT_45.recycle();
this.TURN_ARROW_RIGHT_25.recycle();
this.TURN_ARROW_STRAIGHT.recycle();
this.TURN_TARGET_REACHED.recycle();
}
@Override
protected void onDraw(final Canvas canvas) {
super.onDraw(canvas);
final float densityFactor = getContext().getResources().getDisplayMetrics().density;
if(this.showTargetReachedInsteadOfAngle){
canvas.drawBitmap(this.TURN_TARGET_REACHED, this.HUD_TURNARROW_LEFT_OFFSET * densityFactor, this.HUD_TURNARROW_TOP_OFFSET * densityFactor, this.mFullOpaquePaint);
}else{
if(this.mNextTurnAngle != NOT_SET) {
canvas.drawBitmap(getArrowFromAngle(), this.HUD_TURNARROW_LEFT_OFFSET * densityFactor, this.HUD_TURNARROW_TOP_OFFSET * densityFactor, this.mFullOpaquePaint);
}
}
if(this.mDistance != NOT_SET){
refreshDistanceStrings();
onConfigureValuePaint(this.mHudTextPaint);
canvas.drawText(this.mDistanceStrings[UnitSystem.DISTSTRINGS_DIST_ID], this.HUD_TURNLDISTANCELEFT_LEFT_OFFSET * densityFactor, this.HUD_TURNLDISTANCELEFT_TOP_OFFSET * densityFactor, this.mHudTextPaint);
/* And the unit above. */
onConfigureUnitPaint(this.mHudTextPaint);
canvas.drawText(this.mDistanceStrings[UnitSystem.DISTSTRINGS_UNIT_ID], this.HUD_TURNDISTANCELEFT_UNIT_LEFT_OFFSET * densityFactor, this.HUD_TURNLDISTANCELEFT_UNIT_TOP_OFFSET * densityFactor, this.mHudTextPaint);
}else if(this.mCurrentSpeed != NOT_SET){
onConfigureValuePaint(this.mHudTextPaint);
canvas.drawText("" + (int)this.mCurrentSpeed, this.HUD_SPEED_LEFT_OFFSET * densityFactor, this.HUD_SPEED_TOP_OFFSET * densityFactor, this.mHudTextPaint);
/* And the unit above. */
onConfigureUnitPaint(this.mHudTextPaint);
canvas.drawText("" + this.mUnitSystem.mAbbrKilometersPerHourScale, this.HUD_SPEED_UNIT_LEFT_OFFSET * densityFactor, this.HUD_SPEED_UNIT_TOP_OFFSET * densityFactor, this.mHudTextPaint);
}
}
// ===========================================================
// Methods
// ===========================================================
protected final Bitmap getArrowFromAngle() {
final int turnAngle = (int)this.mNextTurnAngle;
if(turnAngle > 60) {
return this.TURN_ARROW_LEFT_90;
} else if(turnAngle > 35) {
return this.TURN_ARROW_LEFT_45;
} else if(turnAngle > 15) {
return this.TURN_ARROW_LEFT_25;
} else if(turnAngle <= 15 && turnAngle >= -15) {
return this.TURN_ARROW_STRAIGHT;
} else if(turnAngle > -35) {
return this.TURN_ARROW_RIGHT_25;
} else if(turnAngle > -60) {
return this.TURN_ARROW_RIGHT_45;
} else {
return this.TURN_ARROW_RIGHT_90;
}
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}