Android自定义View(七)--很low的bannerView.doc_第1页
Android自定义View(七)--很low的bannerView.doc_第2页
Android自定义View(七)--很low的bannerView.doc_第3页
Android自定义View(七)--很low的bannerView.doc_第4页
Android自定义View(七)--很low的bannerView.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android自定义View(七)-很low的bannerView作为一个长期“拷贝”的程序猿,偶尔还是有点小失落的,偶尔也会有大神梦,即使那么遥不可及。 于是乎,在一个月黑风高的夜晚,有史以来最low的广告banner诞生了。先谈谈整体的思路吧,看到有些大神用AdapterView实现的,而我这种渣,首先想到的就是viewpager,虽然viewpager没有那么完美,不过能勉强将就也还是极好的。当然只有viewpager是不够的,还有viewpager上面的那几个小点点,这个我就更简单粗暴的用一个Layout装载了结果imageview,然后viewpager改变item的时候,改变小点点的图片就可以啦。还有一个问题就是循环播放啦,这个就要从viewpager的adapter入手了,上网查了很多,得到的结论就是在adapter的getCount方法上做手脚,即返回一个很大的数,使viewpager的item数量大于你看到的实际数量,而多的item中显示与前面item相同的内容,这样看起来就是循环的啦。剩下的要解决自动循环就更简单啦,管你用timer还是handler还是thread都可以简单搞定。最后要解决的就是使这个东西用起来比较简单,所以我就简单的对它进行了一层小包装。主要的视图类package com.drivingassisstantHouse.library.widget.bannerview;import android.content.Context;import android.content.res.TypedArray;import android.support.annotation.NonNull;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.animation.AccelerateInterpolator;import android.view.animation.Interpolator;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.RelativeLayout;import android.widget.Scroller;import com.drivingassisstantHouse.library.R;import com.drivingassisstantHouse.library.tools.SLog;import com.drivingassisstantHouse.library.tools.ToolUnit;import java.lang.reflect.Field;import java.util.ArrayList;/* * 包名:com.drivingassisstantHouse.library.widget.bannerview * 描述:广告banner * 创建者:yankebin * 日期:2016/2/27 */public class BannerView extends RelativeLayout public static final int BANNER_TYPE_GUIDE = 1; public static final int BANNER_TYPE_ADVERT = BANNER_TYPE_GUIDE + 1; protected int type = BANNER_TYPE_GUIDE; private BaseBannerViewpager viewPager; private LinearLayout indicator; private boolean isAutoLoop = false; private long loopDelayTime = 4000; private long scrollDuration=1200; private ArrayList dots = new ArrayList(); public BannerView(Context context) super(context); init(); public BannerView(Context context, AttributeSet attrs) super(context, attrs); TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.BannerView); type = typedArray.getInt(R.styleable.BannerView_bannerType, BANNER_TYPE_GUIDE); isAutoLoop = typedArray.getBoolean(R.styleable.BannerView_autoPlay, false); loopDelayTime = typedArray.getInt(R.styleable.BannerView_loopTime, 4000); scrollDuration=typedArray.getInt(R.styleable.BannerView_scrollDuration, 1200); if (null != typedArray) typedArray.recycle(); init(); Override protected void onVisibilityChanged(NonNull View changedView, int visibility) super.onVisibilityChanged(changedView, visibility); if (visibility != VISIBLE) removeCallbacks(autoRunner); else if (isAutoLoop) startAutoPlay(); private Runnable autoRunner = new Runnable() Override public void run() if (!isAutoLoop) return; int position=viewPager.getCurrentItem(); viewPager.setCurrentItem(+position, true); postDelayed(this, loopDelayTime); ; private Runnable indicatorRunner=new Runnable() Override public void run() int currentPosition = viewPager.getCurrentItem(); for (int i = 0; i dots.size(); i+) ImageView imageView = dots.get(i); if (currentPosition % dots.size() = i) imageView.setImageResource(R.drawable.banner_dot_shape_selected); else imageView.setImageResource(R.drawable.banner_dot_shape_normal); ; public void setIsAutoLoop(boolean isLoop) this.isAutoLoop = isLoop; public boolean isAutoLoop() return isAutoLoop; public void setBannerAdapter(PagerAdapter adapter) viewPager.setAdapter(adapter); private void init() viewPager = new BaseBannerViewpager(getContext(); viewPager.setLayoutParams(new LayoutParams(-1, -1); indicator = new LinearLayout(getContext(); LayoutParams params = new LayoutParams(-2, -2); params.addRule(ALIGN_PARENT_BOTTOM); params.addRule(CENTER_HORIZONTAL); params.bottomMargin = 10; indicator.setLayoutParams(params); indicator.setOrientation(LinearLayout.HORIZONTAL); addView(viewPager); addView(indicator); initPagerListener(); private void initPagerListener() viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) Override public void onPageSelected(int position) changeDotsColors(); Override public void onPageScrollStateChanged(int state) ); private void initDots(int size) if (size = 0) throw new IllegalArgumentException(size必须大于0); removeCallbacks(autoRunner); dots.clear(); LinearLayout.LayoutParams pointViewParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); pointViewParams.setMargins(ToolUnit.dipTopx(8), 0, ToolUnit.dipTopx(8), ToolUnit.dipTopx(8); for (int i = 0; i 0) ViewPager pager = (ViewPager) findViewById(childId); if (pager != null) pager.requestDisallowInterceptTouchEvent(true); return super.onInterceptTouchEvent(event); public void setAllowChildMovement(int id) this.childId = id; Override public void setAdapter(PagerAdapter adapter) initDots(BaseBannerPagerAdapter)adapter).getRealCount(); super.setAdapter(adapter); viewpager的adapterpackage com.drivingassisstantHouse.library.widget.bannerview;import android.util.SparseArray;import android.view.View;import android.view.ViewGroup;import java.util.ArrayList;/* * 包名:com.simpletour.client.activity * 描述:banner适配器 * 创建者:yankebin * 日期:2016/2/27 */public abstract class BaseBannerPagerAdapter extends android.support.v4.view.PagerAdapter protected SparseArray views = new SparseArray(); private boolean isLoop; protected ArrayList datas; public BaseBannerPagerAdapter() datas = new ArrayList(); public BaseBannerPagerAdapter(ArrayList datas) this.datas = datas; Override public final int getCount() return isLoop ? Integer.MAX_VALUE : datas.size(); Override public Object instantiateItem(ViewGroup container, int position) position = position % datas.size(); View view = views.get(position); if (view = null) view = newView(position % getCount(); views.put(position, view); container.addView(view); return view; public void notifyUpdateView(int position) View view = updateView(views.get(position), position); views.put(ition, view); notifyDataSetChanged(); public View updateView(View view, int position) return view; public abstract View newView(int position); public final int getRealCount() return datas.size(); public void subscribe(BannerView bannerView) isLoop =bannerView.isAutoLoop()| bannerView.type = BannerView.BANNER_TYPE_ADVERT; bannerView.setBannerAdapter(this); 一些自定义属性 代码里调用首先定义好xml文件android:orientation=vertical android:layout_width=match_parent android:layout_height=match_parent 其次实现BaseBannerPagerAdapter private class MBannerPagerAdapter extends BaseBannerPagerAdapter public MBannerPagerAdapter() super(imageUrlList); initImageLoader(); private void initImageLoader() Override public boolean isViewFromObject(View view, Object object) return null != object & object = view; Override public void destroyItem(ViewGroup container, int position, Object object) container.removeView(views.get(position % views.size(); Override public View newView(final int position) ImageView imageView = new ImageView(GuideActivity.this); imageView.setLayoutParams(new ViewGroup

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论