虽然我们无法改变人生,但可以改变人生观。虽然我们无法改变环境,但我们可以改变心境。
本讲内容:ViewPager控件的用法
与LisstView类似,也需要一个适配器,他就是PagerAdapter。
使用步骤:
一、在住布局文件里加入
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- 注意这个组件是用来显示左右滑动的界面的,如果不加载xml布局文件,他是不会显示内容的。 -->
LayoutInflater lf = getLayoutInflater().from(this);
view1 = lf.inflate(R.layout.layout1, null);
view2 = lf.inflate(R.layout.layout2, null);
view3 = lf.inflate(R.layout.layout3, null);
viewList = new ArrayList<View>();// 将要分页显示的View装入数组中
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);
三、需要一个适配器
示例一:
下面是res/layout/activity_main.xml 布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- 注意这个组件是用来显示左右滑动的界面的,如果不加载xml布局文件,他是不会显示内容的。 -->
<LinearLayout
android:id="@+id/layout1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="25dp"
android:orientation="horizontal" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:clickable="true"
android:padding="20dp"
android:src="@drawable/point" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:clickable="true"
android:padding="20dp"
android:src="@drawable/point" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:clickable="true"
android:padding="20dp"
android:src="@drawable/point" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:clickable="true"
android:padding="20dp"
android:src="@drawable/point" />
</LinearLayout>
</RelativeLayout>
下面是res/drawable/paint.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true" android:drawable="@drawable/point_normal" />
<item android:state_enabled="false" android:drawable="@drawable/point_select" />
</selector>
当你实现一个PagerAdapter,你必须至少覆盖以下4个方法:
//ViewPager适配器,用来绑定数据和view
public class ViewPagerAdapter extends PagerAdapter{
界面列表
private ArrayList<View> views;
public ViewPagerAdapter(ArrayList<View> views){
this.views=views;
}
//获得当前页卡的数量
public int getCount() {
if(views!=null){
return views.size();
}
return 0;
}
//实例化(初始化)页卡
public Object instantiateItem(View container, int position) {
((ViewPager) container).addView(views.get(position), 0);//添加页卡
return views.get(position);
}
//销毁页卡
public void destroyItem(View container, int position, Object object) {
((ViewPager)container).removeView(views.get(position));//删除页卡
}
//判断是否由对象生成界面
public boolean isViewFromObject(View arg0, Object arg1) {
return (arg0==arg1);//官方提示这样写
}
}
下面是MainActivity.java主界面文件:
public class MainActivity extends Activity implements OnClickListener,OnPageChangeListener{
private ViewPager viewPager;// 定义ViewPager对象
private ViewPagerAdapter vpAdapter;// 定义ViewPager适配器
private ArrayList<View> views;// 定义一个ArrayList来存放View
// 引导图片资源
private static final int[] pics = { R.drawable.guide1, R.drawable.guide2,
R.drawable.guide3, R.drawable.guide4 };
// 底部小点的图片
private ImageView[] points;
// 记录当前选中位置
private int currentIndex;
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
// 初始化组件
private void initView() {
// 实例化ArrayList对象
views = new ArrayList<View>();
// 实例化ViewPager
viewPager = (ViewPager) findViewById(R.id.viewPager);
// 实例化ViewPager适配器
vpAdapter = new ViewPagerAdapter(views);
}
// 初始化数据
private void initData() {
// 定义一个布局并设置参数
LinearLayout.LayoutParams mParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
//初始化引导图片列表
for(int i=0;i<pics.length;i++){
ImageView iv=new ImageView(this);
iv.setLayoutParams(mParams);
iv.setImageResource(pics[i]);
views.add(iv);
}
//设置数据
viewPager.setAdapter(vpAdapter);
//设置监听
viewPager.setOnPageChangeListener(this);
//初始化底部小点
initPoint();
}
//初始化底部小点
private void initPoint() {
LinearLayout layout1=(LinearLayout) findViewById(R.id.layout1);
points = new ImageView[pics.length];
//循环取得小点图片
for(int i=0;i<pics.length;i++){
//得到一个LinearLayout下面的每一个子元素
points[i]=(ImageView) layout1.getChildAt(i);//获得第i个控件!etChildAt里面的参数就是布局里面层次的索引
//默认都设为灰色
points[i].setEnabled(true);
//给每个小点设置监听
points[i].setOnClickListener(this);
//设置位置tag,方便取出与当前位置对应
points[i].setTag(i);
}
//设置当面默认的位置
currentIndex=0;
//设置为白色,即选中状态
points[currentIndex].setEnabled(false);
}
//当滑动状态改变时调用
public void onPageScrollStateChanged(int arg0) {
}
//当前页面被滑动时调用
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
//当新的页面被选中时调用
public void onPageSelected(int position) {
//设置底部小点选中状态
setCurDot(position);
}
//通过点击事件来切换当前的页面
public void onClick(View v) {
int position=(Integer) v.getTag();
setCurView(position);
setCurDot(position);
}
//设置当前页面的位置
private void setCurView(int position) {
if(position<0||position>=pics.length){
return;
}
viewPager.setCurrentItem(position);
}
//设置当前的小点的位置
private void setCurDot(int position) {
if(position<0||position>pics.length-1||currentIndex==position){
return;
}
points[position].setEnabled(false);
points[currentIndex].setEnabled(true);
currentIndex=position;
}
}
Take your time and enjoy it