自动轮播,类似字幕或图片自动滚动播放

功能:ListView没隔一段时间自动滚动一段距离,当滚动到底部时,又从头开始显示,类似于原始数据为0123,而滚动起来则是012301230123...一直重复显示,这样就达到了信息轮播的功能。

本功能采用扩展ListView来实现的,

public class AutoCircleScrollListview extends ListView implements OnScrollListener{
	public final static int REFRESH_TIMES=1000;//滚动频率,单位毫秒
	public final static int SCROLL_DISTANCE=10;//每次滚动距离,单位是pixels
	private Handler mHandler=new Handler();
	private RefreshRunnable mRefreshRunnable;
	private boolean isStop=false;

	public AutoCircleScrollListview(Context context) {
		super(context);
		init();
	}
	public AutoCircleScrollListview(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	private void init(){
		//设置滚动监听器
		setOnScrollListener(this);
		//不显示滚动条
		setVerticalScrollBarEnabled(false);
		setHorizontalScrollBarEnabled(false);
		//不可触摸
		setEnabled(false);
	}
	/**
	 * 开始滚动
	 */
	public void startRoll(){
		isStop=false;
		setSelection(getCount()/AutoCircleScrollAdapter.REPEAT_TIMES);
		if(mRefreshRunnable==null){
			mRefreshRunnable=new RefreshRunnable();
		}
		mHandler.postDelayed(mRefreshRunnable, REFRESH_TIMES);
	}
	/**
	 * 停止滚动
	 */
	private void stopRoll(){
		isStop=true;
		if(mRefreshRunnable!=null){
			mHandler.removeCallbacks(mRefreshRunnable);
		}
		mRefreshRunnable=null;
	}
	/**
	 *
	 * @Create_date 2014-10-24 下午1:02:50
	 * @TODO
	 */
	private class RefreshRunnable implements Runnable{

		@Override
		public void run() {
			if(!isStop){
				smoothScrollBy(SCROLL_DISTANCE, 0);
				mHandler.postDelayed(this, REFRESH_TIMES);
			}
		}

	}

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		if (firstVisibleItem <= 2) {//到顶部
			int listSize=getCount()/AutoCircleScrollAdapter.REPEAT_TIMES;
			setSelection(listSize + 2);
		} else if (firstVisibleItem + visibleItemCount > getCount() - 2) {//到底部
			int listSize=getCount()/AutoCircleScrollAdapter.REPEAT_TIMES;
			setSelection(firstVisibleItem - listSize);
		}
	}
	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {

	}

	public void onStop(){
		stopRoll();
	}

	public void onResume(){
		if(isStop){
			startRoll();
		}
	}
	public void onDestroy(){
		stopRoll();
	}
}

适配器

public class AutoCircleScrollAdapter extends BaseAdapter {
	/**
	 * 循环展示次数,最理想的值为3
	 */
	public static final int REPEAT_TIMES = 3;
	private List<Map<String, Object>> mDatas;
	private int mLayoutId;
	private String[] mFrom;
	private int[] mTo;
	private Context mContext;

	public AutoCircleScrollAdapter(Context context, int resLayoutId,
			String[] from, int[] to, List<Map<String, Object>> datas) {
		this.mContext = context;
		this.mDatas = datas;
		this.mLayoutId = resLayoutId;
		this.mFrom = from;
		this.mTo = to;
	}

	/**
	 * 将数据循环展示三遍
	 */
	@Override
	public int getCount() {
		if (mDatas != null) {
			return mDatas.size() * REPEAT_TIMES;
		}
		return 0;
	}

	@Override
	public Object getItem(int arg0) {

		return mDatas.get(arg0 % mDatas.size());
	}

	@Override
	public long getItemId(int arg0) {
		return arg0 % mDatas.size();
	}

	@Override
	public View getView(int postition, View convertView, ViewGroup arg2) {
		View v;
		if (convertView == null) {
			v = LayoutInflater.from(mContext).inflate(mLayoutId, null);
		} else {
			v = convertView;
		}
		bindView(v, postition);
		return v;
	}

	private void bindView(View view, int position) {
		final Map<String, Object> dataSet = mDatas.get(position%mDatas.size());
		if (dataSet == null) {
			return;
		}
		final String[] from = mFrom;
		final int[] to = mTo;
		final int count = to.length;
		for (int i = 0; i < count; i++) {
			final View v = view.findViewById(to[i]);
			if (v != null) {
				String clzzName = v.getClass().getSimpleName();
				if (clzzName.equals("TextView")) {// 设置文本框内容
					final Object data = dataSet.get(from[i]);
					String text = data == null ? "" : data.toString();
					if (text == null) {
						text = "";
					}
					((TextView) v).setText(text);
				}else {//在此可以拓展自己的view

				}
			}
		}
	}
}

使用

