首先创建主活动:
public class CompassViewActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
CompassView compassview = new CompassView(this);
compassview =(CompassView)this.findViewById(R.id.compassview);
compassview.setBearing(45);
}
}
///自定义CompassView类并继承view类
public class CompassView extends View {
//初始化所有使用的资源工具
private Paint markerPaint;
private Paint textPaint;
private Paint circlePaint;
private String northString;
private String southString;
private String eastString;
private String westString;
private int textHeight;
public CompassView(Context context){
super(context);
Log.i("test1", "通过");
initCompassView();
Log.i("test2", "通过");
}
public CompassView(Context context,AttributeSet attrs){
super(context,attrs);
initCompassView();
}
public CompassView (Context context,AttributeSet attrs,int defaultStyle){
super(context,attrs,defaultStyle);
}
//初始化功能方法……
protected void initCompassView(){
setFocusable(true);
//初始化画圆的画笔属性
circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); //初始化画笔
circlePaint.setColor(R.color.backgroud_color); //设置画笔颜色
circlePaint.setStrokeWidth(1); //设置变现宽度
circlePaint.setStyle(Paint.Style.FILL_AND_STROKE); //设置画笔填充类型
Resources r = this.getResources();
northString = r.getString(R.string.cardinal_north);
southString = r.getString(R.string.cardinal_south);
eastString = r.getString(R.string.cardinal_east);
westString = r.getString(R.string.cardinal_west);
textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
textPaint.setColor(R.color.text_color);
textHeight = (int)textPaint.measureText("Yy");
markerPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
markerPaint.setColor(R.color.marker_color);
}
//重写onmesure()方法
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 specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if(specMode == MeasureSpec.UNSPECIFIED){
result = 200;
}else{
result = specSize;
}
return result;
}
//添加显示方向属性
private float bearing;
public void setBearing(float _bearing){
bearing = _bearing;
}
public float getBearing(){
return bearing;
}
//利用画笔工具重写ondraw()函数进行绘图
protected void onDraw(Canvas canvas){
//找到控件中心
int px = getMeasuredWidth()/2;
int py = getMeasuredHeight()/2;
int radius = Math.min(px, py);
canvas.drawCircle(px, py, radius, circlePaint);
canvas.save();
canvas.rotate(-bearing, px, py);
super.onDraw(canvas);
int textWidth = (int)textPaint.measureText("W");
int cardinalX = px-textWidth/2;
int cardinalY = py-radius+textHeight;
Log.i("test3", "通过");
//每隔15度绘制一个标记,每隔45度绘制一个方向
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 (12):
dirString = southString;break;
case (18):
dirString = westString;break;
}
canvas.drawText(dirString, cardinalX, cardinalY, textPaint);
}
else if(i % 3 == 0){
String angle = String.valueOf(15*i);
float angleTextWidth = textPaint.measureText(angle);
int angleTextX = (int)(px-angleTextWidth/2);
int angleTextY = (int)(py-radius+textHeight);
canvas.drawText(angle, angleTextX, angleTextY, textPaint);
}
canvas.restore();
canvas.rotate(10,px,py);
}
canvas.restore();
Log.i("test4", "通过");
}
}
在布局中生命控件或在程序中初始化控件
首先创建主活动:
public class CompassViewActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); CompassView compassview = new CompassView(this); compassview =(CompassView)this.findViewById(R.id.compassview); compassview.setBearing(45); } }
///自定义CompassView类并继承view类
public class CompassView extends View { //初始化所有使用的资源工具 private Paint markerPaint; private Paint textPaint; private Paint circlePaint; private String northString; private String southString; private String eastString; private String westString; private int textHeight; public CompassView(Context context){ super(context); Log.i("test1", "通过"); initCompassView(); Log.i("test2", "通过"); } public CompassView(Context context,AttributeSet attrs){ super(context,attrs); initCompassView(); } public CompassView (Context context,AttributeSet attrs,int defaultStyle){ super(context,attrs,defaultStyle); } //初始化功能方法…… protected void initCompassView(){ setFocusable(true); //初始化画圆的画笔属性 circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); //初始化画笔 circlePaint.setColor(R.color.backgroud_color); //设置画笔颜色 circlePaint.setStrokeWidth(1); //设置变现宽度 circlePaint.setStyle(Paint.Style.FILL_AND_STROKE); //设置画笔填充类型 Resources r = this.getResources(); northString = r.getString(R.string.cardinal_north); southString = r.getString(R.string.cardinal_south); eastString = r.getString(R.string.cardinal_east); westString = r.getString(R.string.cardinal_west); textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); textPaint.setColor(R.color.text_color); textHeight = (int)textPaint.measureText("Yy"); markerPaint = new Paint(Paint.ANTI_ALIAS_FLAG); markerPaint.setColor(R.color.marker_color); } //重写onmesure()方法 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 specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); if(specMode == MeasureSpec.UNSPECIFIED){ result = 200; }else{ result = specSize; } return result; } //添加显示方向属性 private float bearing; public void setBearing(float _bearing){ bearing = _bearing; } public float getBearing(){ return bearing; } //利用画笔工具重写ondraw()函数进行绘图 protected void onDraw(Canvas canvas){ //找到控件中心 int px = getMeasuredWidth()/2; int py = getMeasuredHeight()/2; int radius = Math.min(px, py); canvas.drawCircle(px, py, radius, circlePaint); canvas.save(); canvas.rotate(-bearing, px, py); super.onDraw(canvas); int textWidth = (int)textPaint.measureText("W"); int cardinalX = px-textWidth/2; int cardinalY = py-radius+textHeight; Log.i("test3", "通过"); //每隔15度绘制一个标记,每隔45度绘制一个方向 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 (12): dirString = southString;break; case (18): dirString = westString;break; } canvas.drawText(dirString, cardinalX, cardinalY, textPaint); } else if(i % 3 == 0){ String angle = String.valueOf(15*i); float angleTextWidth = textPaint.measureText(angle); int angleTextX = (int)(px-angleTextWidth/2); int angleTextY = (int)(py-radius+textHeight); canvas.drawText(angle, angleTextX, angleTextY, textPaint); } canvas.restore(); canvas.rotate(10,px,py); } canvas.restore(); Log.i("test4", "通过"); } }
在布局中生命控件或在程序中初始化控件
首先创建主活动: public class CompassViewActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); CompassView compassview = new CompassView(this); compassview =(CompassView)this.findViewById(R.id.compassview); compassview.setBearing(45); } } ///自定义CompassView类并继承view类 public class CompassView extends View { //初始化所有使用的资源工具 private Paint markerPaint; private Paint textPaint; private Paint circlePaint; private String northString; private String southString; private String eastString; private String westString; private int textHeight; public CompassView(Context context){ super(context); Log.i("test1", "通过"); initCompassView(); Log.i("test2", "通过"); } public CompassView(Context context,AttributeSet attrs){ super(context,attrs); initCompassView(); } public CompassView (Context context,AttributeSet attrs,int defaultStyle){ super(context,attrs,defaultStyle); } //初始化功能方法…… protected void initCompassView(){ setFocusable(true); //初始化画圆的画笔属性 circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); //初始化画笔 circlePaint.setColor(R.color.backgroud_color); //设置画笔颜色 circlePaint.setStrokeWidth(1); //设置变现宽度 circlePaint.setStyle(Paint.Style.FILL_AND_STROKE); //设置画笔填充类型 Resources r = this.getResources(); northString = r.getString(R.string.cardinal_north); southString = r.getString(R.string.cardinal_south); eastString = r.getString(R.string.cardinal_east); westString = r.getString(R.string.cardinal_west); textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); textPaint.setColor(R.color.text_color); textHeight = (int)textPaint.measureText("Yy"); markerPaint = new Paint(Paint.ANTI_ALIAS_FLAG); markerPaint.setColor(R.color.marker_color); } //重写onmesure()方法 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 specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); if(specMode == MeasureSpec.UNSPECIFIED){ result = 200; }else{ result = specSize; } return result; } //添加显示方向属性 private float bearing; public void setBearing(float _bearing){ bearing = _bearing; } public float getBearing(){ return bearing; } //利用画笔工具重写ondraw()函数进行绘图 protected void onDraw(Canvas canvas){ //找到控件中心 int px = getMeasuredWidth()/2; int py = getMeasuredHeight()/2; int radius = Math.min(px, py); canvas.drawCircle(px, py, radius, circlePaint); canvas.save(); canvas.rotate(-bearing, px, py); super.onDraw(canvas); int textWidth = (int)textPaint.measureText("W"); int cardinalX = px-textWidth/2; int cardinalY = py-radius+textHeight; Log.i("test3", "通过"); //每隔15度绘制一个标记,每隔45度绘制一个方向 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 (12): dirString = southString;break; case (18): dirString = westString;break; } canvas.drawText(dirString, cardinalX, cardinalY, textPaint); } else if(i % 3 == 0){ String angle = String.valueOf(15*i); float angleTextWidth = textPaint.measureText(angle); int angleTextX = (int)(px-angleTextWidth/2); int angleTextY = (int)(py-radius+textHeight); canvas.drawText(angle, angleTextX, angleTextY, textPaint); } canvas.restore(); canvas.rotate(10,px,py); } canvas.restore(); Log.i("test4", "通过"); } } 在布局中生命控件或在程序中初始化控件
public class CompassViewActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { Log.i("test5", "通过"); super.onCreate(savedInstanceState); Log.i("test6", "通过"); CompassView compassview = new CompassView(this); compassview.setBearing(45); compassview =(CompassView)this.findViewById(R.id.compassview); setContentView(R.layout.main); Log.i("test7", "通过"); } }