不知道大家在实际开发中有没有自定义过UI模板?今天花时间研究了一下Android中自定义UI模板,与大家分享一下。
每个设计良好的App都是自定义标题栏,在自定义标题栏的过程中大部分人可能都是自定义一个标题的xml文件,然后在需要的地方直接通过include来引用,这比起在每个布局文件中写标题栏已经进化很多了,但仍然不是最简单有效的方法,我们为什么不能自定义一个标题控件呢?今天就带大家自己做一个标题栏控件。效果图如下:
开始啦:
第一步:自定义xml属性
新建一个android项目,在values文件夹中新建一个atts.xml的文件,在这个xml文件中声明我们一会在使用自定义控件时候需要指明的属性。
atts.xml
前面的name是我们要使用的属性名称,后面的format表示该属性接受的值的格式,string表示该属性的值是一个字符串,color表示该属性的值是一个颜色值,dimension表示该属性的值是一个尺寸,reference表示该属性的值可以参考某一个资源id,其他常见的format值还有:boolean(布尔值)、float(浮点值)、integer(整型值)、fraction(百分数)、enum(枚举值)、flag(位或运算)。
第二步:自定义标题类
在Java文件中自定义一个类继承RelativeLayout,并实现它的构造方法,我们的标题栏由三部分组成,左右两边各是一个Button,中间是一个TextView,因此我们在这个布局文件中要做的事就是对这三个控件进行处理。
先声明标题栏的三个空间及相关参数,这些参数都是根据atts.xml中来设置的,因为我们在引用自定义控件的时候是从xml中引用的,属性的设置都在xml文件中,我们从xml文件中拿到属性的值后再对控件设置赋值。
/** * 标题栏的三个控件 */ private Button leftBtn, rightBtn; private TextView title; /** * 左边按钮的属性 */ private int leftTextColor; private Drawable leftBackground; private String leftText; /** * 右边按钮的属性 */ private int rightTextColor; private Drawable rightBackground; private String rightText; /** * 中间TextView的属性 */ private int titleTextColor; private String titleText; private float titleTextSize; /** * 三个控件的布局参数 */ private LayoutParams leftParams, rightParams, titleParams;下面是构造方法,构造方法传入两个参数,一个是上下文参数,另外一个是AttributeSet,AttributeSet是一个属性的集合,用它可以处理一组xml标签集合。使用ta.getXXX方法,我们可以先从xml文件获得属性的值,然后把这些值设置给控件。最后通过LayoutParams来设置控件的宽高,设置好宽高之后,调用addView方法,添加控件。
public MyToolBar(Context context, AttributeSet attrs) { super(context, attrs); TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ToolBar); leftTextColor = ta.getColor(R.styleable.ToolBar_leftTextColor, 0); leftBackground = ta.getDrawable(R.styleable.ToolBar_leftBackground); leftText = ta.getString(R.styleable.ToolBar_leftText); rightTextColor = ta.getColor(R.styleable.ToolBar_rightTextColor, 0); rightBackground = ta.getDrawable(R.styleable.ToolBar_rightBackground); rightText = ta.getString(R.styleable.ToolBar_rightText); titleText = ta.getString(R.styleable.ToolBar_title); titleTextColor = ta.getColor(R.styleable.ToolBar_titleTextColor, 0); titleTextSize = ta.getDimension(R.styleable.ToolBar_titleTextSize, 0); //对ta进行回收 ta.recycle(); leftBtn = new Button(context); rightBtn = new Button(context); title = new TextView(context); /** * 设置属性 */ leftBtn.setText(leftText); leftBtn.setTextColor(leftTextColor); leftBtn.setBackground(leftBackground); rightBtn.setText(rightText); rightBtn.setTextColor(rightTextColor); rightBtn.setBackground(rightBackground); title.setText(titleText); title.setTextColor(titleTextColor); title.setTextSize(titleTextSize); title.setGravity(Gravity.CENTER); //设置整体背景颜色 setBackgroundColor(0x7CFC0055); leftParams = new LayoutParams( android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT); leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE); //添加控件 addView(leftBtn, leftParams); rightParams = new LayoutParams( android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT); rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, TRUE); addView(rightBtn, rightParams); titleParams = new LayoutParams( android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.MATCH_PARENT); titleParams.addRule(RelativeLayout.CENTER_IN_PARENT, TRUE); addView(title, titleParams); }