自定义控件的目的有很多,比如系统控件满足不了需求时,我们会想到通过自定义控件来满足需求。其实有的时候为了功能的复用我们也会去自定义控件,把经常要用的或以后要用的与UI相关的功能封装到自定义控件中,让它成为独立的功能,当然为了灵活的控制其中的可变部分,自定义的控件应该预留接口(这里说的接口不是Java中的Interface,是控制可变部分的方式,比如方法之类的)。
接下来的案例用普通的GridView+Adapter也可以实现效果图中的功能,但为了将来复用,我们可以把效果图中的键盘逻辑封装到自定义控件中。
案例描述:
在类似猜成语,猜歌名,猜明星,猜车标,猜电影电视剧等一系列的项目中,都会有一个共同的模块-键盘,用户点击键盘中的文字,代表一个用户输入,其中键盘中包含正确答案和干扰答案,并且一般都是乱序的,而且每一关的干扰答案都不一样,本案例要做的就是实现键盘模块,并通过SeekBar进度的改变模拟不同关卡下键盘上的文字相应的改变(相当于重新洗牌)。
案例效果:
案例实现:
实现方式一 :GridView+Adapter
第一步:布局实现
(1)主界面布局 activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<GridView
android:id="@+id/gv_keys"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:numColumns="8" />
<SeekBar
android:id="@+id/sb_level"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:max="9" />
</RelativeLayout>
(2)按健布局 key_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:id = "@+id/btn_key"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#1773CE"
android:textSize = "22sp"
android:textStyle="bold"
android:background="@drawable/key_bg">
</Button>
其中使用了一个带选择器的背景,drawable/key_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/word_pressed" android:state_pressed="true"/>
<item android:drawable="@drawable/word"/>
</selector>
背景选择器中使用了两张图片drawable-hdpi/word.png,drawable-hdpi/word_pressed.png,分别会在普通状态与按下状态显示。