通过canvas和paint工具并继承view类自定义控件举例

首先创建主活动:

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", "通过");
    }
}




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值