• ViewPager的基本使用--可左右循环切换也可自动切换


    ViewPager也算是Android自带的常用控件之一,但是有可能会无法直接调用,所以只需要将工程目录里/libs/android-support-v4.jar该jarAdd to Build Path就可以了。

    先来看看效果图吧:

    1                            2                               3

    一、首先完成布局文件:

    从效果图可以分析出,整体的布局为一个RelativeLayout布局,上面是一个ViewPager,下面是一个LinearLayout,在LinearLayout里面,有一个TextView 和 几个小圆点,所以可以很容易的写出布局文件了。

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" >
    
        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="200dip" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@id/viewpager"
            android:background="#33000000"
            android:orientation="vertical" >
    
            <TextView
                android:id="@+id/image_desc"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="@string/app_name"
                android:textColor="@android:color/white"
                android:textSize="18sp" />
    
            <LinearLayout
                android:id="@+id/point_group"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" 
                android:layout_gravity="center_horizontal"
                android:orientation="horizontal" />
            
        </LinearLayout>
    
    </RelativeLayout>

    二、在MainActivity中加载布局文件

    1.通过ID查找出各个控件。

                    ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
    		LinearLayout pointGroup  = (LinearLayout) findViewById(R.id.point_group);
    		TextView imageDesc = (TextView) findViewById(R.id.image_desc);

    2.初始化图片资源和指示点。

    		ArrayList<ImageView> imageList = new ArrayList<ImageView>();
    		for(int i = 0; i<imageIds.length;i++) {
    			
    			// 初始化图片资源
    			ImageView image = new ImageView(this);
    			image.setBackgroundResource(imageIds[i]);
    			imageList.add(image);
    			
    			// 添加指示点
    			ImageView point = new ImageView(this);
    			LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(5, 5);
    			params.rightMargin = 20;
    			point.setLayoutParams(params);
    			
    			point.setBackgroundResource(R.drawable.point_bg);
    			if(i==0) {
    				point.setEnabled(true);
    			} else {
    				point.setEnabled(false);
    			}
    			pointGroup.addView(point);	
    		}

    这个代码,先是创建了一个ArrayList来保存图片资源,然后通过一个循环,将每一张图片加载进入imageList,在加载图片的同时,也将指示点添加进入pointGroup指示点的资源ID--R.drawable.point_bg,是通过自己在/res/drawable中自己创建得来的,在drawable文件夹中,创建了三个XML文件,分别用来绘制不同状态的指示点。

    其中point_bg.xml文件代码为:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android" >
        
        <item android:drawable="@drawable/point_nomal" android:state_enabled="false"></item>
    	<item android:drawable="@drawable/point_focured" android:state_enabled="true"></item>
        
    </selector>

    point_nomal.xml文件代码为:

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" 
        android:shape="oval">
        
        <size android:width="5dip"
            android:height="5dip"/>
        <solid android:color="#55000000"/>
    
    </shape>

    point_focured.xml文件代码为:

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" 
        android:shape="oval">
        
        <size android:width="5dip"
            android:height="5dip"/>
        <solid android:color="#aaFFFFFF"/>
    
    </shape>

    3.将资源添加进入viewPager。

    		viewPager.setAdapter(new MyPagerAdapter());
    		private class MyPagerAdapter extends PagerAdapter {
    
    		/**
    		 * 获得页面的总数
    		 */
    		@Override
    		public int getCount() {
    			return Integer.MAX_VALUE;      // 因为需要无限循环,所以这里就不写imageList.size()
    		}
    
    		/**
    		 * 获得相应位置上的view
    		 * container  view的容器,其实就是viewpager自身
    		 * position	  相应的位置
    		 */
    		@Override
    		public Object instantiateItem(ViewGroup container, int position) {
    			// 给container添加内容
    			container.addView(imageList.get(position%imageList.size()));
    			
    			return imageList.get(position%imageList.size());
    		}
    		
    		/**
    		 * 判断view和object的对应关系
    		 */
    		@Override
    		public boolean isViewFromObject(View view, Object object) {
    			return view == object;
    		}
    
    		/**
    		 * 销毁对应位置上的object
    		 */
    		@Override
    		public void destroyItem(ViewGroup container, int position, Object object) {
    			container.removeView((View) object);
    			object = null;
    		}
    	}

    现在就完成了基本的设置了,可以运行程序看一下效果了,现在已经可以循环的左右切换了。

    三、增加自动切换

    想要实现自动切换的方法比较多,大概分为:使用定时器;开启子线程;使用ColckManager;用handler发送延时信息。在此我们采用比较简单的方式--用handler发送延时信息。

    	// 判断是否执行动画
    	private boolean isRunning = false;
    	private Handler handler = new Handler(){
    		public void handleMessage(android.os.Message msg) {
    			// 滑动到下一页
    			viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
    			
    			if(isRunning) {
    				handler.sendEmptyMessageDelayed(0, 2000);
    			}
    		};
    	};
    
    

    以上代码建立在onCreate()外,用于判断是否接收到了handler发送来的信息,如果接收到了,就将viewpager的显示后移一位延时2000毫秒后再发送出去。

    然后在onCreate()方法中添加:

    		isRunning = true;
    		handler.sendEmptyMessageDelayed(0, 2000);

    这样就完成了viewPager中图片的自动切换,但是在运行程序后发现,图片下面的Text和指示点并没有跟着切换,所以还需要添加一下代码:

    		viewPager.setOnPageChangeListener(new OnPageChangeListener() {
    			
    			/**
    			 * 页面切换后调用
    			 * postion  新的页面位置
    			 */
    			@Override
    			public void onPageSelected(int position) {
    				
    				position = position%imageList.size();
    				
    				// 设置文字描述内容
    				imageDesc.setText(imageDescriptions[position]);
    				// 改变指示点的状态
    				pointGroup.getChildAt(position).setEnabled(true);
    				pointGroup.getChildAt(lastPointPosition).setEnabled(false);
    				lastPointPosition = position;
    			}
    			
    			/**
    			 * 当页面正在滚动的时候
    			 */
    			@Override
    			public void onPageScrolled(int position, float positionOffset, int arg2) {
    				
    			}
    			
    			/**
    			 * 当页面状态发生变化的时候
    			 */
    			@Override
    			public void onPageScrollStateChanged(int arg0) {
    				
    			}
    		});

    setOnPageChangeListener()是一个监听ViewPager页面变化的方法,其实的onPageSelected()是 当页面切换后调用的,在此我们重写了该方法。当切换到新的一页的时候,Text 和 指示点也跟着变换。

    四、Demo下载

    点我下载Demo          o(︶︿︶)o

  • 相关阅读:
    使用事物码SAT检测SAP CRM中间件的传输性能
    显示SAP CRM Product hierarchy的一个小工具
    如何使用SAP CRM中间件从ERP往CRM下载Service Master
    SAP CL_CRM_BOL_ENTITY单元测试方法
    SAP CRM错误消息 Specify at least one number for the business partner
    Java注解@Autowired的工作原理
    Spring里component-scan的工作原理
    Spring框架里解析配置文件的准确位置
    SAP CRM状态字段下拉列表里数据的填充原理
    用户自定义协议client/server代码示例
  • 原文地址:https://www.cnblogs.com/whyalwaysme/p/4391688.html
Copyright © 2020-2023  润新知