博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【android自己定义控件】自己定义View属性
阅读量:5773 次
发布时间:2019-06-18

本文共 4865 字,大约阅读时间需要 16 分钟。

1、自己定义View的属性

2、在View的构造方法中获得我们自己定义的属性

3、重写onMesure

4、重写onDraw

3这个步骤不是必须,当然了大部分情况下还是须要重写的。

1、自己定义View的属性,首先在res/values/  下建立一个attrs.xml , 在里面定义我们的属性和声明我们的整个样式。

定义了字体,字体颜色,字体大小3个属性,format是值该属性的取值类型:

一共同拥有:string,color,demension,integer,enum,reference,float,boolean,fraction,flag;

编写的时候工具会提醒你使用哪种,不知道也能够Google搜索下

接下来就自己定义View

public class CustomTitleView extends View{    private  String txtName;    private int txtColor,txtSize;    private  Paint mPaint;    private Rect mBounds;    public CustomTitleView(Context context) {        this(context, null);    }    public CustomTitleView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public CustomTitleView(Context context, AttributeSet attrs, int defStyleAttr) {           //详细操作    }}
定义完自己定义的View ,就该调用我们自己定义的View了。

注意代码中的这行,自己定义命名空间,com.example.androidDemo是项目包路径

xmlns:title="http://schemas.android.com/apk/res/com.example.androidDemo"

使用自己定义命名空间:
title:txtName="你好"        title:txtColor="#ffffff"        title:txtSize="16sp"

 在View的构造方法中,获得我们的自己定义的样式 

public class CustomTitleView extends View{    private  String txtName;    private int txtColor,txtSize;    private  Paint mPaint;    private Rect mBounds;    public CustomTitleView(Context context) {        this(context, null);    }    public CustomTitleView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public CustomTitleView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs,R.styleable.titleStyle,defStyleAttr,0);        int n = typedArray.getIndexCount();        for (int i = 0; i < n; i++){            int attr = typedArray.getIndex(i);            switch (attr){                case 0:                    txtName = typedArray.getString(attr);                    break;                case 1:                    txtColor = typedArray.getColor(attr, Color.BLACK);                    break;                case 2:                    txtSize = typedArray.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(                            TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));                    break;            }        }        typedArray.recycle();        /**         * 获得绘制文本的宽和高          */        mPaint = new Paint();        mPaint.setTextSize(txtSize);        // mPaint.setColor(mTitleTextColor);        mBounds = new Rect();        mPaint.getTextBounds(txtName, 0, txtName.length(), mBounds);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {            int widthMode = MeasureSpec.getMode(widthMeasureSpec);            int widthSize = MeasureSpec.getSize(widthMeasureSpec);            int heightMode = MeasureSpec.getMode(heightMeasureSpec);            int heightSize = MeasureSpec.getSize(heightMeasureSpec);            int width;            int height ;            if (widthMode == MeasureSpec.EXACTLY)            {                width = widthSize;            } else            {                mPaint.setTextSize(txtSize);                mPaint.getTextBounds(txtName, 0, txtName.length(), mBounds);                float textWidth = mBounds.width();                int desired = (int) (getPaddingLeft() + textWidth + getPaddingRight());                width = desired;            }            if (heightMode == MeasureSpec.EXACTLY)            {                height = heightSize;            } else            {                mPaint.setTextSize(txtSize);                mPaint.getTextBounds(txtName, 0, txtName.length(), mBounds);                float textHeight = mBounds.height();                int desired = (int) (getPaddingTop() + textHeight + getPaddingBottom());                height = desired;            }            setMeasuredDimension(width, height);    }    @Override    protected void onDraw(Canvas canvas) {        mPaint.setColor(Color.YELLOW);        canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint);        mPaint.setColor(txtColor);        canvas.drawText(txtName, getWidth() / 2 - mBounds.width() / 2, getHeight() / 2 + mBounds.height() / 2, mPaint);    }}

当中

MeasureSpec.EXACTLY推断你传人的宽,高是不是精确赋值
android:layout_width="wrap_content"
 android:layout_height="wrap_content"

假设是wrap_content,

mPaint.setTextSize(txtSize);                mPaint.getTextBounds(txtName, 0, txtName.length(), mBounds);                float textWidth = mBounds.width();                int desired = (int) (getPaddingLeft() + textWidth + getPaddingRight());                width = desired;
假设是200dp这类精确的宽高值,

if (widthMode == MeasureSpec.EXACTLY)            {                width = widthSize;            }
效果图 ,是不是非常好用呢

你可能感兴趣的文章
Puppet 配置管理工具安装
查看>>
Bug多,也别乱来,别被Bug主导了开发
查看>>
sed 替换基础使用
查看>>
高性能的MySQL(5)创建高性能的索引一B-Tree索引
查看>>
附件3:eclipse memory analyze使用教程
查看>>
oracle备份与恢复--rman
查看>>
Postfix邮件发送和接收实验
查看>>
图片变形的抗锯齿处理方法
查看>>
Effective C++ Item 32 确保你的 public 继承模子里出来 is-a 关联
查看>>
phpstorm安装laravel-ide-helper实现自动完成、代码提示和跟踪
查看>>
Resume简历中装B的词汇总结大全
查看>>
python udp编程实例
查看>>
TortoiseSVN中图标的含义
查看>>
js原生继承之——构造函数式继承实例
查看>>
linux定时任务的设置
查看>>
[CareerCup] 13.3 Virtual Functions 虚函数
查看>>
[Angular 2] ng-model and ng-for with Select and Option elements
查看>>
Visio中如何让重叠图形都显示
查看>>
Tasks and Back stack 详解
查看>>
关于EXPORT_SYMBOL的作用浅析
查看>>