您的位置:首页 > 移动开发 > Android开发

Android开发之ViewPager实现轮播图(轮播广告)效果的自定义View---转

2014-07-16 17:29 1031 查看
最近开发中需要做一个类似京东首页那样的广告轮播效果,于是采用ViewPager自己自定义了一个轮播图效果的View。

主要原理就是利用定时任务器定时切换ViewPager的页面。

主页面布局实现如下:

view sourceprint?

01.
<?xml version=
"1.0"
encoding=
"utf-8"
?>

02.

03.
<RelativeLayout xmlns:android=
"http://schemas.android.com/apk/res/android"

04.
android:layout_width=
"match_parent"

05.
android:layout_height=
"match_parent"
>

06.

07.
<android.support.v4.view.ViewPager

08.
android:id=
"@+id/viewPager"

09.
android:layout_width=
"match_parent"

10.
android:layout_height=
"match_parent"
/>

11.

12.
<LinearLayout

13.
android:layout_width=
"match_parent"

14.
android:layout_height=
"wrap_content"

15.
android:layout_alignParentBottom=
"true"

16.
android:padding=
"5dp"

17.
android:gravity=
"center"

18.
android:orientation=
"horizontal"
>

19.

20.
<View

21.
android:id=
"@+id/v_dot1"

22.
android:layout_width=
"8dp"

23.
android:layout_height=
"8dp"

24.
android:background=
"@drawable/dot_black"
/>

25.

26.
<View

27.
android:id=
"@+id/v_dot2"

28.
android:layout_width=
"8dp"

29.
android:layout_height=
"8dp"

30.
android:layout_marginLeft=
"5dp"

31.
android:background=
"@drawable/dot_white"
/>

32.

33.
<View

34.
android:id=
"@+id/v_dot3"

35.
android:layout_width=
"8dp"

36.
android:layout_height=
"8dp"

37.
android:layout_marginLeft=
"5dp"

38.
android:background=
"@drawable/dot_white"
/>

39.

40.
<View

41.
android:id=
"@+id/v_dot4"

42.
android:layout_width=
"8dp"

43.
android:layout_height=
"8dp"

44.
android:layout_marginLeft=
"5dp"

45.
android:background=
"@drawable/dot_white"
/>

46.

47.
<View

48.
android:id=
"@+id/v_dot5"

49.
android:layout_width=
"8dp"

50.
android:layout_height=
"8dp"

51.
android:layout_marginLeft=
"5dp"

52.
android:background=
"@drawable/dot_white"
/>

53.

54.
</LinearLayout>

55.
</RelativeLayout>


轮播效果视图类代码实现如下:

view sourceprint?

001.
package
com.czm.customview;

002.

003.
import
java.util.ArrayList;

004.
import
java.util.List;

005.
import
java.util.concurrent.Executors;

006.
import
java.util.concurrent.ScheduledExecutorService;

007.
import
java.util.concurrent.TimeUnit;

008.

009.
import
android.content.Context;

010.
import
android.graphics.drawable.Drawable;

011.
import
android.os.Handler;

012.
import
android.os.Message;

013.
import
android.os.Parcelable;

014.
import
android.support.v4.view.PagerAdapter;

015.
import
android.support.v4.view.ViewPager;

016.
import
android.support.v4.view.ViewPager.OnPageChangeListener;

017.
import
android.util.AttributeSet;

018.
import
android.view.LayoutInflater;

019.
import
android.view.View;

020.
import
android.widget.FrameLayout;

021.
import
android.widget.ImageView;

022.
import
android.widget.ImageView.ScaleType;

023.

024.

025.
/**

026.
* ViewPager实现的轮播图广告自定义视图,如京东首页的广告轮播图效果;

027.
* 既支持自动轮播页面也支持手势滑动切换页面

028.
* @author caizhiming

029.
*

030.
*/

031.

