版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在Android中实现一个广告无限循环功能
今天就跟大家聊聊有关怎么在Android中实现一个广告无限循环功能,可能很多人都不太了解,为了让大家更加了解,在下给大家总结了以下内容,希望大家根据这篇文章可以有所收获。代码实现:public
class
NewsHomeFragment
extends
BaseFragment
implements
OnTouchListener
{
private
ImageHandler
mHandler
=
new
ImageHandler(new
WeakReference<NewsHomeFragment>(this));
private
ViewPager
mViewPager;
//
自定义轮播图的资源
private
int[]
mImageResIds
=
{
R.drawable.img1,
R.drawable.img2,
R.drawable.img3,
R.drawable.img4,
R.drawable.img5
};
//
放轮播图片的ImageView
的list
private
List<ImageView>
mImageList
=
new
ArrayList<ImageView>();
//
放圆点的View的list
private
List<View>
mDotList
=
new
ArrayList<View>();
@Override
public
View
initConvertView(LayoutInflater
inflater,
ViewGroup
container,
Bundle
savedInstanceState)
{
return
inflater.inflate(R.layout.fragment_news_main,
container,
false);
}
@Override
protected
void
onVisible(boolean
isInit)
{
if
(isInit)
{
initViews();
}
}
private
void
initViews()
{
//
初始化iewPager的内容
mViewPager
=
(ViewPager)
mConvertView.findViewById(R.id.view_pager);
LinearLayout
dotLayout
=
(LinearLayout)
mConvertView.findViewById(R.id.dotLayout);
dotLayout.removeAllViews();
for
(int
i
=
0;
i
<
mImageResIds.length;
i++)
{
ImageView
imageView
=
new
ImageView(getActivity());
imageView.setScaleType(ScaleType.FIT_XY);
//
view.setTag(mImageResId[i]);
imageView.setImageResource(mImageResIds[i]);
mImageList.add(imageView);
View
dotView
=
new
View(getActivity());
LinearLayout.LayoutParams
params
=
new
LinearLayout.LayoutParams(getResources().getDimensionPixelSize(R.dimen.dot_width),
getResources().getDimensionPixelSize(R.dimen.dot_width));
params.setMargins(4,
0,
4,
0);
dotView.setLayoutParams(params);
//
if
(i
==
0)
{
//
dotView.setBackgroundResource(R.drawable.dot_red);
//
}
else
{
//
dotView.setBackgroundResource(R.drawable.dot_gray);
//
}
dotLayout.addView(dotView);
mDotList.add(dotView);
}
mViewPager.setAdapter(new
ImageAdapter(mImageList));
mViewPager.setOnPageChangeListener(new
PageChangeListener());
mViewPager.setFocusable(true);
mViewPager.setCurrentItem(Integer.MAX_VALUE
/
2);//
默认在中间,使用户看不到边界
mViewPager.setOnTouchListener(this);
//
开始轮播效果
mHandler.sendEmptyMessageDelayed(ImageHandler.MSG_UPDATE_IMAGE,
ImageHandler.MSG_DELAY);
}
@Override
public
boolean
onTouch(View
v,
MotionEvent
event)
{
switch
(event.getAction())
{
case
MotionEvent.ACTION_DOWN:
mHandler.sendEmptyMessage(ImageHandler.MSG_KEEP_SILENT);
break;
case
MotionEvent.ACTION_UP:
case
MotionEvent.ACTION_CANCEL:
mHandler.sendEmptyMessageDelayed(ImageHandler.MSG_UPDATE_IMAGE,
ImageHandler.MSG_DELAY);
break;
}
return
false;
}
private
class
PageChangeListener
implements
OnPageChangeListener
{
//
配合Adapter的currentItem字段进行设置。
@Override
public
void
onPageSelected(int
position)
{
//
这个是设置左滑切换底部view的边界,必须要设置
App.getInstance().setBorderViewPosition(position);
mHandler.sendMessage(Message.obtain(mHandler,
ImageHandler.MSG_PAGE_CHANGED,
position,
0));
}
@Override
public
void
onPageScrolled(int
position,
float
arg1,
int
arg2)
{
}
//
覆写该方法实现轮播效果的暂停和恢复
@Override
public
void
onPageScrollStateChanged(int
state)
{
switch
(state)
{
case
ViewPager.SCROLL_STATE_DRAGGING:
mHandler.sendEmptyMessage(ImageHandler.MSG_KEEP_SILENT);
break;
case
ViewPager.SCROLL_STATE_IDLE:
mHandler.sendEmptyMessageDelayed(ImageHandler.MSG_UPDATE_IMAGE,
ImageHandler.MSG_DELAY);
break;
default:
break;
}
}
}
private
class
ImageAdapter
extends
PagerAdapter
{
private
List<ImageView>
viewlist;
public
ImageAdapter(List<ImageView>
viewlist)
{
this.viewlist
=
viewlist;
}
@Override
public
int
getCount()
{
//
设置成最大,使用户看不到边界
return
Integer.MAX_VALUE;
}
@Override
public
boolean
isViewFromObject(View
arg0,
Object
arg1)
{
return
arg0
==
arg1;
}
@Override
public
void
destroyItem(ViewGroup
container,
int
position,
Object
object)
{
//
Warning:不要在这里调用removeView
}
@Override
public
Object
instantiateItem(ViewGroup
container,
int
position)
{
//
对ViewPager页号求模取出View列表中要显示的项
position
%=
viewlist.size();
if
(position
<
0)
{
position
=
viewlist.size()
+
position;
}
ImageView
view
=
viewlist.get(position);
//
如果View已经在之前添加到了一个父组件,则必须先remove,否则会抛出IllegalStateException。
ViewParent
vp
=
view.getParent();
if
(vp
!=
null)
{
ViewGroup
parent
=
(ViewGroup)
vp;
parent.removeView(view);
}
container.addView(view);
//
此处可添加监听事件
return
view;
}
}
private
static
class
ImageHandler
extends
Handler
{
/**
*
请求更新显示的View。
*/
protected
static
final
int
MSG_UPDATE_IMAGE
=
1;
/**
*
请求暂停轮播。
*/
protected
static
final
int
MSG_KEEP_SILENT
=
2;
/**
*
请求恢复轮播。
*/
protected
static
final
int
MSG_BREAK_SILENT
=
3;
/**
*
记录最新的页号,当用户手动滑动时需要记录新页号,否则会使轮播的页面出错。
*
例如当前如果在第一页,本来准备播放的是第二页,而这时候用户滑动到了末页,
*
则应该播放的是第一页,如果继续按照原来的第二页播放,则逻辑上有问题。
*/
protected
static
final
int
MSG_PAGE_CHANGED
=
4;
//
轮播间隔时间
protected
static
final
long
MSG_DELAY
=
3000;
//
使用弱引用避免Handler泄露.这里的泛型参数可以不是Activity,也可以是Fragment等
private
WeakReference<NewsHomeFragment>
weakReference;
private
int
currentItem
=
0;
//
private
boolean
isOnce
=
true;
protected
ImageHandler(WeakReference<NewsHomeFragment>
wk)
{
weakReference
=
wk;
}
@Override
public
void
handleMessage(Message
msg)
{
super.handleMessage(msg);
final
NewsHomeFragment
fragment
=
weakReference.get();
if
(fragment
==
null)
{
//
Activity已经回收,无需再处理UI了
return;
}
//
第一次不删重复的消息
if
(currentItem
!=
0)
{
//
检查消息队列并移除未发送的消息,这主要是避免在复杂环境下消息出现重复等问题。
if
(fragment.mHandler.hasMessages(MSG_UPDATE_IMAGE))
{
fragment.mHandler.removeMessages(MSG_UPDATE_IMAGE);
}
}
switch
(msg.what)
{
case
MSG_UPDATE_IMAGE:
currentItem++;
fragment.mViewPager.setCurrentItem(currentItem);
//
准备下次播放
fragment.mHandler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE,
MSG_DELAY);
break;
case
MSG_KEEP_SILENT:
//
只要不发送消息就暂停了
break;
case
MSG_BREAK_SILENT:
fragment.mHandler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE,
MSG_DELAY);
break;
case
MSG_PAGE_CHANGED:
//
记录当前的页号,避免播放的时候页面显示不正确。
int
position
=
msg.arg1;
int
lastIndex
=
0;
int
index
=
position
%
fragment.mImageList.size();
for
(int
i
=
0;
i
<
fragment.mDotList.size();
i++)
{
fragment.mDotList.get(i).setBackgroundResource(R.drawable.dot_normal);
}
if
(fragment.mDotList.get(index)!=null)
{
fragment.mDotList.get(index).setBackgroundResource(R.drawable.dot_red);
}
lastIndex
=
index;
currentItem
=
position;
break;
default:
break;
}
}
}
}三、布局<LinearLayout
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"
>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="@dimen/news_pic_height"
>
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="@dim
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年西安市自来水有限公司招聘笔试参考题库含答案解析
- 2025年莒县中联水泥有限公司招聘笔试参考题库含答案解析
- 2025年中国移动信息技术中心招聘笔试参考题库含答案解析
- 2025年中铝投资发展有限公司招聘笔试参考题库含答案解析
- 城市道路养护管理规定
- 二零二五年度新能源发电项目合同结算单
- 二零二五年度文化创意产业版权授权合同6篇
- 建筑工程保修责任施工合同案例
- 2024建委标准消防工程设计合同
- 二零二五年度智慧农业园区白蚁治理与四害管理一体化合同3篇
- 豆腐的制作工艺及配方
- DB-T 29-202-2022 天津市建筑基坑工程技术规程
- 福建省社会体育指导员信息表
- DB51∕T 5060-2013 四川省预拌砂浆生产与应用技术规程
- 珠心算习题汇总(可以打印版A4)
- 设备润滑注油周期表.doc
- 医用红外热像仪
- 有限空间作业应急预案及现场处置方案
- (完整版)宴会预定单
- 售后服务部绩效考核表59929
- 三字经完整A4打印
评论
0/150
提交评论