ViewPager 循环播放广告
来源:互联网 发布:matlab非线性最优化 编辑:程序博客网 时间:2024/05/18 01:52
ViewPager 循环播放广告导航
这段时间,做android首页时候,看见很多应用都有这个自动播放的广告导航效果,于是就网上找了很多例子来参考。不过,别人的并不一定试用于自己的情况,不过参考价值还是很大的。
首先明确做这个广告导航的一点就是需要用viewpager,这个控件非常简单粗暴,在android studio里或者eclipse里创建android项目时候,我们可以在创建activity时候,选择让平台给我们自动创建一个应用viewpager(Tabbed Activity)的页面,简单浏览一下,你就会发现这个控件实现起来还是很简单的。
下面我们先来看一下,平台为我们自动生成的代码
Java代码分析
//activtiy的代码public class MainActivity extends AppCompatActivity { private SectionsPagerAdapter mSectionsPagerAdapter;//声明viewpager适配器 private ViewPager mViewPager;//声明viewpager控件 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 创建一个适配器然后会返回三个fragment中的其中一个 mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); // 获取viewpager控件 mViewPager = (ViewPager) findViewById(R.id.container); mViewPager.setAdapter(mSectionsPagerAdapter); } /** * 自动创建的fragment例子 * 这里自动生成会加在activity里面,我们完全可以copy出去建一个新的fragment,copy后将static删掉就行 */ public static class PlaceholderFragment extends Fragment { private static final String ARG_SECTION_NUMBER = "section_number"; public PlaceholderFragment() { } /** * 这里利用newInstance方法返回一个新的fragment * */ public static PlaceholderFragment newInstance(int sectionNumber) { PlaceholderFragment fragment = new PlaceholderFragment(); Bundle args = new Bundle(); args.putInt(ARG_SECTION_NUMBER, sectionNumber); fragment.setArguments(args); return fragment; } //fragment对应的布局控件操作在这里实现 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); TextView textView = (TextView) rootView.findViewById(R.id.section_label); textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER))); return rootView; } } /** * 这里就是viewpager的适配器 * 我们也可以copy出去,建一个新的adpater的java文件 */ public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { // 返回相应的position对应得fragment return PlaceholderFragment.newInstance(position + 1); } //总共3个fragment页面 @Override public int getCount() { return 3; } //这里是设置Tab标题,当然后面我们可以在activtiy里去设置这些标题 @Override public CharSequence getPageTitle(int position) { switch (position) { case 0: return "SECTION 1"; case 1: return "SECTION 2"; case 2: return "SECTION 3"; } return null; } }}
xml布局代码
在activity的xml布局里加入ViewPager这个布局控件就可以了<android.support.v4.view.ViewPager android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" />对应的fragment也有一个xml布局这里就不贴了
从上面的代码可以看出,我们使用viewpager,需要用到适配器和fragment,其实fragment并不是必须要用到的,这里我们实现循环广告就并没用用到fragment,我们可以直接new一个布局,往里添加imageview就行了,但是适配器是必须要用的,就像实现ListView一样必须需要Adapter(SimpleAdapter,BaseAdapter…)的绑定。
有了前面代码的参考,接下来,就跟着我一起来实现自动循环播放的广告导航页面。
废话不多说,我们上代码:
首先我们把xml布局文件写好<FrameLayout android:id="@+id/ad_fragmentlayout" android:layout_width="match_parent" android:layout_height="160dp" android:background="@android:color/darker_gray"> <android.support.v4.view.ViewPager android:id="@+id/ad_continer" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager> <!--这里是导航点的布局,用Imageview来显示导航点,需要几个就布几个,之前看的网上的例子都是动态生成导航点,有点麻烦,反正导航点就几个,如果要动态,完全可以在这里布好后,设置隐藏属性gone掉或者显示就行--> <RelativeLayout android:gravity="center" android:orientation="horizontal" android:layout_gravity="bottom" android:layout_width="match_parent" android:layout_height="40dp"> <ImageView android:layout_marginRight="5dp" android:id="@+id/guide1" android:background="@color/colorPrimary" android:layout_width="8dp" android:layout_height="8dp" /> <ImageView android:layout_marginRight="5dp" android:layout_toRightOf="@+id/guide1" android:id="@+id/guide2" android:background="@color/colorWhite" android:layout_width="8dp" android:layout_height="8dp" /> <ImageView android:layout_marginRight="5dp" android:layout_toRightOf="@+id/guide2" android:id="@+id/guide3" android:background="@color/colorWhite" android:layout_width="8dp" android:layout_height="8dp" /> <ImageView android:layout_marginRight="5dp" android:layout_toRightOf="@+id/guide3" android:id="@+id/guide4" android:background="@color/colorWhite" android:layout_width="8dp" android:layout_height="8dp" /> <ImageView android:layout_marginRight="5dp" android:layout_toRightOf="@+id/guide4" android:id="@+id/guide5" android:background="@color/colorWhite" android:layout_width="8dp" android:layout_height="8dp" /> </RelativeLayout> </FrameLayout>
布局写好后,我们就来写java代码了,实现循环播放广告导航页面的话,我只需要写三个java文件,一个是activity的java文件,一个是viewpager适配器的java文件,还有一个是支持手动滑动时候的循环滑动的changelistener监听java文件。
先来看activity的java代码:public class MainActivity extends AppCompatActivity { private SwipeRefreshLayout refresh_layout; private final static String TAG="MainActivity"; private Handler handler; public boolean isStop = false; public Thread mThread=null; public ViewPager mViewPager; private FrameLayout btn_lessonhuide5; @Override protected void onCreate(Bundle savedInstanceState) { isStop = false; List<View> pagerViews=inintviews(); mViewPager = (ViewPager)findViewById(R.id.continer); SectionsPagerAdapter mSectionsPagerAdapter=new SectionsPagerAdapter(pagerViews); mViewPager.setAdapter(mSectionsPagerAdapter); // 这里实现自动播放,开启新线程,4秒一次更新guide //这里需要注意线程必须实例化,不然activity(fragment里遇到,activity会不会存在这个问题未知)销毁时候,线程还在运行,重建activity)(fragment)后,线程又新建了会导致自动播放加快 if (mThread==null){ mThread = new Thread(new Runnable() { @Override public void run() { while(!isStop){ SystemClock.sleep(4000); runOnUiThread(new Runnable() { @Override public void run() { if(mViewPager.getCurrentItem()<6){ mViewPager.setCurrentItem(mViewPager.getCurrentItem()+1); Log.e(TAG, "run: "+String.valueOf(mViewPager.getCurrentItem())); }else if(mViewPager.getCurrentItem()==6){ mViewPager.setCurrentItem(1,false); } } }); } } }); mThread.start(); } //这里实现手动滑动时候的循环切换 mViewPager.addOnPageChangeListener(new PagerChangeListener(this,mViewPager)); } //这里我们new几个imageview然后放入List<>中 public List<View> inintviews(){ List<View> pagerViews=new ArrayList<View>(); ImageView imageview0=new ImageView(this); imageview0.setBackgroundResource(R.mipmap.viewguide5);//为了实现循环,我们在list中放的第一张图片其实是我们显示的第5张图片 pagerViews.add(imageview0); ImageView imageview=new ImageView(this); imageview.setBackgroundResource(R.mipmap.viewguide1); pagerViews.add(imageview); ImageView imageview2=new ImageView(this); imageview2.setBackgroundResource(R.mipmap.viewguide2); pagerViews.add(imageview2); ImageView imageview3=new ImageView(this); imageview3.setBackgroundResource(R.mipmap.viewguide3); pagerViews.add(imageview3); ImageView imageview4=new ImageView(this); imageview4.setBackgroundResource(R.mipmap.viewguide4); pagerViews.add(imageview4); ImageView imageview5=new ImageView(this); imageview5.setBackgroundResource(R.mipmap.viewguide5); pagerViews.add(imageview5); ImageView imageview6=new ImageView(this); imageview6.setBackgroundResource(R.mipmap.viewguide1); //为了循环显示,这里的第6张图片是我们要在广告页面里显示的第一张 pagerViews.add(imageview6); //这里多放一个第六张图片,防止自动切换时,图片变灰 pagerViews.add(imageview6); //所以5张循环广告页面总共需要list里放7张图片 /** *对应关系是这样的 *其实我们要显示的是 1,2,3,4,5张图片 *但是实际为了循环我们放的0,1,2,3,4,5,6,7张图片 *第0张其实是我们显示的第5张,6,7张是我们显示的第一张 * */ return pagerViews; }}
下来是适配器代码//适配器必须实现3个方法isViewFromObject,instantiateItem,destroyItempublic class SectionsPagerAdapter extends PagerAdapter { private List<View> mList; private View mView; @Override//具体作用,我也不是很清楚,后面理解后会补上 public boolean isViewFromObject(View view, Object object) { return view==object; } @Override//总共图片数 public int getCount() { return mList.size(); } //在这里我们传入List<>里的图片列表 public SectionsPagerAdapter (List<View> list) { super(); this.mList=list; } @Override//这里加载图片 public Object instantiateItem(ViewGroup container, int position) { if (position<mList.size()-1){ (container).addView(mList.get(position),0); return mList.get(position); } return null; } @Override//这里销毁图片 public void destroyItem(ViewGroup container, int position, Object object) { if(position<mList.size()-1){ (container).removeView(mList.get(position)); } } @Override public CharSequence getPageTitle(int position) { Log.e("getPageTitle",String.valueOf(position)); return " "; }}
//第三个 监听滑动页面切换java文件public class PagerChangeListener implements ViewPager.OnPageChangeListener{ private final static String TAG="PagerChangeListener"; boolean isScrolled = false; private ViewPager mViewPager; private Context mContext; public PagerChangeListener(Context context, ViewPager viewPager){ super(); this.mViewPager=viewPager; this.mContext=context; mViewPager.setCurrentItem(1); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { Log.e(TAG, "onPageSelected: "+String.valueOf(position)); ImageView image1=(ImageView)mContext.findViewById(R.id.guide1); ImageView image2=(ImageView)mContext.findViewById(R.id.guide2); ImageView image3=(ImageView)mContext.findViewById(R.id.guide3); ImageView image4=(ImageView)mContext.findViewById(R.id.guide4); ImageView image5=(ImageView)mContext.findViewById(R.id.guide5); //这里设置对应的导航点的颜色显示 switch (position){ case 0: image1.setBackgroundResource(R.color.colorWhite); image2.setBackgroundResource(R.color.colorWhite); image3.setBackgroundResource(R.color.colorWhite); image4.setBackgroundResource(R.color.colorWhite); image5.setBackgroundResource(R.color.colorPrimary); break; case 1: image1.setBackgroundResource(R.color.colorPrimary); image2.setBackgroundResource(R.color.colorWhite); image3.setBackgroundResource(R.color.colorWhite); image4.setBackgroundResource(R.color.colorWhite); image5.setBackgroundResource(R.color.colorWhite); break; case 2: image1.setBackgroundResource(R.color.colorWhite); image2.setBackgroundResource(R.color.colorPrimary); image3.setBackgroundResource(R.color.colorWhite); image4.setBackgroundResource(R.color.colorWhite); image5.setBackgroundResource(R.color.colorWhite); break; case 3: image1.setBackgroundResource(R.color.colorWhite); image2.setBackgroundResource(R.color.colorWhite); image3.setBackgroundResource(R.color.colorPrimary); image4.setBackgroundResource(R.color.colorWhite); image5.setBackgroundResource(R.color.colorWhite); break; case 4: image1.setBackgroundResource(R.color.colorWhite); image2.setBackgroundResource(R.color.colorWhite); image3.setBackgroundResource(R.color.colorWhite); image4.setBackgroundResource(R.color.colorPrimary); image5.setBackgroundResource(R.color.colorWhite); break; case 5: image1.setBackgroundResource(R.color.colorWhite); image2.setBackgroundResource(R.color.colorWhite); image3.setBackgroundResource(R.color.colorWhite); image4.setBackgroundResource(R.color.colorWhite); image5.setBackgroundResource(R.color.colorPrimary); break; case 6: image1.setBackgroundResource(R.color.colorPrimary); image2.setBackgroundResource(R.color.colorWhite); image3.setBackgroundResource(R.color.colorWhite); image4.setBackgroundResource(R.color.colorWhite); image5.setBackgroundResource(R.color.colorWhite); break; default: break; } } //这里实现手势滑动循环,看懂了这里,你就能明白是如何实现循环的 @Override public void onPageScrollStateChanged(int state) { switch (state) { case 1:// 手势滑动 isScrolled = false; break; case 2:// 界面切换 isScrolled = true; break; case 0:// 滑动结束 if (mViewPager.getCurrentItem() == 0) { //首位之前,跳转到末尾(N) mViewPager.setCurrentItem(5, false); } else if (mViewPager.getCurrentItem() == 6) { //末位之后,跳转到首位(1) mViewPager.setCurrentItem(1, false); //false:不显示跳转过程的动画 } break; } }}
相信做完这几步后,我们的自动循环播放导航页面就完成了,总结一下,这里我们自动播放,是开启了一个线程,一直循环不停的让viewpager换页面实现的,对应得用的viewpager.setCurrentItem()方法,而页面的无限循环则是利用页面多张填充后,当页面滑到0张(此时显示的第5张图片)时,我们用viewpager.setCurrentItem()方法将当前页码改为第5张,当页面滑到6张(此时显示的第1张图片)时,我们用viewpager.setCurrentItem()方法将当前页码改为第1张。viewpager需要pageradpater绑定实现,具体的过程就是这样了
有什么问题欢迎留言,如果有地方不对,欢迎指出,毕竟我还是android小菜鸟。
by Lake
2016-4-20
- ViewPager 循环播放广告
- 使用ViewPager实现循环滚动播放图片广告
- ViewPager实现循环广告
- ViewPager自动循环播放
- ViewPager自动循环播放
- Android ViewPager自动循环播放
- ViewPager 无限循环 + 周期播放
- ViewPager翻页,下标,循环播放
- android 广告自动循环播放(CircleViewPager)
- LoopViewPager可以循环播放的ViewPager
- ViewPager左右滑动,自动循环播放
- ViewPager循环滑动及自动播放
- ViewPager无限循环滑动+自动播放
- 用viewPager实现简易循环播放页
- ViewPager实现简单的循环播放
- android ViewPager 实现导航页面和广告播放
- 实现无限自动循环的Viewpager,广告轮询页面
- ViewPager实现广告轮播---(一)(无限循环)
- Android 百度地图 SDK v3.0.0 (一)
- hdu1398Square Coins(母函数)
- 断点续传的原理剖析与讲解
- Android中的onClick事件
- WOJ 1618 - Magic Array (线段树+单调栈)
- ViewPager 循环播放广告
- c/c++ 读取当前时间
- HOG特征
- webstorm 连接mysql
- SpriteKit中类似Cocos2D的CCActionSpawn并发方法GroupAction
- MD5校验碰撞的概率是多少?
- CQOI2016 K远点对 计算几何
- 关于Extjs的提交问题 success : function(form, action)
- 算法代码片段(二)