初次实践自定义View

我一直觉得自定义View比较难实现,之前也看过一些别人的代码和介绍

今天就自己尝试着写了一段

首先  我们要写一个Class类文件继承 view,并且实现构造方法;

public CostomView(Context context) {
    super(context);
}

public CostomView(Context context, AttributeSet attrs) {
    super(context, attrs);
  
}

对于自定义View,我们可以设置一些属性,通过构造方法加载

在res文件夹下的values文件夹中建立名为“attrs”的xml文件,在该文件里我们设置自定义view需要用到的属性

<!--声明我们的属性,名字为CostomView-->
<declare-styleable name="CostomView">
    <!--声明我们的属性,名称为color,取值类型为color-->
    <attr name="color" format="color"/>
</declare-styleable>
接下来,我们就需要在构造方法中将属性引入:

public CostomView(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.CostomView);
    color=a.getColor(R.styleable.CostomView_color, Color.BLACK);
    LogUtils.ytf("构造方法");
    a.recycle();//一定要调用
}
这样,我们就可以在布局文件中设置颜色值;

接下来,要实现测量的方法:onMeasure()

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//重写测量方法
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
   
}
这里要着重说一下  widthMeasureSpec和heightMeasureSpec,这两个参数分别带有两项信息,即模式和大小;

模式有三种,可以自行百度;

代码:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//重写测量方法
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int width=getMySize(100,widthMeasureSpec);
    int height=getMySize(100,heightMeasureSpec);
    LogUtils.ytf("onMeasure"+width+";"+height);
    setMeasuredDimension(width,height);//设置控件的宽高
}
public int getMySize(int defaultSize,int measure){
    int MySize=defaultSize;
    int mode=MeasureSpec.getMode(measure);
    int size=MeasureSpec.getSize(measure);
    switch (mode){
        case MeasureSpec.AT_MOST:
            MySize=size;
            break;
        case MeasureSpec.EXACTLY:
            MySize=size;
            break;
        case MeasureSpec.UNSPECIFIED:
            MySize=defaultSize;
            break;
    }
    return MySize;
}
设置完控件的宽高之后,最重要的一步就是把它画出来:onDraw

@Override
protected void onDraw(Canvas canvas) {//画出自定义VIew
    super.onDraw(canvas);
    LogUtils.ytf("onDraw");
    //定义一直画笔
    Paint mPaint=new Paint();
    mPaint.setColor(color);
    int r=getMeasuredWidth()/2;
    int fx=getLeft()+r;
    int fy=getTop()+r;
    canvas.drawCircle(fx,fy,r,mPaint);//在画布上画出来

}

到这 一个圆形的自定义view就已经实现了

我们可以在布局文件中使用

<com.example.administrator.text.View.CostomView
    android:layout_width="100dp"
    android:layout_height="100dp"
    ytf:color="#ff45dd"
    />




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值