zoukankan      html  css  js  c++  java
  • Android自动轮播的三种方式

    方法一:在runable里判断,不是最后条目的时候++,是的话=0,获取当前条目,给viewpager设置,然后在runable里递归post,在外面也post这个run

    	// 自动轮播条显示
    			if (mHandler == null) {
    				mHandler = new Handler() {
    					public void handleMessage(android.os.Message msg) {
    						int currentItem = mViewPager.getCurrentItem();
    						if (currentItem < mTopNewsList.size() - 1) {
    							currentItem++;
    						} else {
    							currentItem = 0;
    						}
    						mViewPager.setCurrentItem(currentItem);// 切换到下一个页面
    // 继续延时3秒发消息,形成循环,可以handleMessage方法里发送消息的
    						mHandler.sendEmptyMessageDelayed(0, 3000);
    					};
    				};
    				mHandler.sendEmptyMessageDelayed(0, 3000);// 延时3秒后发消息
    			}
    ....
    class TopNewsTouchListener implements OnTouchListener {
    		@Override
    		public boolean onTouch(View v, MotionEvent event) {
    			switch (event.getAction()) {
    			case MotionEvent.ACTION_DOWN:
    				System.out.println("按下");
    // 删除Handler中的所有消息,Callbacks是说有个postDelayed,传的是Runnable,这么这个方法每几秒执行一次
    				mHandler.removeCallbacksAndMessages(null);
    				// mHandler.postDelayed(new Runnable() {
    				//
    				// @Override
    				// public void run() {
    				//
    				// }
    				// }, 3000);
    				break;
    			case MotionEvent.ACTION_CANCEL:
    //因为当按下没抬起,而是滑了一下,那么事件就取消了,需要重新发送一下
    				System.out.println("事件取消");
    				mHandler.sendEmptyMessageDelayed(0, 3000);
    				break;
    			case MotionEvent.ACTION_UP:
    				System.out.println("抬起");
    				mHandler.sendEmptyMessageDelayed(0, 3000);
    				break;
    			default:
    				break;
    			}
    			return true;
    		}
    	}
    

      方法二:在设置adapter的getposotion方法里返回整数的最大值,写个runable一直然后pager的当前条目++,然后递归调用post,在外面也post,在外边是第一次调用。在初始化view的时候设置pager的当前条目写个list的整数倍,因为有可能错乱,这样的话在第一页也能向后划了。

    	/* 当 holder.setData 才会调用 */
    	@Override
    	public void refreshView(List<String> datas) {
    		this.datas = datas;
    		viewPager.setAdapter(new HomeAdapter());
    		viewPager.setCurrentItem(2000*datas.size());// 设置起始的位置   Integer.Max_Vlue/2,这样开始位置也能向后划了
    		viewPager.setOnTouchListener(new OnTouchListener() {
    			
    			@Override
    			public boolean onTouch(View v, MotionEvent event) {
    				switch (event.getAction()) {
    				case MotionEvent.ACTION_DOWN:
    					runTask.stop();   
    					break;
    // 事件的取消,有可能按下viewpager滑动到listview上停止就不轮播了
    				case MotionEvent.ACTION_CANCEL:  
    				case MotionEvent.ACTION_UP:
    					runTask.start();
    					break;
    				}
    				
    				return false; // viewPager 触摸事件 返回值要是false  
    			}
    		});
    		runTask = new AuToRunTask();
    		runTask.start();
    	}
    	boolean flag;
    	private AuToRunTask runTask;
    //Runnable并不是开启子线程,所以可以在主线程运行,thread才是开启线程
    	public class AuToRunTask implements Runnable{
    		@Override
    		public void run() {
    			if(flag){
    				UiUtils.cancel(this);  // 取消之前
    				int currentItem = viewPager.getCurrentItem();
    				currentItem++;
    				viewPager.setCurrentItem(currentItem);
    				//  延迟执行当前的任务
    				UiUtils.postDelayed(this, 2000);// 递归调用
    			}
    		}
    		public void start(){
    			if(!flag){
    				UiUtils.cancel(this);  // 取消之前
    				flag=true;
    				UiUtils.postDelayed(this, 2000);// 递归调用
    			}
    		}
    		public  void stop(){
    			if(flag){
    				flag=false;
    				UiUtils.cancel(this);
    			}
    		}
    		
    	}
    	
    	class HomeAdapter extends PagerAdapter {
    		// 当前viewPager里面有多少个条目
    		LinkedList<ImageView> convertView=new LinkedList<ImageView>();
    		// ArrayList
    		@Override
    		public int getCount() {
    			return	Integer.MAX_VALUE;//这样写条目就能一直划了
    		}
    		/* 判断返回的对象和 加载view对象的关系 */
    		@Override
    		public boolean isViewFromObject(View arg0, Object arg1) {
    			return arg0 == arg1;
    		}
    		@Override
    		public void destroyItem(ViewGroup container, int position, Object object) {
    			ImageView view=(ImageView) object;
    			convertView.add(view);// 把移除的对象 添加到缓存集合中
    			container.removeView(view);
    		}
    		@Override
    		public Object instantiateItem(ViewGroup container, int position) {
    			int index=position%datas.size();//访问网络需要这个参数
    			ImageView view;
    			if(convertView.size()>0){
    				view=convertView.remove(0);
    			}else{
    				view= new ImageView(UiUtils.getContext());
    			}
    			bitmapUtils.display(view, HttpHelper.URL + "image?name="
    					+ datas.get(index));
    			container.addView(view); // 加载的view对象
    			return view; // 返回的对象
    		}
    	}
    

      第三种是用handler发延迟消息,和第二种差不多,第二种是延迟post(runnable),基于2,设置完最大数后可能一直滚动。然后用handler发消息,消息是一直让当前条目++,然后用延迟发消息,在外面也发,这个是第一次发。如果想停下来,定义个变量,在destory里再置为false就行。

    	 /*
    		  * 自动循环:
    		  * 1、定时器:Timer
    		  * 2、开子线程 while  true 循环
    		  * 3、ColckManager 
    		  * 4、 用handler 发送延时信息,实现循环
    		  */
    		 isRunning = true;
    //		 handler.sendEmptyMessageDelayed(0, 2000);
    	}
    	
    	/**
    	 * 判断是否自动滚动
    	 */
    	private boolean isRunning = false;
    	
    	private Handler handler = new Handler(){
    		public void handleMessage(android.os.Message msg) {
    			
    			//让viewPager 滑动到下一页
    			viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
    			if(isRunning){
    				handler.sendEmptyMessageDelayed(0, 2000);
    			}
    		};
    	};
    	
    	protected void onDestroy() {
    		
    		isRunning = false;
    	};
    	private class MyPagerAdapter extends PagerAdapter {
    		@Override
    		/**
    		 * 获得页面的总数
    		 */
    		public int getCount() {
    			return Integer.MAX_VALUE;
    		}
    		@Override
    		/**
    		 * 获得相应位置上的view
    		 * container  view的容器,其实就是viewpager自身
    		 * position 	相应的位置
    		 */
    		public Object instantiateItem(ViewGroup container, int position) {
    			
    			System.out.println("instantiateItem  ::"+position);
    			
    			// 给 container 添加一个view
    			container.addView(imageList.get(position%imageList.size()));
    			//返回一个和该view相对的object
    			return imageList.get(position%imageList.size());
    		}
    		@Override
    		/**
    		 * 判断 view和object的对应关系 
    		 */
    		public boolean isViewFromObject(View view, Object object) {
    			if(view == object){
    				return true;
    			}else{
    				return false;
    			}
    		}
    		@Override
    		/**
    		 * 销毁对应位置上的object
    		 */
    		public void destroyItem(ViewGroup container, int position, Object object) {
    			System.out.println("destroyItem  ::"+position);
    			
    			container.removeView((View) object);
    			object = null;
    		}
    	}
    

      当然,不要局限,三种方法可以混着用。

  • 相关阅读:
    [北大机试C]:走迷宫(BFS)
    [北大机试B][OpenJ_Bailian-2965]:玛雅历(模拟)
    [北大机试A]:有趣的跳跃(模拟)
    [2019北大机试D]:最大上升子序列和(DP)[计蒜客-T1221/HDU1087]
    [牛客练习赛53] A.超越学姐爱字符串 [dp]
    [牛客][北大考研复试]I Wanna Go Home[dijkstra]
    SP1716 GSS3
    牛客小白月赛13_A_小A的签到题
    自习室管理系统,基于B/S模式下的JAVA系统
    基于SSH的聊天室
  • 原文地址:https://www.cnblogs.com/sixrain/p/6836630.html
Copyright © 2011-2022 走看看