zoukankan      html  css  js  c++  java
  • Android_ViewPager_实现多个图片水平滚动

    1.示意图

              

              

    2.实现分析

    (1).xml配置


     
    1. <!-- 配置container和pager的clipChildren=false, 并且指定marginLeft 和 marginRight 的值-->  
    2. <LinearLayout  
    3.     android:id="@+id/container"  
    4.     android:layout_width="match_parent"  
    5.     android:layout_height="100dp"  
    6.     android:clipChildren="false"  
    7.     android:gravity="center_horizontal"  
    8.     android:layerType="software"  
    9.     android:orientation="horizontal" >  
    10.   
    11.     <android.support.v4.view.ViewPager  
    12.         android:id="@+id/viewpager"  
    13.         android:layout_width="match_parent"  
    14.         android:layout_height="match_parent"  
    15.         android:layout_marginLeft="110dp"  
    16.         android:layout_marginRight="110dp"  
    17.         android:clipChildren="false" >  
    18.     </android.support.v4.view.ViewPager>  
    19. </LinearLayout>  

    (2).java代码


     
    1. // 1.设置幕后item的缓存数目  
    2. viewPager.setOffscreenPageLimit(3);   
    3. // 2.设置页与页之间的间距  
    4. viewPager.setPageMargin(10);  
    5. // 3.将父类的touch事件分发至viewPgaer,否则只能滑动中间的一个view对象  
    6. container.setOnTouchListener(new View.OnTouchListener() {  
    7.     @Override  
    8.     public boolean onTouch(View v, MotionEvent event) {  
    9.         return viewPager.dispatchTouchEvent(event);  
    10.     }  
    11. });  

    3.代码实现


     
    1. /** 
    2.  * MainActivity.java 
    3.  *  
    4.  * @author http://blog.csdn.net/zimo2013 
    5.  *  
    6.  */  
    7. public class MainActivity extends Activity implements OnPageChangeListener {  
    8.   
    9.     private ViewPager viewPager;  
    10.     private List<View> views = new ArrayList<View>();  
    11.   
    12.     private LinearLayout container;  
    13.     private TextView tvTitle;  
    14.     private LayoutInflater inflater;  
    15.   
    16.     private String dir;  
    17.   
    18.     @Override  
    19.     protected void onCreate(Bundle savedInstanceState) {  
    20.         super.onCreate(savedInstanceState);  
    21.         setContentView(R.layout.activity_main);  
    22.   
    23.         inflater = getLayoutInflater();  
    24.         container = (LinearLayout) findViewById(R.id.container);  
    25.         viewPager = (ViewPager) findViewById(R.id.viewpager);  
    26.         tvTitle = (TextView) findViewById(R.id.title);  
    27.   
    28.         //这里预先在sdcard准备一些轮播图片资源  
    29.         dir = Environment.getExternalStorageDirectory().getAbsolutePath();  
    30.         // 得到views集合  
    31.         views = new ArrayList<View>();  
    32.         //此处可以根据需要自由设定,这里只是简单的测试  
    33.         for (int i = 1; i <= 12; i++) {  
    34.             View view = inflater.inflate(R.layout.guide_item, null);  
    35.             views.add(view);  
    36.         }  
    37.           
    38.         /////////////////////主要配置//////////////////////////////////////  
    39.           
    40.         // 1.设置幕后item的缓存数目  
    41.         viewPager.setOffscreenPageLimit(3);   
    42.         // 2.设置页与页之间的间距  
    43.         viewPager.setPageMargin(10);  
    44.         // 3.将父类的touch事件分发至viewPgaer,否则只能滑动中间的一个view对象  
    45.         container.setOnTouchListener(new View.OnTouchListener() {  
    46.             @Override  
    47.             public boolean onTouch(View v, MotionEvent event) {  
    48.                 return viewPager.dispatchTouchEvent(event);  
    49.             }  
    50.         });  
    51.   
    52.         ////////////////////////////////////////////////////////////////  
    53.         viewPager.setAdapter(new MyAdapter()); // 为viewpager设置adapter  
    54.         viewPager.setOnPageChangeListener(this);// 设置监听器  
    55.     }  
    56.   
    57.     // PagerAdapter是object的子类  
    58.     class MyAdapter extends PagerAdapter {  
    59.   
    60.         /** 
    61.          * PagerAdapter管理数据大小 
    62.          */  
    63.         @Override  
    64.         public int getCount() {  
    65.             return views.size();  
    66.         }  
    67.   
    68.         /** 
    69.          * 关联key 与 obj是否相等,即是否为同一个对象 
    70.          */  
    71.         @Override  
    72.         public boolean isViewFromObject(View view, Object obj) {  
    73.             return view == obj; // key  
    74.         }  
    75.   
    76.         /** 
    77.          * 销毁当前page的相隔2个及2个以上的item时调用 
    78.          */  
    79.         @Override  
    80.         public void destroyItem(ViewGroup container, int position, Object object) {  
    81.             container.removeView((View) object); // 将view 类型 的object熊容器中移除,根据key  
    82.         }  
    83.   
    84.         /** 
    85.          * 当前的page的前一页和后一页也会被调用,如果还没有调用或者已经调用了destroyItem 
    86.          */  
    87.         @Override  
    88.         public Object instantiateItem(ViewGroup container, int position) {  
    89.             System.out.println("pos:" + position);  
    90.             View view = views.get(position);  
    91.             // 如果访问网络下载图片,此处可以进行异步加载  
    92.             ImageView img = (ImageView) view.findViewById(R.id.icon);  
    93.             img.setImageBitmap(BitmapFactory.decodeFile(dir + getFile(position)));  
    94.             container.addView(view);  
    95.             return views.get(position); // 返回该view对象,作为key  
    96.         }  
    97.     }  
    98.   
    99.     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {  
    100.         if (viewPager != null) {  
    101.             viewPager.invalidate();  
    102.         }  
    103.     }  
    104.   
    105.     // 一个新页被调用时执行,仍为原来的page时,该方法不被调用  
    106.     public void onPageSelected(int position) {  
    107.         tvTitle.setText(getFile(position));  
    108.     }  
    109.   
    110.     /* 
    111.      * SCROLL_STATE_IDLE: pager处于空闲状态 SCROLL_STATE_DRAGGING: pager处于正在拖拽中 
    112.      * SCROLL_STATE_SETTLING: pager正在自动沉降,相当于松手后,pager恢复到一个完整pager的过程 
    113.      */  
    114.     public void onPageScrollStateChanged(int state) {  
    115.     }  
    116.   
    117.     public String getFile(int position) {  
    118.         return "/img" + ((position + 1) >= 10 ? (position + 1) : "0" + (position + 1)) + ".png";  
    119.     }  
    120. }  
     
    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     android:layout_width="match_parent"  
    3.     android:layout_height="match_parent"  
    4.     android:layout_marginLeft="15dp"  
    5.     android:layout_marginRight="15dp"  
    6.     android:layout_marginTop="50dp"  
    7.     android:orientation="vertical" >  
    8.   
    9.     <View  
    10.         android:layout_width="match_parent"  
    11.         android:layout_height="2dp"  
    12.         android:background="#ffbd2021" />  
    13.   
    14.     <!-- 配置container和pager的clipChildren=false, 并且指定marginLeft 和 marginRight 的值 -->  
    15.   
    16.     <LinearLayout  
    17.         android:id="@+id/container"  
    18.         android:layout_width="match_parent"  
    19.         android:layout_height="100dp"  
    20.         android:clipChildren="false"  
    21.         android:gravity="center_horizontal"  
    22.         android:layerType="software"  
    23.         android:orientation="horizontal" >  
    24.   
    25.         <android.support.v4.view.ViewPager  
    26.             android:id="@+id/viewpager"  
    27.             android:layout_width="match_parent"  
    28.             android:layout_height="match_parent"  
    29.             android:layout_marginLeft="110dp"  
    30.             android:layout_marginRight="110dp"  
    31.             android:clipChildren="false" >  
    32.         </android.support.v4.view.ViewPager>  
    33.     </LinearLayout>  
    34.   
    35.     <View  
    36.         android:layout_width="match_parent"  
    37.         android:layout_height="2dp"  
    38.         android:background="#ffbd2021" />  
    39.   
    40.     <ImageView  
    41.         android:layout_width="match_parent"  
    42.         android:layout_height="wrap_content"  
    43.         android:background="@drawable/line" />  
    44.   
    45.     <TextView  
    46.         android:id="@+id/title"  
    47.         android:layout_width="match_parent"  
    48.         android:layout_height="wrap_content"  
    49.         android:layout_gravity="center"  
    50.         android:gravity="center_horizontal"  
    51.         android:scaleType="fitXY"  
    52.         android:src="@drawable/ic_launcher"  
    53.         android:text="baidu"  
    54.         android:textSize="18sp" />  
    55.   
    56. </LinearLayout>  
  • 相关阅读:
    BZOJ 3132: 上帝造题的七分钟 树状数组+差分
    PAT Advanced 1006 Sign In and Sign Out (25 分)
    PAT Advanced 1011 World Cup Betting (20 分)
    PAT Basic 1032 挖掘机技术哪家强 (20 分)
    PAT Basic 1028 人口普查 (20 分)
    PAT Basic 1004 成绩排名 (20 分)
    大数据数据库HBase(二)——搭建与JavaAPI
    PAT Advanced 1009 Product of Polynomials (25 分)(vector删除元素用的是erase)
    PAT Advanced 1002 A+B for Polynomials (25 分)(隐藏条件,多项式的系数不能为0)
    PAT Basic 1041 考试座位号 (15 分)
  • 原文地址:https://www.cnblogs.com/android100/p/Android-ViewPager-scroll-pic.html
Copyright © 2011-2022 走看看