循环广告位组件的实现
2015-06-18 10:25
176 查看
循环广告位组件的实现
写在前面的话
前言
效果
技术细节
如何使用ViewPager
如何使用循环播放
如何实现自动播放
源码下载
1. Android一些深入的知识点分析
2. 我的技术成长之路
3. 我的后续的技术规划
4. 如何学好Android,如何成为高级工程师
5. 职业规划
1. 如何使用ViewPager
2. 如何实现循环播放
3. 如何实现自动播放
下面分别介绍这三点。
一般来说,使用PagerAdapter最少需要实现如下四个方法:
1. int getCount()
表示ViewPager的屏幕个数
2. boolean isViewFromObject(View view, Object o)
表示key:o和value:view是否属于同一个键值对,即o对应的值是否是view
3. Object instantiateItem(ViewGroup container, int position)
初始化位置为position的屏幕的界面,返回值为键值对的key,而真正的View是key所对应的value。这个概念有点抽象,一般情况下我们采用View作为key,即key和value都是同一个View对象,在这个方法中,我们需要将View加载出来并作为返回值返回。考虑到ViewPager和AdapterView的使用场景的差异,本文中并没有采用View的复用机制,这是因为ViewPager不像AdapterView那样具有大量的内容,而且ViewPager的PagerAdapter在设计时就没有暴露出复用的接口,同时广告位组件中一般都是由图片组成,布局比较简单,因此每次都重新加载布局所带来的开销是可以接受的。
4. void destroyItem(ViewGroup container, int position, Object object)
当位置为position的屏幕不再使用时,销毁它,典型的行为是将此屏幕的View对象从container中remove掉。
对于本文的例子来说,对这4个方法的实现如下所示:
这样一来,循环播放的问题就解决了,对于本例来说,代码实现如下:
从上面的代码可以看出,getCount返回了一个常量FAKE_BANNER_SIZE,这个常量被我定义为100,当然50、200和1000等等都可以,但是不能太大,比如Integer.MAX_VALUE,太大的数会以极大的概率导致程序ANR。然后在instantiateItem方法中如下一句话非常关键:
position %= DEFAULT_BANNER_SIZE
这句话完成了100到5的映射,即将ViewPager的屏幕下标映射为实际所需的下标,其中DEFAULT_BANNER_SIZE被定义为5,表示ViewPager真正的屏幕数量。
除此之外,为了实现从第一屏向前滑动到最后一屏的效果,还需要做如下处理:
finishUpdate表示ViewPager的更新即将完成,因此在这个时候我们可以悄悄地替换一些东西,比如将屏幕0切换为屏幕5,同时为了实现无限地循环滑动,当下标达到99时,将其切换到第4屏,这样滑动就可以无限地进行下去,否则ViewPager达到第100屏时将无法再继续向后滑动。
(https://github.com/singwhatiwanna/banner)
另外,邀请大家加入我的技术交流群
3群:29969245
(注意,如果已经加过1群和2群,请不要重复加群,因为群人数有限)
写在前面的话
前言
效果
技术细节
如何使用ViewPager
如何使用循环播放
如何实现自动播放
源码下载
循环广告位组件的实现
写在前面的话
很久没有写博客了,很多小伙伴问我为什么博客不更新了,这是因为我在做其它事情,时间不充裕所以就没有更新博客,但是现在我又开始更新博客了!接下来我会陆续更新一些文章,主要包含如下几方面内容:1. Android一些深入的知识点分析
2. 我的技术成长之路
3. 我的后续的技术规划
4. 如何学好Android,如何成为高级工程师
5. 职业规划
前言
本篇文章是一篇技术文章,为什么要选择介绍循环播放的广告位组件呢?这是因为2年前我刚接触Android时写了一篇介绍广告位组件的文章(/article/1386847.html),说实话那篇文章实现的比较复杂,基本上等于重写了一个ViewPager,但是复杂归复杂,它的封装还是很好的,于是就是很多同学找我要代码,但是后面我的确没有源码了。透过这件事,我发现广告位组件还是很有需要的,于是现在我决定再次重写一下广告位组件,当然这次我不会选择之前的那种方式,因为它太复杂了,这次博主选择的是采用ViewPager来实现广告位组件,为了满足实际的项目需要,我为其添加了自动播放和循环播放的功能,这样就可以在项目中直接使用了。这里再描述下循环播放的概念,循环播放是指“从第一屏向前滑动可以到最后一屏,而从最后一屏向后滑动则可以到达第一屏”。效果
这里是一张静态图,实际上是可以循环播放的。技术细节
实现这样一个广告位组件,其技术细节主要有3点:1. 如何使用ViewPager
2. 如何实现循环播放
3. 如何实现自动播放
下面分别介绍这三点。
如何使用ViewPager
ViewPager是support-v4提供的一个类,它主要用于实现滑屏的效果,它和Fragment是一对完美的组合,通过FragmentPagerAdapter,ViewPager能够轻松地管理多个Fragment。对于本例来说,由于不需要使用Fragment,所以我们要用到ViewPager的另一个更加通用的Adapter:PagerAdapter。PagerAdapter是FragmentPagerAdapter的父类,其提供了更加一般的功能接口,当然这也意味着PagerAdapter使用起来稍微复杂些。一般来说,使用PagerAdapter最少需要实现如下四个方法:
1. int getCount()
表示ViewPager的屏幕个数
2. boolean isViewFromObject(View view, Object o)
表示key:o和value:view是否属于同一个键值对,即o对应的值是否是view
3. Object instantiateItem(ViewGroup container, int position)
初始化位置为position的屏幕的界面,返回值为键值对的key,而真正的View是key所对应的value。这个概念有点抽象,一般情况下我们采用View作为key,即key和value都是同一个View对象,在这个方法中,我们需要将View加载出来并作为返回值返回。考虑到ViewPager和AdapterView的使用场景的差异,本文中并没有采用View的复用机制,这是因为ViewPager不像AdapterView那样具有大量的内容,而且ViewPager的PagerAdapter在设计时就没有暴露出复用的接口,同时广告位组件中一般都是由图片组成,布局比较简单,因此每次都重新加载布局所带来的开销是可以接受的。
4. void destroyItem(ViewGroup container, int position, Object object)
当位置为position的屏幕不再使用时,销毁它,典型的行为是将此屏幕的View对象从container中remove掉。
对于本文的例子来说,对这4个方法的实现如下所示:
<code class="hljs java has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-title" style="box-sizing: border-box;">getCount</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> FAKE_BANNER_SIZE; } <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">boolean</span> <span class="hljs-title" style="box-sizing: border-box;">isViewFromObject</span>(View view, Object o) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> view == o; } <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> Object <span class="hljs-title" style="box-sizing: border-box;">instantiateItem</span>(ViewGroup container, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> position) { position %= DEFAULT_BANNER_SIZE; View view = mInflater.inflate(R.layout.item, container, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>); ImageView imageView = (ImageView) view.findViewById(R.id.image); imageView.setImageResource(mImagesSrc[position]); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> pos = position; view.setOnClickListener(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> View.OnClickListener() { <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onClick</span>(View v) { Toast.makeText(MainActivity.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"click banner item :"</span> + pos, Toast.LENGTH_SHORT).show(); } }); container.addView(view); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> view; } <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">destroyItem</span>(ViewGroup container, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> position, Object object) { container.removeView((View) object); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li></ul>
如何使用循环播放
循环播放这个问题,如果从常规思想去考虑就会变得很复杂,但是换一种思路就会豁然开朗,考虑一种情况:假设目前我们需要ViewPager有5屏,但是如果在PagerAdapter的getCount方法中我们返回100,即告诉ViewPager我们有100屏,那么会发生什么呢?试想一下,如果当前位于第5屏,由于对于ViewPager来说它认为有100屏,所以我们仍然可以向后滑动,当滑动到第6屏时,如果我们在instantiateItem中将第1屏的View返回给它会怎么样?很好理解,这就实现了从第5屏滑动到第1屏的效果了,即从最后一屏循环滑动到了第一屏。同理,当第一屏向前滑动时,我们同样可以返回最后一屏的View,但是这里有一个问题,第一屏没办法向前滑动,因为第一屏的位置是0,ViewPager不能滑动到-1的位置,这的确是个问题!但是仍然难不倒我们,试想一下:如果ViewPager滑动到0时,这个时候我们迅速将其切换到第6屏会怎么样?由于第6屏的内容实际上就是第1屏的内容,因此界面上感受不到任何变化,但是这个时候ViewPager当前屏幕的下标已经从0变为5了,这意味着什么?这意味着ViewPager可以向前滑动了。这样一来,循环播放的问题就解决了,对于本例来说,代码实现如下:
<code class="hljs java has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-title" style="box-sizing: border-box;">getCount</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> FAKE_BANNER_SIZE; } <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> Object <span class="hljs-title" style="box-sizing: border-box;">instantiateItem</span>(ViewGroup container, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> position) { position %= DEFAULT_BANNER_SIZE; View view = mInflater.inflate(R.layout.item, container, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>); ImageView imageView = (ImageView) view.findViewById(R.id.image); imageView.setImageResource(mImagesSrc[position]); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> pos = position; view.setOnClickListener(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> View.OnClickListener() { <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onClick</span>(View v) { Toast.makeText(MainActivity.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"click banner item :"</span> + pos, Toast.LENGTH_SHORT).show(); } }); container.addView(view); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> view; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li></ul>
从上面的代码可以看出,getCount返回了一个常量FAKE_BANNER_SIZE,这个常量被我定义为100,当然50、200和1000等等都可以,但是不能太大,比如Integer.MAX_VALUE,太大的数会以极大的概率导致程序ANR。然后在instantiateItem方法中如下一句话非常关键:
position %= DEFAULT_BANNER_SIZE
这句话完成了100到5的映射,即将ViewPager的屏幕下标映射为实际所需的下标,其中DEFAULT_BANNER_SIZE被定义为5,表示ViewPager真正的屏幕数量。
除此之外,为了实现从第一屏向前滑动到最后一屏的效果,还需要做如下处理:
<code class="hljs java has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">finishUpdate</span>(ViewGroup container) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> position = mBanner.getCurrentItem(); Log.d(TAG, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"finish update before, position="</span> + position); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (position == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) { position = DEFAULT_BANNER_SIZE; mBanner.setCurrentItem(position, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (position == FAKE_BANNER_SIZE - <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) { position = DEFAULT_BANNER_SIZE - <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; mBanner.setCurrentItem(position, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>); } Log.d(TAG, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"finish update after, position="</span> + position); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>
finishUpdate表示ViewPager的更新即将完成,因此在这个时候我们可以悄悄地替换一些东西,比如将屏幕0切换为屏幕5,同时为了实现无限地循环滑动,当下标达到99时,将其切换到第4屏,这样滑动就可以无限地进行下去,否则ViewPager达到第100屏时将无法再继续向后滑动。
如何实现自动播放
这个问题就稍微简单些了,比如采用Timer、Alarm甚至Handler都可以实现,思想就是以一定的时间间隔触发ViewPager的滑动即可,本文中采用轻量级的Timer来实现,理由如下:Alarm太重量级,有点大材小用的感觉,而Handler使用起来稍微复杂一点点。下面是具体的实现细节,每隔3000ms就触发一次自动播放。<code class="hljs java has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> TimerTask mTimerTask = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> TimerTask() { <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">run</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (!mIsUserTouched) { mBannerPosition++; runOnUiThread(MainActivity.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>); Log.d(TAG, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"tname:"</span> + Thread.currentThread().getName()); } } }; <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">protected</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onCreate</span>(Bundle savedInstanceState) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">super</span>.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); mTimer.schedule(mTimerTask, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5000</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3000</span>); } <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">run</span>() { mBanner.setCurrentItem(mBannerPosition); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li></ul>
源码下载
完整的源码请大家查看我的Github,如下所示:(https://github.com/singwhatiwanna/banner)
另外,邀请大家加入我的技术交流群
3群:29969245
(注意,如果已经加过1群和2群,请不要重复加群,因为群人数有限)
相关文章推荐
- 股权成熟机制
- DevExpress TreeList使用教程之绑定多级树
- 黑马程序员----Java基础之IO包中其它类
- Android开发第二阶段(5)
- Java生成缩略图之Thumbnailator
- iOS 静态代码扫描
- C++12.1.4 类的前向声明、不完全类型类
- linux2.4中netfilter_nat_alg机制分析--以FTP流程为例,分析NAT和ALG
- Android开发第二阶段(5)
- Texas Instruments matrix-gui-2.0 hacking -- json.txt
- sql server更改端口后如何连接
- PATBasic——1006. 换个格式输出整数 (15)
- 各种python相关的报错记录
- CoreBlueTootch的实现
- ASP.NET MVC几种ActionResult的本质:FileResult
- 作用域内枚举(C++11)
- 找水王
- 插件五之滚动条jquery.slimscroll.js
- 基于spring mvc 移动终端后台开发
- Keepalived 配置说明