public class MainActivity extends Activity {
	AutoCircleScrollListview mAutoCircleScrollListview;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mAutoCircleScrollListview=(AutoCircleScrollListview) findViewById(R.id.lv_autoCircleScroll);
		List<Map<String, Object>> datas=new ArrayList<Map<String,Object>>();
		for (int i = 0; i < 5; i++) {
			Map<String, Object> map=new HashMap<String, Object>();
			map.put("txt_tire_index", ""+i);
			map.put("txt_pressure_value", "1"+i+".0");
			map.put("txt_tmper_valude", "01"+i+"'C");
			datas.add(map);
		}
		AutoCircleScrollAdapter adapter=new AutoCircleScrollAdapter(
				this,
				R.layout.item_auto_circle_scroll_listview,
				new String[]{"txt_tire_index","txt_pressure_value","txt_tmper_valude"},
				new int[]{R.id.txt_tire_index,R.id.txt_pressure_value,R.id.txt_tmper_valude},
				datas);
		mAutoCircleScrollListview.setAdapter(adapter);
		mAutoCircleScrollListview.startRoll();
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		mAutoCircleScrollListview.onDestroy();
	}
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		mAutoCircleScrollListview.onResume();
	}
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		mAutoCircleScrollListview.onStop();
	}

}

Demo下载

时间: 2024-08-26 00:04:03

自动轮播,类似字幕或图片自动滚动播放的相关文章

Android开发之实现图片自动滚动显示标签的ViewPager

Android中实现图片自动滚动的效果非常的常见,我们可以自己动画去实现功能.但是在Android中提供了一个ViewPager类,实现了滚动效果,在Android的extras目录下android-support-vx.jar中,x代表版本4,7等等.使用时我们需要android.support.v4.view.ViewPager的viewPager标签. 博客来源:http://blog.csdn.net/fengshizty 代码非常的简单,不用解释: xml布局文件如下: <Relati

JS可控制的图片自动循环播放查看效果

JS可控制的图片自动循环播放查看效果 <html> <head> <title>JS可控制的图片自动循环播放查看效果丨芯晴网页特效丨CsrCode.Cn</title> </head> <body> <SCRIPT LANGUAGE="JavaScript"> <!-- Begin var rotate_delay = 5000; // delay in milliseconds (5000 =

图片自动滚动,循环播放Android auto-scroll-view-pager(转载)

详细可看: http://uisource.com/project/auto-scroll-view-pager/ 示例代码可看: https://github.com/Trinea/android-demo/blob/master/src/cn/trinea/android/demo/AutoScrollViewPagerDemo.java 使用: 1.引入library 2.调用: ①布局定义 <cn.trinea.android.view.autoscrollviewpager.AutoS

Android中Gallery和ImageSwitcher同步自动(滚动)播放图片库

本文主要内容是如何让Gallery和ImageSwitcher控件能够同步自动播放图片集 ,看起来较难,然而,实现的方法非常简单, 请跟我慢慢来.总的来说,本文要实现的效果如下图:(截图效果不怎么好) 本文是建立在以下两篇bolg上的:      1.Android入门第十二篇之Gallery                  2.Android 控件之ImageSwitcher图片切换器 如果对Gallery和ImageSwitcher控件不是很熟悉的同学,建议先过去看看,本文并没有怎么讲述控

Android Gallery和ImageSwitcher同步自动(滚动)播放图片库

本文主要内容是如何让Gallery和ImageSwitcher控件能够同步自动播放图片集 ,看起来较难,然而,实现的方法非常简单, 请跟我慢慢来.总的来说,本文要实现的效果如下图:(截图效果不怎么好) 本文是建立在以下两篇bolg上的:      1.Android入门第十二篇之Gallery                  2.Android 控件之ImageSwitcher图片切换器 如果对Gallery和ImageSwitcher控件不是很熟悉的同学,建议先过去看看,本文并没有怎么讲述控

Viewpager图片自动轮播,网络图片加载,图片自动刷新

package com.teffy.viewpager; import java.util.ArrayList; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import android.annotation.SuppressLint; import android.app.Act

jQuery图片插件自动轮播原理解析

经常看到项目要用到图片轮播效果,一般的操作流程都是先到网上找一个好看的JQuery图片轮播插件,然后看下demo,再配下参数.好了,关机下班回家 其余的就交给插件吧. 是不是感觉有了jQuery,世界变得那么美好呢. 本人最近用的一个插件是 jquery.carousel.js,官方网站是:http://richardscarrott.co.uk/posts/view/jquery-carousel-plugin 下面,我们来讨论一下图片轮播原理. 首先来个简单的demo 效果图如下: 这是个导

Jquery+css实现图片无缝滚动轮播

Today,在XX学院的教学视频中,偶尔看到了Jquery+css实现图片无缝滚动轮播视频教程,虽然以前已写过类似的,但是我感觉他学的比较精简.为了方便以后做项目时直接拷贝,特地写出来,顺便和大家分享一下 最终实现界面如下: 页面加载时,自动轮播,轮播鼠标悬停在整个banner容器的时候,两边会显示向左,向右按钮,鼠标悬停在中下方索引圆圈的上面,自动跳转到相应的图片. banner容器里面包含了图片列表img,索引圆圈 num,还有按钮两个btn <div class="banner&qu

JS图片自动和可控的轮播切换特效

详细内容请点击 点击这里查看效果: http://hovertree.com/texiao/js/1.htm HTML文件代码如下:  <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8"/> <title>JS图片自动和可控的轮播切换特效 - 何问起 HoverTree</ti