安卓学习笔记五

1自定义View

步骤:

1)自定义view的属性

2)在构造方法获得我们自定义的属性

3)重写onMeasure()方法  //非必需

4)重写onDraw()方法

在res/values下新建attr.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>


    <attr name="titleText" format="string" />
    <attr name="titleTextColor" format="color" />
    <attr name="titleTextSize" format="dimension" />


    <declare-styleable name="CustomView">
        <attr name="titleText" />
        <attr name="titleTextColor" />
        <attr name="titleTextSize" />
    </declare-styleable>


</resources>

上述我们定义了字内容,颜色,大小三个属性,和属性的取值类型。。


然后在布局文件中自定义我们View

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:tanlin="http://schemas.android.com/apk/res/com.example.customview"  //我们应用程序的包名
    android:layout_width="match_parent"
    android:layout_height="match_parent" >


    <com.example.customview.CustomView.CustomView  //自定义View的全名或者自定义view包名下的类名
        android:id="@+id/customView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tanlin:titleText="1234"
        android:layout_centerInParent="true"
        tanlin:titleTextColor="#ff0000ff"
        tanlin:titleTextSize="40sp" />


</RelativeLayout>


当我们在布局文件中高度和宽度属性非确定值 android:layout_width="100dp"  和 android:layout_height="100dp",那么系统帮我们测量的宽度和高度是match_parent


所以当我们布局设置 wrap_content,我们需要自己测量,重写onMeasure方法,
     

重写之前先了解MeasureSpec的specMode,一共三种:

EXACTLY:一般是设置了明确的值或者是MATCH_PARENT
AT_MOST:表示子布局限制在一个最大值内,一般为WARP_CONTENT
UNSPECIFIED:表示子布局想要多大就多大,很少使用

下面重写onMeasure方法代码:


int width = 0;
int height = 0;


/**
* 设置宽度
*/
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);
switch (specMode) {
case MeasureSpec.EXACTLY:// 明确指定
width = getPaddingLeft() + getPaddingRight() + specSize;  //如果布局文件没有padding属性,则 getPaddingLeft()和 getPaddingRight()为0
break;
case MeasureSpec.AT_MOST:// 一般为WARP_CONTENT
width = getPaddingLeft() + getPaddingRight() + mBound.width();
break;
}


/**
* 设置高度
*/
specMode = MeasureSpec.getMode(heightMeasureSpec);
specSize = MeasureSpec.getSize(heightMeasureSpec);
switch (specMode) {
case MeasureSpec.EXACTLY:// 明确指定了
height = getPaddingTop() + getPaddingBottom() + specSize;
break;
case MeasureSpec.AT_MOST:// 一般为WARP_CONTENT
height = getPaddingTop() + getPaddingBottom() + mBound.height();
break;
}


setMeasuredDimension(width, height);


Log.i("tanlin", width + "宽度" + "草尖水露" + "高度" + height);


补充:

canvas.drawArc(rectBlackBg, 180, section * 360, false, mPaint);  // 然后绘制进度圆环 ,startAngel为起始角度,为时钟3点钟方向开始;sweepAngel为扫过角度。

LinearGradient shader = new LinearGradient(0, 0, endX, endY, new int[]{startColor, midleColor, endColor},new float[]{0 , 0.5f, 1.0f}, TileMode.MIRROR);
其中参数new int[]{startColor, midleColor, endColor}是参与渐变效果的颜色集合,
其中参数new float[]{0 , 0.5f, 1.0f}是定义每个颜色处于的渐变相对位置,
这个参数可以为null,如果为null表示所有的颜色按顺序均匀的分布































  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值