Android 广告轮播图
2016-05-13 10:22
543 查看
package com.view; import android.content.Context; import android.media.Image; import android.os.Handler; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import com.sgcc.cs.BaseActivity; import com.sgcc.cs.R; import java.util.List; /** * Created by huangyan on 16/5/12. */ public class CarouselAdLayout extends LinearLayout { private Context mContext; /*轮播 viewpager*/ private ViewPager adViewPager; /*轮播图片知识*/ private LinearLayout llPoints; /*图片地址*/ private List<String> imageSource; // private /*广告监听*/ private CarouseAdListener adListener; /*存放图片Imageview*/ private ImageView[] imageViews; /*存放图片指示view*/ private ImageView[] pointViews; /*默认指示图片*/ private int selectImageResource = R.drawable.ads_selected; private int unselectImageResorce = R.drawable.ads_unselected; /*是否在播放*/ private boolean isPlay=false; public CarouselAdLayout(Context context) { super(context); } public CarouselAdLayout(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; LayoutInflater.from(context).inflate(R.layout.tab_carouse_ad_layout, this); adViewPager = (ViewPager) findViewById(R.id.ad_banner); adViewPager.setOnPageChangeListener(new CommunicationPageChangeListener()); llPoints = (LinearLayout) findViewById(R.id.ll_point); } /** * 设置指示图片 * * @param selectImageResource 当前图片指示 * @param unselectImageResorce 其他图片指示 */ private void setPointImageResource(int selectImageResource, int unselectImageResorce) { this.selectImageResource = selectImageResource; this.unselectImageResorce = unselectImageResorce; } /** * 设置轮播图片 * * @param imageSource * @param listener */ public void setImageSource(List<String> imageSource, CarouseAdListener listener) { this.imageSource = imageSource; this.adListener = listener; if (imageSource == null || imageSource.size() == 0)//未传入图片地址 return; imageViews = new ImageView[imageSource.size()]; pointViews = new ImageView[imageSource.size()]; llPoints.removeAllViews(); ImageView adIv; for (int i = 0; i < imageSource.size(); i++) { adIv = new ImageView(mContext); LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.setMargins(5, 0, 5, 0); adIv.setLayoutParams(params); // adIv.setScaleType(ImageView.ScaleType.CENTER_CROP); pointViews[i] = adIv; if (i == 0) adIv.setImageResource(selectImageResource); else adIv.setImageResource(unselectImageResorce); llPoints.addView(adIv); } MyPagerAdapter adapter = new MyPagerAdapter(); adViewPager.setAdapter(adapter); startCarouseTask();//开始轮播 } /*handler*/ private Handler handler = new Handler(); /*当前循环项*/ private int currentImageIndex = 0; /*轮播Task*/ private Runnable carouseAdTask = new Runnable() { @Override public void run() { // if (++currentImageIndex >= imageSource.size())//最后一张 // currentImageIndex = 0; adViewPager.setCurrentItem(adViewPager.getCurrentItem() + 1); if(isPlay) handler.postDelayed(carouseAdTask, 3000); } }; /*开始轮播*/ private void startCarouseTask() { stopCarouseTask(); isPlay=true; handler.postDelayed(carouseAdTask, 3000); } /*停止轮播*/ private void stopCarouseTask() { isPlay=false; handler.removeCallbacks(carouseAdTask); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_UP) startCarouseTask(); else stopCarouseTask(); return super.dispatchTouchEvent(ev); } /** * Viewpager 适配器 */ private class MyPagerAdapter extends PagerAdapter { private ImageView cacheIv;//被销毁的View 避免重复创建 @Override public int getCount() {//数量 // return imageSource.size(); return Integer.MAX_VALUE;//避免最后一张拖动回到第一张 } @Override public boolean isViewFromObject(View view, Object object) {//是否由对象生成界面 // Log.e("msg"," isViewFromObject "+(view == object)); return view == object; } @Override public void destroyItem(ViewGroup container, int position, Object object) {//销毁 ImageView iv = (ImageView) object; adViewPager.removeView(iv); cacheIv = iv;//和上面是否可以合成一步 } @Override public Object instantiateItem(ViewGroup container, final int position) {//return 一个对象 ImageView adImageview = null; if (cacheIv == null) {//创建View adImageview = new ImageView(mContext); adImageview.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); adImageview.setAdjustViewBounds(true); adImageview.setMaxWidth(((BaseActivity) mContext).getSWidth()); adImageview.setMaxHeight(((BaseActivity) mContext).getSHeight()); adImageview.setScaleType(ImageView.ScaleType.CENTER_CROP); } else { adImageview = cacheIv; cacheIv=null;//防止倒滑时复用报错,设置为空 } adImageview.setOnClickListener(new OnClickListener() {//设置监听 @Override public void onClick(View view) { if (adListener != null) adListener.onAdCilck(position % imageSource.size(), imageSource.get(position % imageSource.size()), (ImageView) view); } }); adListener.displayImage(adImageview, imageSource.get(position % imageSource.size()));//设置显示图片 container.addView(adImageview);//添加 return adImageview; } } private class CommunicationPageChangeListener implements ViewPager.OnPageChangeListener { @Override public void onPageScrollStateChanged(int arg0) { // Log.e("msg","状态改变:"+arg0); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int arg0) { // Log.e("msg"," onPageSelected" +arg0); for (int i = 0; i < pointViews.length; i++) { if (i == arg0 % imageSource.size()) pointViews[i].setImageResource(selectImageResource); else pointViews[i].setImageResource(unselectImageResorce); } } } /*轮播图监听*/ public static interface CarouseAdListener { public void onAdCilck(int index, String imgUrl, ImageView view); public void displayImage(ImageView iv, String imgUrl); } }
相关文章推荐
- Android获取View的截图,包括各种Layout的截图
- android 百度导航引擎初始化失败找不到libgnustl_shared.so以及百度鹰眼轨迹异常的问题
- 【Android】ListView监听上下滑动(设置滚动监听判断ListView的滚动方向同时获取屏幕高度、ListView实际高度,判断是否需要展示返回顶部按钮(具体逻辑请看代码--附有详细注释)。
- Android系统内存不足时,组建回收顺序问题
- android adb常用指令
- android数据库Sqlite(3)
- android studio 配置git,绕过曾经掉下去的坑
- Android HTML.fromHtml解析图片标签
- AS不能真机调试
- Android环境搭建
- Android 使用模拟位置(支持Android 6.0)
- android synchronized浅析
- RecyclerView 的 RecyclerView.Adapter 通用版的实现
- AndroidStudio2.0文档自动提示&代码提示补全
- ListView分页加载数据
- Android 代理模式讲解
- Android studio 代码补全修改以及切换到熟悉的eclipse上
- android 属性动画初识(三)
- android隐藏以及显示软键盘以及不自动弹出键盘的方法
- Android 开发技术流程