zoukankan      html  css  js  c++  java
  • android UI进阶之用ViewPager实现欢迎引导页面

    ViewPager需要android-support-v4.jar这个包的支持,来自google提供的一个附加包。大家搜下即可。
    ViewPager主要用来组织一组数据,并且通过左右滑动的方式来展示。
    现在的大多数应用都会有一个欢迎引导页面,如图所示,通过左右滑动来告知用户一些功能特性。

    这个引导图效果用ViewPager可以很轻松的实现。
    正如前面所说,ViewPager是用来展示一组数据的,所以肯定需要Adapter来绑定数据和view。先写一个Adapter:
    1. package com.notice.viewpagerd;

    2. import java.util.List;

    3. import android.os.Parcelable;
    4. import android.support.v4.view.PagerAdapter;
    5. import android.support.v4.view.ViewPager;
    6. import android.view.View;

    7. public class ViewPagerAdapter extends PagerAdapter{
    8.    
    9.     //界面列表
    10.     private List<View> views;
    11.    
    12.     public ViewPagerAdapter (List<View> views){
    13.         this.views = views;
    14.     }

    15.     //销毁arg1位置的界面
    16.     @Override
    17.     public void destroyItem(View arg0, int arg1, Object arg2) {
    18.         ((ViewPager) arg0).removeView(views.get(arg1));        
    19.     }

    20.     @Override
    21.     public void finishUpdate(View arg0) {
    22.         // TODO Auto-generated method stub
    23.         
    24.     }

    25.     //获得当前界面数
    26.     @Override
    27.     public int getCount() {
    28.         if (views != null)
    29.         {
    30.             return views.size();
    31.         }
    32.         
    33.         return 0;
    34.     }
    35.    

    36.     //初始化arg1位置的界面
    37.     @Override
    38.     public Object instantiateItem(View arg0, int arg1) {
    39.         
    40.         ((ViewPager) arg0).addView(views.get(arg1), 0);
    41.         
    42.         return views.get(arg1);
    43.     }

    44.     //判断是否由对象生成界面
    45.     @Override
    46.     public boolean isViewFromObject(View arg0, Object arg1) {
    47.         return (arg0 == arg1);
    48.     }

    49.     @Override
    50.     public void restoreState(Parcelable arg0, ClassLoader arg1) {
    51.         // TODO Auto-generated method stub
    52.         
    53.     }

    54.     @Override
    55.     public Parcelable saveState() {
    56.         // TODO Auto-generated method stub
    57.         return null;
    58.     }

    59.     @Override
    60.     public void startUpdate(View arg0) {
    61.         // TODO Auto-generated method stub
    62.         
    63.     }

    64. }
    复制代码
    这里我们要绑定的每一个item就是一个引导界面,我们用一个list来保存。
    通过继承PagerAdapter,并实现几个我写注释的方法即可。
    布局界面比较简单,加入ViewPager组件,以及底部的引导小点:
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3.     android:layout_width="fill_parent"
    4.     android:layout_height="fill_parent"
    5.     android:orientation="vertical" >

    6.     <android.support.v4.view.ViewPager
    7.         android:id="@+id/viewpager"
    8.         android:layout_width="fill_parent"
    9.         android:layout_height="fill_parent"
    10.         />   
    11.    
    12.    
    13.     <LinearLayout
    14.         android:id="@+id/ll"
    15.         android:orientation="horizontal"
    16.         android:layout_width="wrap_content"
    17.         android:layout_height="wrap_content"
    18.         android:layout_marginBottom="24.0dip"
    19.         android:layout_alignParentBottom="true"
    20.         android:layout_centerHorizontal="true">
    21.         
    22.         <ImageView
    23.             android:layout_width="wrap_content"
    24.             android:layout_height="wrap_content"
    25.             android:layout_gravity="center_vertical"
    26.             android:clickable="true"
    27.             android:padding="15.0dip"
    28.             android:src="@drawable/dot" />

    29.         <ImageView
    30.             android:layout_width="wrap_content"
    31.             android:layout_height="wrap_content"
    32.             android:layout_gravity="center_vertical"
    33.             android:clickable="true"
    34.             android:padding="15.0dip"
    35.             android:src="@drawable/dot" />

    36.         <ImageView
    37.             android:layout_width="wrap_content"
    38.             android:layout_height="wrap_content"
    39.             android:layout_gravity="center_vertical"
    40.             android:clickable="true"
    41.             android:padding="15.0dip"
    42.             android:src="@drawable/dot" />

    43.         <ImageView
    44.             android:layout_width="wrap_content"
    45.             android:layout_height="wrap_content"
    46.             android:layout_gravity="center_vertical"
    47.             android:clickable="true"
    48.             android:padding="15.0dip"
    49.             android:src="@drawable/dot" />

    50.     </LinearLayout>

    51. </RelativeLayout>
    复制代码
    其中小点的图片用一个selector来控制颜色(设置item的enable为true或者false)dot.xml:
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <selector
    3.   xmlns:android="http://schemas.android.com/apk/res/android">
    4.     <item android:state_enabled="true" android:drawable="@drawable/dark_dot" />
    5.     <item android:state_enabled="false" android:drawable="@drawable/white_dot" />
    6. </selector>
    复制代码
    下面就是写Activity了。
    1. package com.notice.viewpagerd;

    2. import java.util.ArrayList;
    3. import java.util.List;

    4. import android.app.Activity;
    5. import android.os.Bundle;
    6. import android.support.v4.view.ViewPager;
    7. import android.support.v4.view.ViewPager.OnPageChangeListener;
    8. import android.view.View;
    9. import android.view.View.OnClickListener;
    10. import android.widget.ImageView;
    11. import android.widget.LinearLayout;

    12. public class ViewPagerDemoActivity extends Activity implements OnClickListener, OnPageChangeListener{
    13.    
    14.     private ViewPager vp;
    15.     private ViewPagerAdapter vpAdapter;
    16.     private List<View> views;
    17.    
    18.     //引导图片资源
    19.     private static final int[] pics = { R.drawable.whatsnew_00,
    20.             R.drawable.whatsnew_01, R.drawable.whatsnew_02,
    21.             R.drawable.whatsnew_03 };
    22.    
    23.     //底部小店图片
    24.     private ImageView[] dots ;
    25.    
    26.     //记录当前选中位置
    27.     private int currentIndex;
    28.    
    29.     /** Called when the activity is first created. */
    30.     @Override
    31.     public void onCreate(Bundle savedInstanceState) {
    32.         super.onCreate(savedInstanceState);
    33.         setContentView(R.layout.main);
    34.         
    35.         views = new ArrayList<View>();
    36.       
    37.         LinearLayout.LayoutParams mParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
    38.                 LinearLayout.LayoutParams.WRAP_CONTENT);
    39.         
    40.         //初始化引导图片列表
    41.         for(int i=0; i<pics.length; i++) {
    42.             ImageView iv = new ImageView(this);
    43.             iv.setLayoutParams(mParams);
    44.             iv.setImageResource(pics[i]);
    45.             views.add(iv);
    46.         }
    47.         vp = (ViewPager) findViewById(R.id.viewpager);
    48.         //初始化Adapter
    49.         vpAdapter = new ViewPagerAdapter(views);
    50.         vp.setAdapter(vpAdapter);
    51.         //绑定回调
    52.         vp.setOnPageChangeListener(this);
    53.         
    54.         //初始化底部小点
    55.         initDots();
    56.         
    57.     }
    58.    
    59.     private void initDots() {
    60.         LinearLayout ll = (LinearLayout) findViewById(R.id.ll);

    61.         dots = new ImageView[pics.length];

    62.         //循环取得小点图片
    63.         for (int i = 0; i < pics.length; i++) {
    64.             dots[i] = (ImageView) ll.getChildAt(i);
    65.             dots[i].setEnabled(true);//都设为灰色
    66.             dots[i].setOnClickListener(this);
    67.             dots[i].setTag(i);//设置位置tag,方便取出与当前位置对应
    68.         }

    69.         currentIndex = 0;
    70.         dots[currentIndex].setEnabled(false);//设置为白色,即选中状态
    71.     }
    72.    
    73.     /**
    74.      *设置当前的引导页
    75.      */
    76.     private void setCurView(int position)
    77.     {
    78.         if (position < 0 || position >= pics.length) {
    79.             return;
    80.         }

    81.         vp.setCurrentItem(position);
    82.     }

    83.     /**
    84.      *这只当前引导小点的选中
    85.      */
    86.     private void setCurDot(int positon)
    87.     {
    88.         if (positon < 0 || positon > pics.length - 1 || currentIndex == positon) {
    89.             return;
    90.         }

    91.         dots[positon].setEnabled(false);
    92.         dots[currentIndex].setEnabled(true);

    93.         currentIndex = positon;
    94.     }

    95.     //当滑动状态改变时调用
    96.     @Override
    97.     public void onPageScrollStateChanged(int arg0) {
    98.         // TODO Auto-generated method stub
    99.         
    100.     }

    101.     //当当前页面被滑动时调用
    102.     @Override
    103.     public void onPageScrolled(int arg0, float arg1, int arg2) {
    104.         // TODO Auto-generated method stub
    105.         
    106.     }

    107.     //当新的页面被选中时调用
    108.     @Override
    109.     public void onPageSelected(int arg0) {
    110.         //设置底部小点选中状态
    111.         setCurDot(arg0);
    112.     }

    113.     @Override
    114.     public void onClick(View v) {
    115.         int position = (Integer)v.getTag();
    116.         setCurView(position);
    117.         setCurDot(position);
    118.     }
    119. }
    复制代码
    注 意实现OnClickListener, OnPageChangeListener接口,监听小点的点击事件以及viewPager的滑动,在相应的回调方法中设置小点的enable状态,我相 信这个部分代码比我讲的清楚,就是判断当前选中的位置对相应的小点进行设置~ 可以看到ViewPager还是一个非常简单,也非常实用的一个控件。
  • 相关阅读:
    Reverse Nodes in k-Group [LeetCode]
    Text Justification [LeetCode]
    Path Sum [LeetCode]
    Multiply Strings [LeetCode]
    Populating Next Right Pointers in Each Node II [Leetcode]
    013 集合
    012 元组
    02 isdecimal(), isdigit(), isnumeric()
    011 字符串的内置方法 三
    010 字符串的内置方法 二
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/3421427.html
Copyright © 2011-2022 走看看