package com.example.ipcplayer.customview;
import com.example.ipcplayer.R;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class CompassView extends View{
private Paint mMarkerPaint;
private Paint mTextPaint;
private Paint mCirclePaint;
private String mNorthString;
private String mSouthString;
private String mEastString;
private String mWestString;
private int mTextHeight;
private float mBearing;
public CompassView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initCompassView();
}
public CompassView(Context context, AttributeSet attrs) {
super(context, attrs);
initCompassView();
}
public CompassView(Context context) {
super(context);
initCompassView();
}
public float getBearing(){
return mBearing;
}
public void setBearing(float bearing){
this.mBearing = bearing;
}
private void initCompassView(){
Resources r = this.getResources();
mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCirclePaint.setColor(r.getColor(R.color.background_color));
mCirclePaint.setStrokeWidth(1);
mCirclePaint.setStyle(Paint.Style.FILL_AND_STROKE);
mSouthString = r.getString(R.string.cardinal_south);
mNorthString = r.getString(R.string.cardinal_north);
mEastString = r.getString(R.string.cardinal_east);
mWestString = r.getString(R.string.cardinal_west);
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.setColor(r.getColor(R.color.text_color));
mTextHeight = (int) mTextPaint.measureText("yY");
mMarkerPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mMarkerPaint.setColor(r.getColor(R.color.marker_color));
}
@Override
protected void onDraw(Canvas canvas) {
int px = getMeasuredWidth()/2;
int py = getMeasuredHeight()/2;
int radius = Math.min(px, py);
canvas.drawCircle(px, py, radius, mCirclePaint);
canvas.rotate(-mBearing,px,py);
int textWidth = (int) mTextPaint.measureText("W");
int cardinalX = px - textWidth/2;
int cardinalY = py-radius+mTextHeight;
// canvas.drawText(mWestString, cardinalX, cardinalY, mTextPaint);
for(int i=0;i<24;i++){
canvas.drawLine(px, py-radius, px, py-radius+10, mMarkerPaint);
canvas.save();
canvas.translate(0, mTextHeight);
if (i % 6 == 0) {
String dirString = "";
switch (i) {
case (0): {
dirString = mNorthString;
int arrowY = 2 * mTextHeight;
canvas.drawLine(px, arrowY, px - 5, 3 * mTextHeight,
mMarkerPaint);
canvas.drawLine(px, arrowY, px + 5, 3 * mTextHeight,
mMarkerPaint);
break;
}
case (6):
dirString = mEastString;
break;
case (12):
dirString = mSouthString;
break;
case (18):
dirString = mWestString;
break;
}
canvas.drawText(dirString, cardinalX, cardinalY, mTextPaint);
} else if (i % 3 == 0) {
String angle = String.valueOf(i * 15);
float angleTextWidth = mTextPaint.measureText(angle);
int angleTextX = (int) (px - angleTextWidth / 2);
int angleTextY = py - radius + mTextHeight;
canvas.drawText(angle, angleTextX, angleTextY, mTextPaint);
}
canvas.restore();
canvas.rotate(15, px, py);
}
canvas.restore();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int measureWidth = measure(widthMeasureSpec);
int measureHeight = measure(heightMeasureSpec);
int d = Math.min(measureWidth, measureHeight);
setMeasuredDimension(d, d);
}
private int measure(int measureSpec){
int result = 0;
int model = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if(model == MeasureSpec.UNSPECIFIED){
result = 200;
}else{
result = specSize;
}
return result;
}
}