Android 广告轮播效果(伪无限循环)
2015-06-04 12:00
363 查看
效果图
思考
要实现上面的效果,布局上使用viewpager控件,还需一个textview用来显示文字,一个LinearLayout用来存放动态创建的小圆点。用handler隔几秒发送一个消息来控制图片的轮播切换。
要使在最后一张图片继续左滑时,跳到第一张图片上,可以将viewpager适配器中的getCount()方法中返回最大的整数,在instantiateItem中通过对list的长度取模来设置当前的页。(不要忘了在获取viewpager的currentItem时也要进行取模操作)
要使第一张图片右滑时,跳到最后一张图片上,可以在初始化数据后,设置viewpager的currentItem为整数最大值的一半。但这时可能会造成进入时viewpager不在第一个页面,解决办法也很简单:用最大值的一半模上数据集合的大小,这个值就是多出来的页数的值,减去这个值就可以。(
viewPager.setCurrentItem(Integer.MAX_VALUE/2 - Integer.MAX_VALUE/2%list.size());)
步骤
布局文件主页面布局:
<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" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="200dip" > </android.support.v4.view.ViewPager> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignBottom="@id/viewpager" android:background="#7000" android:orientation="vertical" android:gravity="center_horizontal" android:padding="4dip" > <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="文本内容" android:textColor="#fff" /> <LinearLayout android:id="@+id/points" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingTop="4dip" > </LinearLayout> </LinearLayout> </RelativeLayout>
viewpager适配器的item布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/iv" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitXY" android:src="@drawable/a" /> </LinearLayout>
主函数
public class MainActivity extends Activity { public static final int DELAY_Millis = 5000; private ViewPager viewPager; private TextView textView; private LinearLayout points; private List<Data> list = new ArrayList<Data>(); private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { viewPager.setCurrentItem(viewPager.getCurrentItem()+1); handler.sendEmptyMessageDelayed(0, DELAY_Millis); }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initViews(); initListeners(); initData(); } private void initViews() { setContentView(R.layout.activity_main); viewPager = (ViewPager) this.findViewById(R.id.viewpager); textView = (TextView) this.findViewById(R.id.tv); points = (LinearLayout) this.findViewById(R.id.points); } private void initListeners() { viewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { updatePointAndText(); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageScrollStateChanged(int state) { } }); } private void initData() { list.add(new Data(R.drawable.a, "巩俐不低俗,我就不能低俗")); list.add(new Data(R.drawable.b, "朴树又回来了,再唱经典老歌引百万人同唱啊")); list.add(new Data(R.drawable.c, "揭秘北京电影如何升级")); list.add(new Data(R.drawable.d, "乐视网TV版大放送")); list.add(new Data(R.drawable.e, "热血屌丝的反杀")); initPoints(); viewPager.setAdapter(new MyAdapter()); viewPager.setCurrentItem(Integer.MAX_VALUE/2 - Integer.MAX_VALUE/2%list.size()); updatePointAndText(); handler.sendEmptyMessageDelayed(0, DELAY_Millis); } private void initPoints() { for (int i = 0; i < list.size(); i++) { View view = new View(this); LayoutParams params = new LayoutParams(DensityUtils.dip2px(this, 5), DensityUtils.dip2px(this, 5)); if (i != 0) { params.leftMargin = DensityUtils.dip2px(this, 5); } view.setLayoutParams(params); view.setBackgroundResource(R.drawable.selector_points); points.addView(view); } } private void updatePointAndText() { int currentItem = viewPager.getCurrentItem()%list.size(); for (int i = 0; i < points.getChildCount(); i++) { points.getChildAt(i).setEnabled(currentItem == i); } textView.setText(list.get(currentItem).getPicdesc()); } class MyAdapter extends PagerAdapter { @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { View view = View.inflate(MainActivity.this, R.layout.adapter_view, null); ImageView iv = (ImageView) view.findViewById(R.id.iv); Data data = list.get(position%list.size()); int picId = data.getPicId(); iv.setImageResource(picId); container.addView(view); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } }
相关文章推荐
- Android应用测试总结
- Android插屏动画效果
- CSDN博文精选:Android系列开发博客资源汇总
- Android Studio(AS)-->drawable与mipmap (官网解释)
- Android的ViewFlipper-android学习之旅(三十五)
- Android的ViewFlipper-android学习之旅(三十五)
- Android的ViewFlipper-android学习之旅(三十五)
- Android 随机变化图片
- Android底层开发(二)之JNI层 第三步
- 亲测可用的更新Android SDK Manager方法
- Android签名
- 带你走进Android Afinal框架的世界
- Android中多个调用Activity的问题
- Android屏幕适配全攻略(最权威的官方适配指导)
- android登陆记住密码
- Ubuntu 14.04 LTS 安装 文泉驿微米黑 字体到android studio
- 解决android:theme="@android:style/Theme.NoDisplay" 加入这句话后程序不能运行
- surfaceView背景透明效果实现
- android二次打包
- OK335xS-Android pack-ubi-256M.sh hacking