032.
public
class
SlideShowView
extends
FrameLayout {

033.

034.
//轮播图图片数量

035.
private
final
static
int
IMAGE_COUNT =
5
;

036.
//自动轮播的时间间隔

037.
private
final
static
int
TIME_INTERVAL =
5
;

038.
//自动轮播启用开关

039.
private
final
static
boolean
isAutoPlay =
true
;

040.

041.
//自定义轮播图的资源ID

042.
private
int
[] imagesResIds;

043.
//放轮播图片的ImageView 的list

044.
private
List<ImageView> imageViewsList;

045.
//放圆点的View的list

046.
private
List<View> dotViewsList;

047.

048.
private
ViewPager viewPager;

049.
//当前轮播页

050.
private
int
currentItem  =
0
;

051.
//定时任务

052.
private
ScheduledExecutorService scheduledExecutorService;

053.
//Handler

054.
private
Handler handler =
new
Handler(){

055.

056.
@Override

057.
public
void
handleMessage(Message msg) {

058.
// TODO Auto-generated method stub

059.
super
.handleMessage(msg);

060.
viewPager.setCurrentItem(currentItem);

061.
}

062.

063.
};

064.

065.
public
SlideShowView(Context context) {

066.
this
(context,
null
);

067.
// TODO Auto-generated constructor stub

068.
}

069.
public
SlideShowView(Context context,AttributeSet attrs) {

070.
this
(context,attrs,
0
);

071.
// TODO Auto-generated constructor stub

072.
}

073.
public
SlideShowView(Context context,AttributeSet attrs,
int
defStyle) {

074.
super
(context,attrs,defStyle);

075.
// TODO Auto-generated constructor stub

076.
initData();

077.
initUI(context);

078.
if
(isAutoPlay){

079.
startPlay();

080.
}

081.

082.
}

083.
/**

084.
* 开始轮播图切换

085.
*/

086.
private
void
startPlay(){

087.
scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();

088.
scheduledExecutorService.scheduleAtFixedRate(
new
SlideShowTask(),
1
,
4
,TimeUnit.SECONDS);

089.
}

090.
/**

091.
* 停止轮播图切换

092.
*/

093.
private
void
stopPlay(){

094.
scheduledExecutorService.shutdown();

095.
}

096.
/**

097.
* 初始化相关Data

098.
*/

099.
private
void
initData(){

100.
imagesResIds =
new
int
[]{

101.
R.drawable.pic1,

102.
R.drawable.pic2,

103.
R.drawable.pic3,

104.
R.drawable.pic4,

105.
R.drawable.pic5,

106.

107.
};

108.
imageViewsList =
new
ArrayList<ImageView>();

109.
dotViewsList =
new
ArrayList<View>();

110.

111.
}

112.
/**

113.
* 初始化Views等UI

114.
*/

115.
private
void
initUI(Context context){

116.
LayoutInflater.from(context).inflate(R.layout.layout_slideshow,
this
,
true
);

117.
for
(
int
imageID : imagesResIds){

118.
ImageView view =
new
ImageView(context);

119.
view.setImageResource(imageID);

120.
view.setScaleType(ScaleType.FIT_XY);

121.
imageViewsList.add(view);

122.
}

123.
dotViewsList.add(findViewById(R.id.v_dot1));

124.
dotViewsList.add(findViewById(R.id.v_dot2));

125.
dotViewsList.add(findViewById(R.id.v_dot3));

126.
dotViewsList.add(findViewById(R.id.v_dot4));

127.
dotViewsList.add(findViewById(R.id.v_dot5));

128.

129.
viewPager = (ViewPager) findViewById(R.id.viewPager);

130.
viewPager.setFocusable(
true
);

131.

132.
viewPager.setAdapter(
new
MyPagerAdapter());

133.
viewPager.setOnPageChangeListener(
new
MyPageChangeListener());

134.
}

135.

136.
/**

137.
* 填充ViewPager的页面适配器

138.
* @author caizhiming

139.
*/

140.
private
class
MyPagerAdapter
extends
PagerAdapter{

141.

142.
@Override

143.
public
void
destroyItem(View container,
int
position,Object object) {

144.
// TODO Auto-generated method stub

145.
//((ViewPag.er)container).removeView((View)object);

146.
((ViewPager)container).removeView(imageViewsList.get(position));

147.
}

148.

149.
@Override

150.
public
Object instantiateItem(View container,
int
position) {

151.
// TODO Auto-generated method stub

152.
((ViewPager)container).addView(imageViewsList.get(position));

153.
return
imageViewsList.get(position);

154.
}

155.

156.
@Override

157.
public
int
getCount() {

158.
// TODO Auto-generated method stub

159.
return
imageViewsList.size();

160.
}

161.

162.
@Override

163.
public
boolean
isViewFromObject(View arg0,Object arg1) {

164.
// TODO Auto-generated method stub

165.
return
arg0 == arg1;

166.
}

167.
@Override

168.
public
void
restoreState(Parcelable arg0,ClassLoader arg1) {

169.
// TODO Auto-generated method stub

170.

171.
}

172.

173.
@Override

174.
public
Parcelable saveState() {

175.
// TODO Auto-generated method stub

176.
return
null
;

177.
}

178.

179.
@Override

180.
public
void
startUpdate(View arg0) {

181.
// TODO Auto-generated method stub

182.

183.
}

184.

185.
@Override

186.
public
void
finishUpdate(View arg0) {

187.
// TODO Auto-generated method stub

188.

189.
}

190.

191.
}

192.
/**

193.
* ViewPager的监听器

194.
* 当ViewPager中页面的状态发生改变时调用

195.
* @author caizhiming

196.
*/

197.
private
class
MyPageChangeListener
implements
OnPageChangeListener{

198.

199.
boolean
isAutoPlay =
false
;

200.

201.
@Override

202.
public
void
onPageScrollStateChanged(
int
arg0) {

203.
// TODO Auto-generated method stub

204.
switch
(arg0) {

205.
case
1
:
// 手势滑动,空闲中

206.
isAutoPlay =
false
;

207.
break
;

208.
case
2
:
// 界面切换中

209.
isAutoPlay =
true
;

210.
break
;

211.
case
0
:
// 滑动结束,即切换完毕或者加载完毕

212.
// 当前为最后一张,此时从右向左滑,则切换到第一张

213.
if
(viewPager.getCurrentItem() ==viewPager.getAdapter().getCount() -
1
&& !isAutoPlay) {

214.
viewPager.setCurrentItem(
0
);

215.
}

216.
// 当前为第一张,此时从左向右滑,则切换到最后一张

217.
else
if
(viewPager.getCurrentItem() ==
0
&& !isAutoPlay) {

218.
viewPager.setCurrentItem(viewPager.getAdapter().getCount() -
1
);

219.
}

220.
break
;

221.
}

222.
}

223.

224.
@Override

225.
public
void
onPageScrolled(
int
arg0,
float
arg1,
int
arg2) {

226.
// TODO Auto-generated method stub

227.

228.
}

229.

230.
@Override

231.
public
void
onPageSelected(
int
pos) {

232.
// TODO Auto-generated method stub

233.

234.
currentItem = pos;

235.
for
(
int
i=
0
;i < dotViewsList.size();i++){

236.
if
(i == pos){

237.
((View)dotViewsList.get(pos)).setBackgroundResource(R.drawable.dot_black);

238.
}
else
{

239.
((View)dotViewsList.get(i)).setBackgroundResource(R.drawable.dot_white);

240.
}

241.
}

242.
}

243.

244.
}

245.

246.
/**

247.
*执行轮播图切换任务

248.
*@author caizhiming

249.
*/

250.
private
class
SlideShowTask
implements
Runnable{

251.

252.
@Override

253.
public
void
run() {

254.
// TODO Auto-generated method stub

255.
synchronized
(viewPager) {

256.
currentItem = (currentItem+
1
)%imageViewsList.size();

257.
handler.obtainMessage().sendToTarget();

258.
}

259.
}

260.

261.
}

262.
/**

263.
* 销毁ImageView资源,回收内存

264.
* @author caizhiming

265.
*/

266.
private
void
destoryBitmaps() {

267.

268.
for
(
int
i =
0
; i < IMAGE_COUNT; i++) {

269.
ImageView imageView = imageViewsList.get(i);

270.
Drawable drawable = imageView.getDrawable();

271.
if
(drawable !=
null
) {

272.
//解除drawable对view的引用

273.
drawable.setCallback(
null
);

274.
}

275.
}

276.
}

277.

278.
}


如何引用上面自定义的轮播图效果视图View呢?其实很引用普通的View类似,实现如下:

view sourceprint?

1.
<com.czm.customview.SlideShowView

2.
android:id=
"@+id/slideshowView"

3.
android:layout_width=
"335dp"

4.
android:layout_height=
"120dp"

5.
android:layout_centerHorizontal=
"true"

6.
/>


转自:http://www.it165.net/pro/html/201406/16227.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