android 大图伦滚
来源:互联网 发布:js添加input隐藏属性 编辑:程序博客网 时间:2024/04/28 14:25
一个循环滚动的新闻条在android开发中很常见。
1 . 先看效果
上面是一组图片组成的新闻循环播放,下面是对应的文字说明,圆圈选择的表示当前页面,
实现的效果:
(1)图片滚动,文字也相应的滚动,圆圈也变,
(2)每隔5秒钟,新闻自动滚动
(3)支持第一个可以往后滑动,最后一个可以往前滑动
(4)左右滑动
2. 布局文件的分析
2.1最上面是一个ViewPager
<android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="200dp" > </android.support.v4.view.ViewPager>
2.2 下面是一个垂直方向的线性布局,一个文本显示和一个水平方向的线性布局,外层的线性布局添加一个背景色(灰色半透明的,argb),它的内边距属性padding为8dp。
文本的布局:水平居中,设置字体的颜色,大小,单行显示,超出部分字段使用…,
水平方向的线性布局:距离上面的一点空间,水平居中,方向。
<LinearLayout android:layout_alignBottom="@id/viewPager" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#77000000" android:padding="8dp" android:orientation="vertical" > <!-- ellipsize超出的文本末尾显示... --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:textColor="#ffffff" android:textSize="16sp" android:id="@+id/text" android:singleLine="true" android:ellipsize="end" android:text="我是文本" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/dot_layout" android:layout_marginTop="3dp" android:layout_gravity="center_horizontal" android:orientation="horizontal" > </LinearLayout> </LinearLayout>
3.代码的分析
3.1 广告的实体类
public class Ad { private int iconResId; private String intro; //省略get/set 快捷键ctrl+shift+s 之后点击r(原因是Generate Getter and Setter 小r下面有横线,下面有横线的表示是快捷键)
3.2 初始化界面,初始化数据,初始化点,初始化监听器。
重点是滑动页面的监听器。
public class MainActivity extends Activity { private ViewPager viewPager; private TextView text; private LinearLayout dot_layout; private ArrayList<Ad> list = new ArrayList<Ad>(); private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { //下一页 viewPager.setCurrentItem(viewPager.getCurrentItem()+1); //循环发送 handler.sendEmptyMessageDelayed(0, 5000); }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); initListener(); initData(); } private void initView() { setContentView(R.layout.activity_main); viewPager = (ViewPager) findViewById(R.id.viewPager); text = (TextView) findViewById(R.id.text); dot_layout = (LinearLayout) findViewById(R.id.dot_layout); } private void initListener() { //滑动页面的监听 viewPager.setOnPageChangeListener(new OnPageChangeListener() { /** * 第一次不会执行此方法。 */ @Override public void onPageSelected(int position) { updateIntroAndDot(); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageScrollStateChanged(int state) { } }); } private void initData() { list.add(new Ad(R.drawable.a, "巩俐不低俗,我就不能低俗")); list.add(new Ad(R.drawable.b, "朴树又回来了,再唱经典老歌引百万人同唱啊")); list.add(new Ad(R.drawable.c, "揭秘北京电影如何升级")); list.add(new Ad(R.drawable.d, "乐视网TV版大放送")); list.add(new Ad(R.drawable.e, "热血屌丝的反杀")); initDots(); viewPager.setAdapter(new MyPagerAdapter()); //默认选择中间的数据 int centerValue = Integer.MAX_VALUE/2; int value = centerValue%list.size(); //选中第0个 viewPager.setCurrentItem(centerValue - value); updateIntroAndDot();//在这个地方加入的原因,第一次加载的图片是位置0,在方法onPageSelected里面是加载不到的, handler.sendEmptyMessageDelayed(0, 5000); } //初始化点 private void initDots(){ for (int i = 0; i < list.size(); i++) { View view = new View(this); LayoutParams params = new LayoutParams(8, 8); if(i!=0){ params.leftMargin = 5; } view.setLayoutParams(params); view.setBackgroundResource(R.drawable.selector_dot); dot_layout.addView(view); } } //更新文本 private void updateIntroAndDot(){ int currentPage = viewPager.getCurrentItem()%list.size(); text.setText(list.get(currentPage).getIntro()); for (int i = 0; i < dot_layout.getChildCount(); i++) { dot_layout.getChildAt(i).setEnabled(i==currentPage); } } class MyPagerAdapter extends PagerAdapter { @Override public int getCount() { return Integer.MAX_VALUE; } /** * true:表示不去创建,使用缓存,false:去重新创建 当前滑动的是否和将要进人的是同一个view */ @Override public boolean isViewFromObject(View view, Object object) { return view == object; } /** * 类似于baseAdapter的getView方法 将数据设置给view的 由于它最多3个页面,不需要viewholder */ @Override public Object instantiateItem(ViewGroup container, int position) { View view = View.inflate(MainActivity.this, R.layout.adapter_ad, null); ImageView image = (ImageView) view.findViewById(R.id.image); Ad ad = list.get(position%list.size()); /**3:3 * 4:4 * 5:0 第5页 第一页 * 6:1 * 7:2 * 8:3 */ image.setImageResource(ad.getIconResId()); container.addView(view);// 将view加入到viewpager当中 return view; } /** * 销毁page position:当前需要销毁第几个page object:当前需要销毁的page */ @Override public void destroyItem(ViewGroup container, int position, Object object) { // 这个方法必须注释掉,源码里面是直接UnsupportedOperationException("Required method destroyItem was not overridden"); // super.destroyItem(container, position, object); container.removeView((View) object); } }}
源码位置:http://download.csdn.net/detail/dczjzz/9089463
0 0
- android 大图伦滚
- jquery缩略图 大图滚动轮播
- Android 大图预览、高效大图加载
- android 大图片裁剪 Uri传递大图
- android 大图片拖拽缩放
- android 大图片拖拽缩放
- Android大图裁剪解决办法
- Android大图加载方法
- android 高效加载大图
- Android 加载大图片
- android下载大图片
- android 加载大图片
- android 大图无损上传
- Android处理大图片
- android加载大图片
- android高效加载大图
- Android-加载大图片
- android加载大图片
- CocoaPod 对 iOS 版本很敏感
- FMT标签限定日期的显示格式
- 分布式系统性能测试框架
- dpkg 百度百科
- centos 启用ftp功能
- android 大图伦滚
- cp: omitting directory”错误的解释和解决办法
- Python文件夹操作
- Android设置多个闹钟
- 百度面试题 求字符串中不含重复字符的最长子串长度
- 如何用myeclipse远程调试tomcat
- 线程互斥锁控制
- iOS事件处理机制
- JAVA学习——RandomAccessFile