自己做好的banner 怎么添加移动端banner轮播图滑屏

404 Not Found | 错误 | 前端网(QDFuns)
欢迎您回来
验证码加载中,请稍后
记住我,自动登录
其他登录方式 或
获取验证码
验证码加载中,请稍后
已有账号可 ,若注册即表示,您已阅读并接受和
获取验证码
验证码加载中,请稍后
验证码加载中,请稍后
记住我,自动登录
获取验证码
验证码加载中,请稍后
注册并绑定
绑定即表示,您已阅读并接受和,若暂时不想绑定第三方账号,可返回
扫一扫,手机上览此页。
扫一扫,手机浏览 前端网(QDFuns) 新浪微博,也可直接 ,当然更希望您能关注我们,第一时间了解最新活动和动态。当前位置: >
触屏版jQuery手机图片滑动轮播效果代码
08:54 来源/作者:懒人模板 分类: 
* 懒人模板承诺:本站所有资源免费下载,无病毒,无弹窗,无干扰链接!
猜你也喜欢看这些 ??????
这些是最新的 ??????
我们一直在进步
日 懒人模板官网论坛上线!
日 微信贺卡源码频道上线!
日 手机单页专题频道上线!
微信游戏源码频道上线!
05年3月10日 手机单页专题频道上线!
10月18日 懒人模板手机版正式上线!
8月21日 关键词“wap模板”首页排名前一!
8月17日 关键词“手机模板”首页排名前四!
08月12日 关键词“手机wap网站模板”首页排名第一!求移动端HTML5 和js 实现手机滑动banner具体原理及实现过程代码?不要说插件什么的。
[问题点数:20分,结帖人CodingNoob]
求移动端HTML5 和js 实现手机滑动banner具体原理及实现过程代码?不要说插件什么的。
[问题点数:20分,结帖人CodingNoob]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2017年12月 Web 开发大版内专家分月排行榜第三2013年3月 Web 开发大版内专家分月排行榜第三
2015年7月 Web 开发大版内专家分月排行榜第三
匿名用户不能发表回复!|jquery手机端响应式banner图片滚动切换效果 - 网站源码
国内金准营销服务中心
90天让您的网站升级100倍。国内金准营销服务中心.国内金准营销服务中心国内金准营销服务中心国内金准营销服务中心国内金准营销服务中心
国内金准营销服务中心
90天让您的网站升级100倍。国内金准营销服务中心.国内金准营销服务中心国内金准营销服务中心国内金准营销服务中心国内金准营销服务中心
国内金准营销服务中心
90天让您的网站升级100倍。国内金准营销服务中心.国内金准营销服务中心国内金准营销服务中心国内金准营销服务中心国内金准营销服务中心
国内金准营销服务中心
90天让您的网站升级100倍。国内金准营销服务中心.国内金准营销服务中心国内金准营销服务中心国内金准营销服务中心国内金准营销服务中心Android组件banner实现左右滑屏效果
转载 &发布时间:日 14:30:12 & 作者:singwhatiwanna
这篇文章主要为大家详细介绍了Android组件banner实现左右滑屏效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
什么是banner组件?在许多Android应用上,比如爱奇艺客户端、百度美拍、应用宝等上面,都有一个可以手动滑动的小广告条,这就是banner,实际应用中的banner,其信息(图片和点击行为)是后台可配置的,是需要通过网络从后台拉取的。网上有许多手动滑屏的例子,但是一般只是个demo,无法在实际中使用,因为其一般没有考虑如下几类问题:图片缓存、OOM问题、是否可灵活配置、是否预留外部接口以及是否封装良好。没有良好的封装,手动滑屏加在代码中,会使得代码变得很烂很脆弱。
参见下图。整个组件是一个FrameLayout,里面有两个view,第一个是LinearLayout,承载了4个(或多个)可以滑动的view,见图中绿色背景的部分;第二个是一个RelativeLayout,在其底部放置了一个LinearLayout,在LinearLayout的内部放置了若干个小圆点,用来指示当前屏幕的索引。手势检测用了GestureDetector,并实现了OnGestureListener接口。为了能控制滑动速度,采用了Scroller弹性滑动对象。
为什么组件继承FrameLayout,是因为用于指示的小圆点是出现在view上面的,一个view叠在另一个view上面,这就是FrameLayout的特性
2.功能、效果
banner属性可动态设置,默认数量为4,可以调整默认的数量
banner信息从后台获取,banner的条数就是屏幕的数量
可自动滑动也能手动滑动
图片下载为多线程,并采用常见的三级cache策略(内存、文件、网络),节省流量,并处理了OOM异常
内部处理点击事件,同时预留出了接口函数
banner封装成一个ViewGroup类,使用起来简单,最少只需要两行代码
代码注释写的比较详细,应该很好理解。分为2个文件,一个是banner的类,另一个是接口声明。
ScrollBanner.java
* ScrollBanner 支持滑屏效果的FrameLayout子类,可设置屏幕数量,尺寸。&br/&
* 典型的用法:&br/&
* ScrollBanner scrollBanner = new ScrollBanner(this, mScreenWidth, 100, this);&br/&
* linearLayout.addView(scrollBanner);&br/&
*注意事项:&br/&
*1.如果重新设置ScrollBanner的LayoutParams,则参数中的宽和高属性将被忽略,仍然采用对象实例化的宽和高&br/&
*2.点击事件的回调如果设为null,则采用默认的事件回调&br/&
*3.通过setOverScrollMode来设置 banner是否能够滑出屏幕的边界&br/&
*4通过xml方式加载banner,需要进行如下调用:&br/&
* setResolution(width, height);&br/&
setOnBannerClickListener(bannerClickListener);&br/&
showBanner()&br/&
* @author singwhatiwanna
* @version
public class ScrollBanner extends FrameLayout implements
ComponentCallBack.OnBannerClickListener,
ResponseHandler.BannerInfoHandler
private static final String TAG = "ScrollBanner";
private HorizontalScrollViewEx mHorizontalScrollViewEx;
//ScrollBanner的子view
private LinearLayout linearLayoutScrolL
//linearLayoutScrolLayout的子view,用于放置若干个小圆点
private LinearLayout linearLayoutForD
private Scroller mS
private Context mC
private OnBannerClickListener mBannerClickL
//屏幕及其bitmap
private List&View& mLinearLayoutScreens = new ArrayList&View&();
private List&Bitmap& mBannerBitmaps = new ArrayList&Bitmap&();
//banner信息
private List&BannerItem& mBannerItemsList = new ArrayList&BannerItem&();
private List&ImageView& mImageViewList = new ArrayList&ImageView&();
private Drawable mPageI
private Drawable mPageIndicatorF
//banner默认图片
private Bitmap mDefaultB
private int mScreenW
private int mScreenH
private int mScrollX;
//current screen index
private int mWhich = 0;
public static final int MESSAGE_AUTO_SCROLL = 1;
public static final int MESSAGE_FETCH_BANNER_SUCCESS = 2;
public static final int MARGIN_BOTTOM = 2;
//480*150 banner的图片尺寸 150.0/480=0.3125f
public static final float ratio = 0.3125f;
//banner的位置
private int mLocation = -1;
//banner分为几屏
private int PAGE_COUNT = 4;
//滑动方向 是否向右滑动
private boolean mScrollToRight =
//是否自动滑屏
private boolean mTimerResume =
//标志用户是否手动滑动了屏幕
private boolean mByUserAction =
//标志banner是否可以滑出边界
private boolean mOverScrollMode =
//标志banner可以滑出边界多少像素
private int mOverScrollDistance = 0;
//定时器 用于banner的自动播放
final Timer timer = new Timer();
//定时器的时间间隔 单位:ms
public static final int TIMER_DURATION = 5000;
private TimerTask mTimerTask = new TimerTask()
public void run()
if (mTimerResume && !mByUserAction)
mHandler.sendEmptyMessage(MESSAGE_AUTO_SCROLL);
mByUserAction =
//ScrollBanner私有handler 用于处理内部逻辑
private Handler mHandler = new Handler()
public void handleMessage(Message msg)
//表示已经执行了onDetachedFromWindow,banner已经被销毁了
if( mBannerBitmaps == null || mLinearLayoutScreens == null ||
mImageViewList == null || mBannerItemsList == null || mContext == null )
switch (msg.what)
case MESSAGE_AUTO_SCROLL:
if (mWhich == PAGE_COUNT - 1)
mScrollToRight =
else if(mWhich == 0)
mScrollToRight =
if (mScrollToRight)
mHorizontalScrollViewEx.switchView(mWhich);
case MESSAGE_FETCH_BANNER_SUCCESS:
int more = 0;
if(mBannerItemsList != null)
more = mBannerItemsList.size() - PAGE_COUNT;
if(mBannerItemsList.size() & 0)
//如果有banner 显示它
ScrollBanner.this.show(true);
//如果后台返回的banneritem的数量大于预设值4
if(more & 0)
for (int i = 0; i & i++)
addBannerItem();
fetchBannerImages();
//用于获取bitmap
private Handler mBitmapHandler = new Handler()
public void handleMessage(Message msg)
//表示已经执行了onDetachedFromWindow,banner已经被销毁了
if( mBannerBitmaps == null || mLinearLayoutScreens == null ||
mImageViewList == null || mBannerItemsList == null || mContext == null )
Bitmap bitmap = (Bitmap)msg.
String urlString = msg.getData().getString("url");
Logger.d(TAG, "url=" + urlString);
if (urlString == null || bitmap == null || mBannerItemsList == null)
Logger.w(TAG, "bitmap=null imgurl=" + urlString);
for( int i = 0; i & mBannerItemsList.size(); i++ )
BannerItem item = mBannerItemsList.get(i);
if(item != null && urlString.equals(item.imgUrl) )
Logger.d(TAG, "find " + i + urlString);
if( mBannerBitmaps != null )
mBannerBitmaps.set( i, bitmap );
setBannerImages(i);
public ScrollBanner(Context context)
this(context, null);
public ScrollBanner(Context context, AttributeSet attrs)
super(context, attrs);
mContext =
public ScrollBanner(Context context, AttributeSet attrs, int defStyle)
super(context, attrs, defStyle);
mContext =
* @param context activity实例
* @param width banner的宽度 单位px
* @param height banner的高度 单位dip,-1表示根据图片比例自适应高度
* @param bannerClickListener 单击banner的回调接口
public ScrollBanner(Context context, final int width, final int height, OnBannerClickListener bannerClickListener)
this(context, null);
int activityId = ( (BaseActivity)context ).activityId();
if(activityId == BaseActivity.ACCOUNT_ID)//位置3
mLocation = 3;
else if(activityId == BaseActivity.GAMEZONE_ID)//位置2
mLocation = 2;
//初始化时不显示banner
this.show(false);
setResolution(width, height);
setOnBannerClickListener(bannerClickListener);
setDefaultBannerImages();
fetchBannerInfo();
* 通过xml方式加载banner,必须调用此方法才能显示
public void showBanner()
int activityId = ( (BaseActivity)mContext ).activityId();
if(activityId == BaseActivity.ACCOUNT_ID)//位置3
mLocation = 3;
else if(activityId == BaseActivity.GAMEZONE_ID)//位置2
mLocation = 2;
setDefaultBannerImages();
fetchBannerInfo();
* 暂停滚动
public void pauseScroll()
mTimerResume =
* 恢复滚动
public void resumeScroll()
mTimerResume =
* 设置回调接口
* @param callBack 单击banner的回调接口
public void setOnBannerClickListener(OnBannerClickListener bannerClickListener)
mBannerClickListener = (bannerClickListener != null ? bannerClickListener : ScrollBanner.this);
* 设置banner的解析度
* @param width banner的宽度
* @param height banner的高度
public void setResolution(final int width, final int height)
int heightInPx =
if(height == -1)
heightInPx = (int)(ratio * width) ;
Resources resources = getResources();
heightInPx = Math.round( TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, height, resources.getDisplayMetrics()) );
mScreenWidth =
mScreenHeight = heightInPx;
setLayoutParams(new LayoutParams(width, heightInPx));
initScrollView();
* 获取banner的高度
* @return banner的高度 单位:px
public int getHeightPixels()
return mScreenH
* 设置banner是否可以弹性滑出边界
* @param canOverScroll true表示可以滑出边界,false不能
public void setOverScrollMode(boolean canOverScroll)
mOverScrollMode = canOverS
if(canOverScroll == false)
mOverScrollDistance = 0;
* 向后台获取banner的各种信息
private void fetchBannerInfo()
NetworkManager netManager = (NetworkManager) AppEngine.getInstance().getManager(
IManager.NETWORK_ID);
netManager.getBannerInfo( String.valueOf(mLocation), ScrollBanner.this );
* 获取banner的滑屏图像
private void setDefaultBannerImages()
//为banner设置默认bitmap
BitmapFactory.Options bitmapFactoryOptions = new BitmapFactory.Options();
bitmapFactoryOptions.inJustDecodeBounds =
bitmapFactoryOptions.inSampleSize = 2;
Resources res=mContext.getResources();
mDefaultBitmap = BitmapFactory.decodeResource(res, R.drawable.banner_image_default, bitmapFactoryOptions);
for(int i = 0; i & PAGE_COUNT; i++)
mBannerBitmaps.add(i, mDefaultBitmap);
//初始化BannerItem对象
for (int i = 0; i & PAGE_COUNT; i++)
mBannerItemsList.add(i, null);
setBannerImages(-1);
private void fetchBannerImages()
//表示已经执行了onDetachedFromWindow,banner已经被销毁了
if( mBannerItemsList == null )
//ImageManager 根据url向其获取bitmap
ImageManager imageManager = (ImageManager)AppEngine.getInstance().
getManager(IManager.IMAGE_ID);
BannerItem item =
for(int i = 0; i & PAGE_COUNT; i++)
item = mBannerItemsList.get(i);
catch (IndexOutOfBoundsException e)
Logger.e(TAG, "fetchBannerImages error: " + e);
catch (Exception e)
Logger.e(TAG, "fetchBannerImages error: " + e);
//ImageManager为多线程,采用常见的三级cache策略(内存、文件、网络)
if( item != null && item.imgUrl != null )
imageManager.loadBitmap( item.imgUrl, mBitmapHandler );
* 设置banner的滑屏图像
* @param position 如果position=-1,则表示设置全部bitmap
private void setBannerImages(final int position)
int size = mBannerBitmaps.size();
if (size & PAGE_COUNT || mLinearLayoutScreens == null)
if(position &=0 && position & PAGE_COUNT )
Drawable drawable = mLinearLayoutScreens.get(position).getBackground();
mLinearLayoutScreens.get(position).setBackgroundDrawable
(new BitmapDrawable( mBannerBitmaps.get(position) ) );
drawable.setCallback(null);
drawable =
for(int i = 0; i & PAGE_COUNT; i++)
mLinearLayoutScreens.get(i).setBackgroundDrawable(new BitmapDrawable(mBannerBitmaps.get(i)));
* 是否显示banner
* @param isShow true显示 false不显示
public void show(boolean isShow)
if(isShow)
this.setVisibility(View.VISIBLE);
mTimerResume =
this.setVisibility(View.GONE);
mTimerResume =
* 切换到指定屏幕
* @param which 屏幕索引
public void switchToScreen(final int which)
mHorizontalScrollViewEx.switchView(which);
* 设置屏幕的数量 (此函数暂不开放)
* @param count 屏幕数量
protected void setScreenCount(final int count)
PAGE_COUNT =
* 设置偏移的距离 如果mOverScrollMode为false,则此设置无效 (此函数暂不开放)
* @param distance
protected void setOverScrollDistance(int distance)
if(distance & 0)
distance = 0;
mOverScrollDistance = mOverScrollMode ? distance : 0;
* 切换小圆点
* @param position current screen index
private void switchScreenPosition(final int position)
if( mPageIndicator == null || mPageIndicatorFocused == null )
int length = 0;
if(mImageViewList != null)
length = mImageViewList.size();
if (position &= length || position & 0 || length &= 0)
for(int i = 0; i & i++)
mImageViewList.get(i).setImageDrawable(mPageIndicator);
mImageViewList.get(position).setImageDrawable(mPageIndicatorFocused);
* 初始化整个FrameLayout视图组
private void initScrollView()
setLayoutParams(new LayoutParams(mScreenWidth, mScreenHeight ));
linearLayoutScrolLayout = new LinearLayout(mContext);
linearLayoutScrolLayout.setBackgroundColor(Color.WHITE);
linearLayoutScrolLayout.setOrientation(LinearLayout.HORIZONTAL);
int mVersionCode = 8;
mVersionCode = Integer.valueOf(android.os.Build.VERSION.SDK);
Logger.d(TAG, "sdk version=" + mVersionCode);
catch (Exception e)
e.printStackTrace();
//针对android1.6及以下的特殊处理 此为android的低版本bug
if(mVersionCode &= 5)
linearLayoutScrolLayout.setBaselineAligned(false);
//初始化四个滑动view
for(int i = 0; i & PAGE_COUNT; i++)
LinearLayout linearLayoutScreen = new LinearLayout(mContext);
linearLayoutScreen.setOrientation(LinearLayout.VERTICAL);
linearLayoutScrolLayout.addView(linearLayoutScreen, new LayoutParams(
mScreenWidth,
LayoutParams.FILL_PARENT));
mLinearLayoutScreens.add(i, linearLayoutScreen);
//初始化小圆点视图
RelativeLayout relativeLayout = new RelativeLayout(mContext);
relativeLayout.setLayoutParams(new LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
//linearLayoutForDot为小圆点视图
linearLayoutForDot =new LinearLayout(mContext);
android.widget.RelativeLayout.LayoutParams layoutParams =
new android.widget.RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
//小圆点距底部的距离 单位:px
layoutParams.bottomMargin = MARGIN_BOTTOM;
layoutParams.rightMargin = MARGIN_BOTTOM;
layoutParams.addRule(android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM);
layoutParams.addRule(android.widget.RelativeLayout.CENTER_HORIZONTAL);
linearLayoutForDot.setLayoutParams(layoutParams);
linearLayoutForDot.setOrientation(LinearLayout.HORIZONTAL);
linearLayoutForDot.setHorizontalGravity(Gravity.CENTER);
linearLayoutForDot.setVerticalGravity(Gravity.CENTER);
//下面两句实现圆角半透明效果 不采用
// linearLayoutForDot.setBackgroundResource(R.drawable.round_corner_bg);
// linearLayoutForDot.getBackground().setAlpha(100);
//初始化4个小圆点
mPageIndicator = getResources().getDrawable(R.drawable.page_indicator);
mPageIndicatorFocused = getResources().getDrawable(R.drawable.page_indicator_focused);
for(int i = 0; i & PAGE_COUNT; i++)
ImageView imageView = new ImageView(mContext);
imageView.setImageDrawable(mPageIndicator);
mImageViewList.add(i, imageView);
LinearLayout.LayoutParams layoutParamsForDot =
new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
layoutParamsForDot.rightMargin = 5;
linearLayoutForDot.addView(imageView, layoutParamsForDot);
mImageViewList.get(0).setImageDrawable(mPageIndicatorFocused);
relativeLayout.addView(linearLayoutForDot);
mHorizontalScrollViewEx = new HorizontalScrollViewEx(mContext, null, mBannerClickListener);
mHorizontalScrollViewEx.setLayoutParams(new LayoutParams(
mScreenWidth * PAGE_COUNT,
LayoutParams.FILL_PARENT));
mHorizontalScrollViewEx.addView(linearLayoutScrolLayout, new LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
mHorizontalScrollViewEx.setHorizontalScrollBarEnabled(false);
mHorizontalScrollViewEx.setHorizontalFadingEdgeEnabled(false);
addView(mHorizontalScrollViewEx);
addView(relativeLayout);
//自动滑屏 5秒一次
timer.schedule(mTimerTask, 5000, TIMER_DURATION);
* 加一个banner页面 TODO此函数写的不好
private void addBannerItem()
//表示已经执行了onDetachedFromWindow,banner已经被销毁了
if( mBannerBitmaps == null || mLinearLayoutScreens == null ||
mImageViewList == null || mContext == null )
//调整屏幕数量和总宽度
PAGE_COUNT += 1;
mHorizontalScrollViewEx.getLayoutParams().width = mScreenWidth * PAGE_COUNT;
//加载默认图片资源
if(mDefaultBitmap == null)
BitmapFactory.Options bitmapFactoryOptions = new BitmapFactory.Options();
bitmapFactoryOptions.inJustDecodeBounds =
bitmapFactoryOptions.inSampleSize = 2;
Resources res=mContext.getResources();
mDefaultBitmap = BitmapFactory.decodeResource(res, R.drawable.banner_image_default, bitmapFactoryOptions);
mBannerBitmaps.add(mDefaultBitmap);
mBannerItemsList.add(null);
//加一个屏幕
LinearLayout linearLayoutScreen = new LinearLayout(mContext);
linearLayoutScreen.setOrientation(LinearLayout.VERTICAL);
linearLayoutScreen.setBackgroundDrawable(new BitmapDrawable( mBannerBitmaps.get(PAGE_COUNT - 1) ));
linearLayoutScrolLayout.addView(linearLayoutScreen, new LayoutParams(
mScreenWidth,
LayoutParams.FILL_PARENT));
mLinearLayoutScreens.add(linearLayoutScreen);
//加一个小圆点
ImageView imageView = new ImageView(mContext);
imageView.setImageDrawable(mPageIndicator);
mImageViewList.add(imageView);
LinearLayout.LayoutParams layoutParamsForDot =
new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
layoutParamsForDot.rightMargin = 5;
linearLayoutForDot.addView(imageView, layoutParamsForDot);
private class HorizontalScrollViewEx extends ViewGroup implements
OnGestureListener
private GestureDetector mGestureD
private int mWhichS
public HorizontalScrollViewEx(Context context, AttributeSet attrs, OnBannerClickListener bannerClickListener)
super(context, attrs);
mGestureDetector = new GestureDetector(this);
//解决长按屏幕后无法拖动的现象
mGestureDetector.setIsLongpressEnabled(false);
//构造弹性滑动对象
mScroller = new Scroller(context);
* 切换到指定屏幕
* @param whichScreen 屏幕index
public void switchView(int whichScreen)
if(mLinearLayoutScreens == null)
// 防止非法参数
if (whichScreen & 0)
whichScreen = 0;
else if(whichScreen &= PAGE_COUNT)
whichScreen = PAGE_COUNT - 1;
Logger.i(TAG, "switch view to " + whichScreen);
int delta = whichScreen * mScreenWidth - HorizontalScrollViewEx.this.getScrollX();
//缓慢滚动到指定位置
mScroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 3);
// refresh
invalidate();
//delta&0 stands for user scroll view to right
if (delta & 0)
mScrollToRight =
mScrollToRight =
mWhichScreen = whichS
mWhich = whichS
//切换小圆点
switchScreenPosition(mWhichScreen);
* 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发
public boolean onDown(MotionEvent e)
Logger.i("MyGesture", "onDown");
mScrollX = HorizontalScrollViewEx.this.getScrollX();
* 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
* 注意和onDown()的区别,强调的是没有松开或者拖动的状态
public void onShowPress(MotionEvent e)
Logger.i("MyGesture", "onShowPress");
* 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发
public boolean onSingleTapUp(MotionEvent e)
Logger.i("MyGesture", "onSingleTapUp");
if(mBannerItemsList == null || mBannerItemsList.size() &= mWhichScreen)
BannerItem bannerItem = mBannerItemsList.get(mWhichScreen);
if(bannerItem != null)
BannerMotionEvent bannerMotionEvent =
new BannerMotionEvent(mWhichScreen, bannerItem.action, bannerItem.url,
bannerItem.gameId, bannerItem.gameType, bannerItem.title);
mBannerClickListener.onBannerClick(bannerMotionEvent);
/** 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE,
* 1个ACTION_UP触发
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY)
Logger.i("MyGesture", "onFling velocityX=" + velocityX);
mWhichScreen = velocityX & 0 ?
mWhichScreen - 1
: mWhichScreen + 1;
switchView(mWhichScreen);
* 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY)
Logger.i("MyGesture", "onScroll");
//禁止弹性滚动
if (mOverScrollMode == false)
float x1 = e1.getX();
float x2 = e2.getX();
if(mWhichScreen == 0 && x1 & x2)
else if(mWhichScreen == PAGE_COUNT - 1 && x1 & x2)
int distance = Math.abs(getScrollX() - mWhichScreen * mScreenWidth);
if ((mWhichScreen ==0 || mWhichScreen == PAGE_COUNT -1) && distance & mOverScrollDistance)
this.scrollBy((int)distanceX, 0);
* 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发
public void onLongPress(MotionEvent e)
Logger.i("MyGesture", "onLongPress");
public boolean onTouchEvent(MotionEvent event)
if(event.getAction() == MotionEvent.ACTION_DOWN)
mTimerResume =
if ( !mScroller.isFinished() )
mScroller.abortAnimation();
else if(event.getAction() == MotionEvent.ACTION_UP)
//开始自动滑屏
mTimerResume =
mByUserAction =
boolean consume = mGestureDetector.onTouchEvent(event);
if (consume == false && event.getAction() == MotionEvent.ACTION_UP)
int curScrollX = HorizontalScrollViewEx.this.getScrollX();
int mWhichScreen = (curScrollX + mScreenWidth / 2) /mScreenW
switchView(mWhichScreen);
public void computeScroll()
if (mScroller.computeScrollOffset())
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate();
protected void onLayout(boolean changed, int l, int t, int r, int b)
if (changed)
int childLeft = 0;
final int childCount = getChildCount();
for (int i=0; i&childC i++)
final View childView = getChildAt(i);
if (childView.getVisibility() != View.GONE)
final int childWidth = childView.getMeasuredWidth();
childView.layout(childLeft, 0,
childLeft+childWidth, childView.getMeasuredHeight());
childLeft += childW
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final int width = MeasureSpec.getSize(widthMeasureSpec);
final int count = getChildCount();
for (int i = 0; i & i++)
getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
scrollTo(mWhich * mScreenWidth, 0);
* override此函数,防止其修改构造方法所定义的宽和高&br/&
* 注意:在这里,设置宽和高将不起作用
public void setLayoutParams(android.view.ViewGroup.LayoutParams params)
params.width = mScreenW
params.height = mScreenH
super.setLayoutParams(params);
//标志view AttachedToWindow
protected void onAttachedToWindow()
super.onAttachedToWindow();
mTimerResume =
//标志view已经脱离window,典型的情形是view被销毁了,此时取消timer
protected void onDetachedFromWindow()
super.onDetachedFromWindow();
Logger.d(TAG, "onDetachedFromWindow");
mTimerResume =
int activityId = ( (BaseActivity)mContext ).activityId();
//如果是账号管理页面 则释放内存
if(activityId == BaseActivity.ACCOUNT_ID)
destroy();
* 销毁banner
public void destroy()
mTimerTask.cancel();
timer.cancel();
//去除各种bitmap对activity的引用关系
destoryBitmaps();
System.gc();
* 去除各种bitmap对activity的引用关系
private void destoryBitmaps()
for (View view : mLinearLayoutScreens)
Drawable drawable = view.getBackground();
BitmapDrawable bitmapDrawable =
if(drawable instanceof BitmapDrawable)
bitmapDrawable = (BitmapDrawable)
if(bitmapDrawable != null)
//解除drawable对view的引用
bitmapDrawable.setCallback(null);
bitmapDrawable =
for (ImageView imageView : mImageViewList)
Drawable drawable = imageView.getDrawable();
if(drawable != null)
drawable.setCallback(null);
drawable =
mPageIndicator.setCallback(null);
mPageIndicator =
mPageIndicatorFocused.setCallback(null);
mPageIndicatorFocused =
mLinearLayoutScreens.clear();
mLinearLayoutScreens =
mBannerBitmaps.clear();
mBannerBitmaps =
mImageViewList.clear();
mImageViewList =
mBannerItemsList.clear();
mBannerItemsList =
//单击事件
public void onBannerClick( BannerMotionEvent bannerMotionEvent )
final int position = bannerMotionEvent.
if(mContext == null)
NotificationInfo notificationInfo = new NotificationInfo();
notificationInfo.msgType = bannerMotionEvent.getAction();
int action = bannerMotionEvent.getAction();
if(action == NotificationInfo.NOTIFICATION_SINGLEGAME_MSG) //单个游戏消息,直接启动该游戏
notificationInfo.gameId = Integer.parseInt( bannerMotionEvent.getGameId() );
notificationInfo.gameType = Integer.parseInt( bannerMotionEvent.getGameType() );
catch (NumberFormatException e)
Logger.e(TAG, e.toString());
else if(action == NotificationInfo.NOTIFICATION_GAMEPAGE_MSG) //游戏主页消息,通过客户端展示游戏主页
notificationInfo.gameId = Integer.parseInt( bannerMotionEvent.getGameId() );
catch (NumberFormatException e)
Logger.e(TAG, e.toString());
notificationInfo.issueTitle = bannerMotionEvent.getTitle();
else if(action == NotificationInfo.NOTIFICATION_SHOW_WEBVIEW_MSG) //交叉推广消息,通过一个webview展示
notificationInfo.issueTitle = bannerMotionEvent.getTitle();
notificationInfo.openUrl = bannerMotionEvent.getResponseUrl();
else //reserved
Intent intent = notificationInfo.generateIntent(mContext);
if(intent != null)
mContext.startActivity(intent);
* ScrollBanner所关联的banner项 可以为多个 一个为一屏
public static class BannerItem extends Object
public static final String ACTION = "action";
public static final String URL = "url";
public static final String IMGURL = "imgurl";
public static final String GAMEID = "gameid";
public static final String GAMETYPE = "gametype";
public static final String TITLE = "title";
public int index = -1;
public int action = -1;
public String url = "";
public String imgUrl = "";
public String gameId = "";
public String gameType = "";
public String title = "";
public BannerItem(){}
* BannerMotionEvent:单击banner所产生的事件对象&br/&
*getAction()来获取动作类别&br/&
*getResponseUrl()来获取响应url&br/&
public static class BannerMotionEvent extends Object
* ACTION_PLAY_FLASH: 播放游戏
public static final int ACTION_PLAY = 2;
* ACTION_HOMEPAGE:打开官网
public static final int ACTION_HOMEPAGE = 3;
* ACTION_OPEN_URL:打开指定url
public static final int ACTION_OPEN_URL = 4;
//banner中屏幕的index
private int index = -1;
private String responseUrl = "";
//动作种类
private int action = -1;
private String gameId = "";
//gametype flash游戏(0) or h5游戏(1)
private String gameType = "";
//webview的标题
private String title = "";
public BannerMotionEvent(int index, int action, String responseUrl,
String gameId, String gameType, String title)
BannerMotionEvent.this.index =
BannerMotionEvent.this.action =
BannerMotionEvent.this.responseUrl = responseU
BannerMotionEvent.this.gameId = gameId;
BannerMotionEvent.this.gameType = gameT
BannerMotionEvent.this.title =
* 获取当前BannerMotionEvent事件对象的动作种类
* @return 动作种类:ACTION_PLAY等
public int getAction()
* 获取当前BannerMotionEvent事件对象的title
* @return title webview的标题
public String getTitle()
* 获取当前BannerMotionEvent事件对象的gameId
* @return gameId
public String getGameId()
return gameId;
* 获取当前BannerMotionEvent事件对象的gameType
* @return gameType 0 or 1
public String getGameType()
return gameT
* 获取当前BannerMotionEvent事件对象的响应url
* @return 响应url
public String getResponseUrl()
return responseU
@SuppressLint("DefaultLocale")
public String toString()
return String.format("BannerMotionEvent { index=%d, action=%d, responseUrl=%s, gameId=%s, gameType=%s, title=%s }",
index, action, responseUrl, gameId, gameType, title);
public void onBannerInfoSuccess(List&BannerItem& items)
Logger.d(TAG, "onBannerInfoSuccess");
mBannerItemsList =
mHandler.sendEmptyMessage(MESSAGE_FETCH_BANNER_SUCCESS);
public void onBannerInfoFailed()
Logger.e(TAG, "onBannerInfoFailed");
ComponentCallBack.java
public interface ComponentCallBack
public static interface OnBannerClickListener
* banner单击事件
* @param bannerMotionEvent 单击事件对象,包含所需的响应信息
* 参见 {@link BannerMotionEvent}
public abstract void onBannerClick( BannerMotionEvent bannerMotionEvent );
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 移动端banner轮播代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信