Compass (Compass) is a custom view that inherits the view class, overriding the bounds (onmeasure) and content (OnDraw) of the views;
As shown in figure:
The following is the specific design of the compass:
1. Create Compassview class, compass view
Location: Java->package->compassview
Package Mzx.spike.compass.app;
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;
Import android.view.accessibility.AccessibilityEvent;
/** * Created by C.l.wang on 14-3-16. * * public class Compassview extends View {private float bearing;//azimuth public void setbearing FL
Oat _bearing) {bearing = _bearing;
Sendaccessibilityevent (accessibilityevent.type_view_text_changed);
public float getbearing () {return bearing;
Private Paint Markerpaint;
Private Paint Textpaint;
Private Paint Circlepaint;
Private String northstring;
Private String eaststring;
Private String southstring;
Private String weststring;
private int textHeight;
Public Compassview { Super (context);
Initcompassview ();
Public Compassview (context, AttributeSet attrs) {Super (context, attrs);
Initcompassview (); Public Compassview (context, AttributeSet attrs, int defaultstyle) {Super (context, attrs,
DefaultStyle);
Initcompassview ();
private void Initcompassview () {setfocusable (true);
Resources R = This.getresources ();
Circlepaint = new Paint (Paint.anti_alias_flag);
Circlepaint.setcolor (R.getcolor (R.color.background_color)); Circlepaint.setstrokewidth (1);
Stroke width Circlepaint.setstyle (Paint.Style.FILL_AND_STROKE);
northstring = r.getstring (R.string.cardinal_north);
eaststring = r.getstring (r.string.cardinal_east);
southstring = r.getstring (R.string.cardinal_south);
weststring = r.getstring (r.string.cardinal_west);
Textpaint = new Paint (Paint.anti_alias_flag);
Textpaint.setcolor (R.getcolor (R.color.text_color));
TextHeight = (int) textpaint.measuretext ("YY");
Markerpaint = new Paint (Paint.anti_alias_flag);
Markerpaint.setcolor (R.getcolor (R.color.marker_color)); @Override protected void onmeasure (int widthmeasurespec, int heightmeasurespec) {int measure
dwidth = measure (Widthmeasurespec);
int measuredheight = measure (Heightmeasurespec);
int d = math.min (Measuredwidth, measuredheight);
Setmeasureddimension (d, D);
protected int measure (int measurespec) {int result;
int specmode = Measurespec.getmode (Measurespec);
int specsize = measurespec.getsize (Measurespec);
if (Specmode = = measurespec.unspecified) {result = 200; else {result = Specsize;
return result;
} @Override protected void OnDraw (Canvas Canvas) {int mmeasuredwidth = Getmeasuredwidth ();
int mmeasuredheight = Getmeasuredheight ();
int px = MMEASUREDWIDTH/2;
int py = MMEASUREDHEIGHT/2;
int radius = math.min (px, py);
Canvas.drawcircle (px, py, radius, circlepaint);
Canvas.save (); Canvas.rotate (-bearing, px, py);
The opposite direction rotates int textWidth = (int) textpaint.measuretext ("W");
int cardinalx = PX-TEXTWIDTH/2;
int cardinaly = Py-radius+textheight;
for (int i=0; i<24; i++) {canvas.drawline (px, Py-radius, px, py-radius+10, markerpaint);
Canvas.save ();
Canvas.translate (0, textHeight);
if (i%6 = = 0) {String dirstring = ""; switch (i) {case (0): {dirstring = northstring;
int arrowy = 2*textheight;
Canvas.drawline (px, arrowy, px-5, 3*textheight, Markerpaint);
Canvas.drawline (px, arrowy, px+5, 3*textheight, Markerpaint);
Break Case (6): dirstring = eaststring;
Break Case (a): Dirstring = southstring;
Break Case (a): Dirstring = weststring;
Break
} canvas.drawtext (Dirstring, Cardinalx, Cardinaly, Textpaint);
else if (i%3 = = 0) {String angle = string.valueof (i*15);
float angletextwidth = textpaint.measuretext (angle);
int angletextx = (int) (PX-ANGLETEXTWIDTH/2);
int angletexty = Py-radius+textheight; Canvas.drawtext (ANgle, Angletextx, Angletexty, Textpaint);
} canvas.restore ();
Canvas.rotate (px, py);
} canvas.restore ();
@Override public boolean dispatchpopulateaccessibilityevent (final Accessibilityevent event) {
Super.dispatchpopulateaccessibilityevent (event);
if (Isshown ()) {String bearingstr = string.valueof (bearing);
Event.gettext (). Add (BEARINGSTR);
return true;
else return false; }
}
This class of code more, detailed:
See more highlights of this column: http://www.bianceng.cnhttp://www.bianceng.cn/OS/extra/