没有合适的资源?快使用搜索试试~ 我知道了~
android中左右滑屏的实现(广告位banner组件).doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 152 浏览量
2022-07-08
17:59:44
上传
评论
收藏 430KB DOC 举报
温馨提示
试读
29页
android中左右滑屏的实现(广告位banner组件)
资源推荐
资源详情
资源评论
www.credesign.net
www.credesign.net
android 中左右滑屏的实现(广告位 banner 组件)
1. 原理
参见下图。整个组件是一个 FrameLayout,里面有两个 view,第一个是 LinearLayout,承载了 4 个(或多个)可
以滑动的 view,见图中绿色背景的部分;第二个是一个 RelativeLayout,在其底部放置了一个 LinearLayout,在
LinearLayout 的内部放置了若干个小圆点,用来指示当前屏幕的索引。手势检测用了 GestureDetector,并实现了
OnGestureListener 接口。为了能控制滑动速度,采用了 Scroller 弹性滑动对象。
为什么组件继承 FrameLayout,是因为用于指示的小圆点是出现在 view 上面的,一个 view 叠在另一个 view 上面,
这就是 FrameLayout 的特性
什么是 banner 组件?在许多 android 应用上,比如爱奇艺客户端、百度美拍、应用宝等上面,都有一个可以手动
滑动的小广告条,这就是 banner,实际应用中的 banner,其信息(图片和点击行为)是后台可配置的,是需要通
过网络从后台拉取的。网上有许多手动滑屏的例子,但是一般只是个 demo,无法在实际中使用,因为其一般没有
考虑如下几类问题:图片缓存、OOM 问题、是否可灵活配置、是否预留外部接口以及是否封装良好。没有良好的
封装,手动滑屏加在代码中,会使得代码变得很烂很脆弱。
2. 功能、效果
� banner 属性可动态设置,默认数量为 4,可以调整默认的数量
� banner 信息从后台获取,banner 的条数就是屏幕的数量
� 可自动滑动也能手动滑动
� 图片下载为多线程,并采用常见的三级 cache 策略(内存、文件、网络),节省流量,并处理了 OOM 异
常
� 内部处理点击事件,同时预留出了接口函数
www.credesign.net
www.credesign.net
� banner 封装成一个 ViewGroup 类,使用起来简单,最少只需要两行代码
3. 代码
代码注释写的比较详细,应该很好理解。分为 2 个文件,一个是 banner 的类,另一个是接口声明。
ScrollBanner.java
[java] view plaincopy
1. /**
2. * ScrollBanner 支持滑屏效果的 FrameLayout 子类,可设置屏幕数量,尺寸。<br/>
3. * 典型的用法:<br/>
4. * ScrollBanner scrollBanner = new ScrollBanner(this, mScreenWidth, 100, this);<br/>
5. * linearLayout.addView(scrollBanner);<br/>
6. *注意事项:<br/>
7. *1.如果重新设置 ScrollBanner 的 LayoutParams,则参数中的宽和高属性将被忽略,仍然采用对象实例化的宽和高
<br/>
8. *2.点击事件的回调如果设为 null,则采用默认的事件回调<br/>
9. *3.通过 setOverScrollMode 来设置 banner 是否能够滑出屏幕的边界<br/>
10. *4 通过 xml 方式加载 banner,需要进行如下调用:<br/>
11. * setResolution(width, height);<br/>
12. setOnBannerClickListener(bannerClickListener);<br/>
13. showBanner()<br/>
14. * @author singwhatiwanna
15. * @version 2013.3.4
16. *
17. */
18. public class ScrollBanner extends FrameLayout implements
19. ComponentCallBack.OnBannerClickListener,
20. ResponseHandler.BannerInfoHandler
21. {
22.
23. private static final String TAG = "ScrollBanner";
24.
25. private HorizontalScrollViewEx mHorizontalScrollViewEx;
26.
www.credesign.net
www.credesign.net
27. //ScrollBanner 的子 view
28. private LinearLayout linearLayoutScrolLayout;
29.
30. //linearLayoutScrolLayout 的子 view,用于放置若干个小圆点
31. private LinearLayout linearLayoutForDot;
32.
33. private Scroller mScroller;
34. private Context mContext;
35. private OnBannerClickListener mBannerClickListener;
36.
37. //屏幕及其 bitmap
38. private List<View> mLinearLayoutScreens = new ArrayList<View>();
39. private List<Bitmap> mBannerBitmaps = new ArrayList<Bitmap>();
40.
41. //banner 信息
42. private List<BannerItem> mBannerItemsList = new ArrayList<BannerItem>();
43. //小圆点
44. private List<ImageView> mImageViewList = new ArrayList<ImageView>();
45. private Drawable mPageIndicator;
46. private Drawable mPageIndicatorFocused;
47.
48. //banner 默认图片
49. private Bitmap mDefaultBitmap;
50.
51. private int mScreenWidth;
52. private int mScreenHeight;
53. private int mScrollX;
54.
55. //current screen index
56. private int mWhich = 0;
57.
58. public static final int MESSAGE_AUTO_SCROLL = 1;
59.
60. public static final int MESSAGE_FETCH_BANNER_SUCCESS = 2;
61.
62. public static final int MARGIN_BOTTOM = 2;
63.
64. //480*150 banner 的图片尺寸 150.0/480=0.3125f
65. public static final float ratio = 0.3125f;
66.
67. //banner 的位置
68. private int mLocation = -1;
69.
70. //banner 分为几屏
www.credesign.net
www.credesign.net
71. private int PAGE_COUNT = 4;
72.
73. //滑动方向 是否向右滑动
74. private boolean mScrollToRight = true;
75.
76. //是否自动滑屏
77. private boolean mTimerResume = true;
78.
79. //标志用户是否手动滑动了屏幕
80. private boolean mByUserAction = false;
81.
82. //标志 banner 是否可以滑出边界
83. private boolean mOverScrollMode = false;
84. //标志 banner 可以滑出边界多少像素
85. private int mOverScrollDistance = 0;
86.
87. //定时器 用于 banner 的自动播放
88. final Timer timer = new Timer();
89.
90. //定时器的时间间隔 单位:ms
91. public static final int TIMER_DURATION = 5000;
92.
93. private TimerTask mTimerTask = new TimerTask()
94. {
95. @Override
96. public void run()
97. {
98. if (mTimerResume && !mByUserAction)
99. {
100. mHandler.sendEmptyMessage(MESSAGE_AUTO_SCROLL);
101. }
102. mByUserAction = false;
103. }
104. };
105.
106. //ScrollBanner 私有 handler 用于处理内部逻辑
107. private Handler mHandler = new Handler()
108. {
109. public void handleMessage(Message msg)
110. {
111. //表示已经执行了 onDetachedFromWindow,banner 已经被销毁了
112. if( mBannerBitmaps == null || mLinearLayoutScreens == null ||
113. mImageViewList == null || mBannerItemsList == null || mContext == null )
114. return;
www.credesign.net
www.credesign.net
115.
116. switch (msg.what)
117. {
118. case MESSAGE_AUTO_SCROLL:
119. if (mWhich == PAGE_COUNT - 1)
120. mScrollToRight = false;
121. else if(mWhich == 0)
122. {
123. mScrollToRight = true;
124. }
125.
126. if (mScrollToRight)
127. mWhich++;
128. else
129. {
130. mWhich--;
131. }
132.
133. mHorizontalScrollViewEx.switchView(mWhich);
134. break;
135. case MESSAGE_FETCH_BANNER_SUCCESS:
136. int more = 0;
137. if(mBannerItemsList != null)
138. more = mBannerItemsList.size() - PAGE_COUNT;
139. if(mBannerItemsList.size() > 0)
140. {
141. //如果有 banner 显示它
142. ScrollBanner.this.show(true);
143. }
144. //如果后台返回的 banneritem 的数量大于预设值 4
145. if(more > 0)
146. {
147. for (int i = 0; i < more; i++)
148. addBannerItem();
149. }
150. fetchBannerImages();
151. break;
152.
153. default:
154. break;
155. }
156. };
157. };
158.
剩余28页未读,继续阅读
资源评论
oligaga
- 粉丝: 52
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功