关于自定义控件的使用,其实也还是比较好懂,使用的。
首先要自己先定义个类并且继承于你自己想要实现的基础控件(Button、Text)等,或者也可以直接继承View类。在自定义类中一定要现实两个构造方法。一个是
public 类名(Context context) {
super(context);
}
另一个是
public 类名(Context context, AttributeSet attrs) {
super(context, attrs);
//这里可以使用inflate导入已定义好的布局文件。
}
这里说明一种定义的使用流程:
1.先自定义好一个自己想要实现的xml布局文件(比如想要实现图文结合的按钮,就要定义一个ImageView跟TextView)。
2.写个类继承于LinearLayout布局组件,并且在第二个构造方法中(也就是带有AttributeSet属性)导入刚才定义好的布局文件(LayoutInflater.from(context).inflate(布局文件,this,true)
),并且初始化找到刚才在布局文件中定义好的两个组件。在该类中可以自定义一些方法用来实现自己想要的一些功能。
3.在要现实的xml文件中(比如activity.xml)加入这定义的控件即可(即刚才定义好的类,完整的包名+类名),其实也就是跟定义系统的View控件一样只不过把Button、TextView等名字改成包名+类名而已。
4.在activity.xml对应的类中通过findById找出自定义组件,并且实现一些刚才定义的方法或者添加一些官方提供的事件就好了。
另外一种实现方法
一开始也是要自定义一个xml布局文件(内要有某个要改进的组件),一个类继承于要改进的组件。重写两个构造方法。
2.重写onDraw方法。在方法内实现自己想要的功能类型。
3.在需要显示的xml文件中也是通过包名+类名方法显示出来。
4.在实现xml布局对应的Activity类中找出自定义组件,按需求再实现一些方法。
自定义样式
在android中除了自定义组件外,我们还可以自定义样式。
在项目的res目录下values文件中,可以自定义xxx.xml样式。当然项目初始化时,values文件夹内就已有系统定义好的一些样式内容了。
我就以一个例子说明:
<style name="AppBaseTheme" parent="android:Theme.Light"> <!-- Theme customizations available in newer API levels can go in res/values-vXX/styles.xml, while customizations related to backward-compatibility can go here. --> </style>
<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme"> <!-- All customizations that are NOT specific to a particular API-level can go here. --> </style>
<style name="MyAppTheme" parent="android:Theme.Light"> <item name="android:textColor">#ffffffff</item> <item name="android:windowNoTitle">true</item> </style>
从代码片段可以看出,先定义外围为style类型,然后是name属性 parent属性是可选的用来继承你想要实现的一些样式,可以是系统自定义好的也可以是自己已写好的。内层是item类型,name属性值是系统定义好的属性。外面的值是自己想要实现的样式。最后在xml内定义的控件中使用style=”@xxx/样式的name值”。
另外一种根据鼠标状态来改变控件样式
比如说,一个按钮按下之前是默认的颜色,按下又是另外的颜色。
在项目中自己定义一个drawable文件夹,里面定义一个selector样式。如:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:color="hex_color" android:state_pressed="true/false"/>
item属性内color值是根据后面state_paressed的值来确定的。其他样式也是类似使用。