zoukankan      html  css  js  c++  java
  • Android之ViewPager

    最近公司做了一个小项目,主要是用来橱窗展示图片轮播的一个广告小程序,要实现图片自动切换,于是我第一时间就想到了用viewpager来实现

    第一步:首先创建布局文件

    <LinearLayout 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" >
    
        <android.support.v4.view.ViewPager
            android:id="@+id/vp"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >
        </android.support.v4.view.ViewPager>
    
    </LinearLayout>
    

     注意:由于ViewPager是单独封装的,所以在使用之前要导入android-support-v4.jar包

    第二步:在activity中使用ViewPager,并添加适配器,配置要显示的图片,图片可以是sd卡上的,也可以是项目中资源文件目录的

    package com.jiao.viewpager;
    
    import java.util.ArrayList;
    import java.util.Timer;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v4.view.PagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.support.v4.view.ViewPager.OnPageChangeListener;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
        private int imageIDs[];
    	private String titles[];
    	private ArrayList<ImageView> images;
    	private TextView title;
    	private ViewPager viewPager;
    	private ViewPagerAdapter adapter;
    	
    	private int oldPosition = 0;//上一次的页面位置
    	private int currentItem = 0;// 当前页面
    	private ScheduledExecutorService executor;
    
    	@Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            //图片ID集合
            imageIDs = new int[]{
            		R.drawable.a,
            		R.drawable.b,
            		R.drawable.c,
            		R.drawable.d,
            		R.drawable.e
            };
            
            //图片的标题
            titles = new String[]{
            	"图片1",	
            	"图片2",	
            	"图片3",	
            	"图片4",	
            	"图片5"	
            }; 
            
                   
            //显示的图片
            images = new ArrayList<ImageView>();
            for(int i = 0; i < imageIDs.length; i++){
            	ImageView imageView = new ImageView(this);
            	imageView.setBackgroundResource(imageIDs[i]);
            	images.add(imageView);
            }
            
            
            title = (TextView) findViewById(R.id.title);
            title.setText(titles[0]);//默认页面显示的文字
            
            viewPager = (ViewPager) findViewById(R.id.vp);
            
            adapter = new ViewPagerAdapter();
            
            viewPager.setAdapter(adapter);
            
            viewPager.setOnPageChangeListener(new OnPageChangeListener() {//页面滑动监听器
    			
    			@Override
    			public void onPageSelected(int position) {//滑动过来的页面显示完成时 执行该方法
    				// TODO Auto-generated method stub
    				title.setText(titles[position]);//设置为当前的标题
    								
    				oldPosition = position;//把旧标号付给当前图片 就是上一次页面的位置
    				currentItem = position;//当前页面
    			}
    			
    			@Override
    			public void onPageScrolled(int arg0, float arg1, int arg2) {//页面滑动(过程中)的时候执行
    				// TODO Auto-generated method stub
    				
    			}
    			
    			@Override
    			public void onPageScrollStateChanged(int arg0) {//页面当前状态 滑动或者停止滑动时执行
    				// TODO Auto-generated method stub
    				
    			}
    		});
            
        }
    	
    	private class ViewPagerAdapter extends PagerAdapter{
    
    		@Override
    		public int getCount() {
    			// TODO Auto-generated method stub
    			return images.size();
    		}
    
    		@Override
    		public boolean isViewFromObject(View arg0, Object arg1) {//判断两张图片是否一致 
    			// TODO Auto-generated method stub
    			return arg0 == arg1;
    		}
    
    		@Override
    		public Object instantiateItem(ViewGroup view, int position) {//向适配器返回要显示的图片
    			// TODO Auto-generated method stub
    			view.addView(images.get(position));
    			
    			return images.get(position);
    		}
    		
    		@Override
    		public void destroyItem(ViewGroup view, int position, Object object) {//销毁要显示的图片
    			// TODO Auto-generated method stub
    			view.removeView(images.get(position));
    			
    //			super.destroyItem(view, position, object);
    		}
    	}
    
    	@Override
    	protected void onStart() {//activity运行后 自动执行该方法
    		// TODO Auto-generated method stub
    		super.onStart();
    		
    		executor = Executors.newSingleThreadScheduledExecutor();//获取ThreadScheduledExecutor
    		
    		// 每隔2秒钟 切换一张图片
    		executor.scheduleWithFixedDelay(new ViewpagerTask(), 2, 2, TimeUnit.SECONDS);
    		//第一个参数:要自动执行的方法(任务)
    		//第二个参数:延迟几秒启动
    		//第三个参数:之后每隔几秒 执行一次第一个参数的方法呢
    		//第四个参数:时间单位 时 分 秒 
    	}
    	
    	private class ViewpagerTask implements Runnable{
    
    		@Override
    		public void run() {
    			// TODO Auto-generated method stub
    			//切换图片
    			currentItem = (currentItem + 1) % images.size();//很神奇的语法 切换图片
    			
    //			handler.sendEmptyMessage(0);
    			handler.obtainMessage().sendToTarget();//获取当前消息 发送给handler
    		}
    		
    	}
    	
    	private Handler handler = new Handler(){
    
    		@Override
    		public void handleMessage(Message msg) {
    			// TODO Auto-generated method stub
    			viewPager.setCurrentItem(currentItem);
    			
    		}
    		
    	};
    
    	@Override
    	protected void onStop() {//activity退出时执行该方法
    		// TODO Auto-generated method stub
    		super.onStop();
    		
    		executor.shutdown();//销毁
    	}
    	
    }
    

     注意:以上就是将资源文件拷贝到项目的res资源目录中,然后显示资源目录中的图片,同时使用了定时任务,使程序每2秒就执行一次,实现自动切换

  • 相关阅读:
    Python从菜鸟到高手(2):清空Python控制台
    Python爬虫黑科技(经验)
    Python黑科技:6行代码轻松搭建FTP服务器
    Python黑科技:FuckIt.py
    Python黑科技:在家远程遥控公司电脑,python+微信一键连接!
    Python黑科技 | Python中四种运行其他程序的方式
    python3.x使用cxfreeze将.p打包成.exe
    【python 应用之四】提升 Python 运行性能的 7 个习惯
    JSF标签之f:facet 的使用方法
    windows快捷键之打开网络连接
  • 原文地址:https://www.cnblogs.com/all88/p/2994255.html
Copyright © 2011-2022 走看看