package org.wheelmap.android.view; import org.wheelmap.android.online.R; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; public class CompassView extends View { private float direction = 0; private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); private boolean firstDraw; private int mColor; private final static int DEFAULT_COLOR_RES = R.color.dark_grey_one; private static String TAG = CompassView.TAG; public void setName(String name) { this.name = name; } private String name; public CompassView(Context context) { super(context); init(); } public CompassView(Context context, AttributeSet attrs) { super(context, attrs); initAttributes(attrs); init(); } public CompassView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initAttributes(attrs); init(); } private void initAttributes(AttributeSet attrs) { TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CompassView); try { mColor = a.getColor(R.styleable.CompassView_compassview_color, getContext() .getResources().getColor(DEFAULT_COLOR_RES)); } finally { a.recycle(); } } private void init() { paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(2); paint.setColor(mColor); firstDraw = true; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)); } @Override protected void onDraw(Canvas canvas) { int cxCompass = getMeasuredWidth() / 2; int cyCompass = getMeasuredHeight() / 2; float radiusCompass; if (cxCompass > cyCompass) { radiusCompass = (float) (cyCompass * 0.9); } else { radiusCompass = (float) (cxCompass * 0.9); } canvas.drawCircle(cxCompass, cyCompass, radiusCompass, paint); if (!firstDraw) { //Log.d("CompassView","id: " + name + " ---- d: " + direction); canvas.drawLine( cxCompass, cyCompass, (float) (cxCompass + radiusCompass * Math.cos(Math.toRadians(direction))), (float) (cyCompass - radiusCompass * Math.sin(Math.toRadians(direction))), paint); } } public void updateDirection(float dir) { firstDraw = false; direction = dir; invalidate(); //Log.d("CompassView", "-------------------- new -----------------"); } }