自定义控件(一)

自定义控件的编写,肯定是大多数初学者的魔音哈。那么我在这讲一下,我自己在编写自定义控件中代码中的思路

首先:确定自己要自定义的控件,是可以继承已有的系统控件进行编写,还是得继承View,完全自己写。

第二:你得知道View绘制的几个步骤

1.onMeasure: 只有测算了之后,才能获取View的高度和宽度

       onMeasure有三种测量mode:

(1) EXACTLY :根据specSize设置

(2) At_MOST:子视图最大的size设置

(3) UNSPECIFIED :没任何限制,不太常用

 我们可以通过MeasureSpec.makeMeasureSpec(size,mode) 对View进行配置。

2.onLayout:这个只有在复写ViewGroup的时候才需要重写

3.onDraw:绘制,就是绘制具体的内容

那么,偶就来举个简单的栗子:   比如说,想要做一个温度刻度类的东西如下图所示:




上图的这个需求很简单,跟着我的思路走:

1.能不能继承已有的控件?  不可以,需要自己继承View自定义

2.需要重写哪些方法?首先是onMeasure,因为需要对刻度进行计算

        然后是onDraw,需要自己绘制图形

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    //每一个刻度的宽度
    degreeWidth = getMeasuredWidth()/80;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //首先画一条直线
    Paint linePaint = new Paint();
    linePaint.setAntiAlias(true);
    linePaint.setColor(getResources().getColor(R.color.colorAccent));
    canvas.drawLine(0, 50, getWidth(), 50, linePaint);
    //然后在线上画刻度
    Paint degreePaint = new Paint();
    degreePaint.setStrokeWidth(3);
    int xDgree  = 0;
    for(int i = 0;i<80;i++){
        //当它为正数的时候,线要更长,并且要有字
        if(i % 10 == 0){
            degreePaint.setStrokeWidth(3);
            degreePaint.setTextSize(15);
            degreePaint.setColor(getResources().getColor(R.color.colorAccent));
            int x = i/10;
            int degreeX = x*degreeWidth*10;
            canvas.drawLine(degreeX +degreeWidth*5 ,30,degreeX+degreeWidth*5,50,degreePaint);
            //刻度值为
            degree = x +35;
            //可以测量出text的长度
            float degreeLength = degreePaint.measureText(String.valueOf(degree));
            //为了让text位置相对刻度居中,所以需要在绘制text的时候除以2
            canvas.drawText(String.valueOf(degree),degreeX+degreeWidth*5-degreeLength/2,25,degreePaint);
        }else{
            //对小刻度进行绘制
            if(i<=70) {
                degreePaint.setStrokeWidth(1);
                degreePaint.setColor(getResources().getColor(R.color.colorPrimary));
                canvas.drawLine(degreeWidth * 5 + i * degreeWidth, 40, degreeWidth * 5 + i * degreeWidth, 50, degreePaint);
            }
        }
    }


资源下载:http://download.csdn.net/detail/qq_29375071/9380383



android studio直接运行






android studio直接运行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值