前段时间项目中需求中加入了一个分页加载的功能,其中自己写了一个自定义的页面指示器,在一个FrameLayout里边放了一个ViewPager和LinearLayout。ViewPager负责加载展示多个页面,LinearLayout区域负责展示自定义的指示点。
// ViewFlipper的指示点
@ViewInject(id = R.id.pointLayout)
LinearLayout pointGroup;
//初始化指示点的个数
//count 是页面的个数,有几个页面就初始化几个指示点
private void iniBannerPoint(int count) {
for (int i = 0; i < count; i++) {
View view = new View(this);
//设置指示点的宽度和高度为15dp,15dp
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(15, 15);
//设置指示点之间的间距为15dp
params.leftMargin = 15;
view.setLayoutParams(params);
//使用自定义的drawable(point_select_background,代码下面给)绘制view的背景
view.setBackgroundResource(R.drawable.point_select_background);
//初始化为未选中状态
view.setEnabled(false);
pointGroup.addView(view);
}
//默认初始化指示点开始指示在第一个页面
pointGroup.getChildAt(0).setEnabled(true);
}
自定义的drawable(selector选择器)point_select_background.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/point_unable_background" android:state_enabled="false"/>
<item android:drawable="@drawable/point_enable_background" android:state_enabled="true"/>
</selector>
自定义的drawable(shape)point_unable_background.xml(未选中点的指示点样式)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#ffffffff"/>
<corners android:radius="5dp"/>
</shape>
自定义的drawable(shape)point_enable_background.xml(选中点的指示点样式)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#fffe9a00"/>
<corners android:radius="5dp"/>
</shape>
与手势滑动翻页联动:activity需要实现OnPageChangeListener接口,为ViewPager添加翻页监听器vp.setOnPageChangeListener(this);在activity中显现OnPageChangeListener接口中的三个抽象方法
//用于记录上次的页面页数
private int preposition = 0;
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
//在页面选中之后,触发该方法,重绘指示点
public void onPageSelected(int position) {
int id = position % count;
View view0 = pointGroup.getChildAt(preposition % count);
//将上一个页面的指示点设置为未选中
view0.setEnabled(false);
View view1 = pointGroup.getChildAt(position % count);
//将新页面的指示点设置为选中状态
view1.setEnabled(true);
//将新页面的页数赋值给preposition
preposition = position;
}
这个页面指示器比较简单,不需要引入外部繁冗的指示点框架,运行效率比较高,需要的筒子们可以试试,但是它也存在一个缺点,点击指示点无法跳转到相应的页面。