<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
如上圖所示效果我們應該都不陌生,這是一個簡單的banner輪播效果,網上也有很多的開源專案,但有時候可能我們僅僅只需要一些簡單的效果,並不需要其他過多的東西。這裡簡單的對banner進行一下封裝,隨時呼叫和新增一些新的功能。
/** * Created by xiaolong on 2018/1/23. */ public class BannerView extends FrameLayout implements ViewPager.OnPageChangeListener{ private ViewPager viewPager; //網路圖片地址 private List<String> imageUrls; //指示點的容器 private LinearLayout pointLayout; //當前頁面位置 private int currentItem; //自動播放時間 private int autoPlayTime = 2000; //是否自動播放 private boolean isAutoPlay; //是否是一張圖片 private boolean isOneImage; //監聽事件 private OnBannerItemClick onBannerItemClick; //這裡利用handler實現迴圈播放 private Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { currentItem++; currentItem = currentItem % (imageUrls.size() + 2); viewPager.setCurrentItem(currentItem); handler.sendEmptyMessageDelayed(0,autoPlayTime); return false; } }); public BannerView(@NonNull Context context) { this(context,null); } public BannerView(@NonNull Context context, @Nullable AttributeSet attrs) { this(context, attrs,0); } public BannerView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs,R.styleable.BannerView,0,0); //預設自動播放 isAutoPlay = typedArray.getBoolean(R.styleable.BannerView_isAutoPlay,true); typedArray.recycle(); viewPager = new ViewPager(getContext()); pointLayout = new LinearLayout(getContext()); //新增監聽事件 viewPager.addOnPageChangeListener(this); //利用佈局屬性將指示器容器放置底部並居中 FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; params.bottomMargin = 60; addView(viewPager); addView(pointLayout,params); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { currentItem = position; if (!isOneImage) { switchToPoint(toRealPosition(position)); } } @Override public void onPageScrollStateChanged(int state) { //根據滑動鬆開後的狀態,去判斷當前的current 並跳轉到指定current if (state == ViewPager.SCROLL_STATE_IDLE) { int current = viewPager.getCurrentItem(); int lastReal = viewPager.getAdapter().getCount() - 2; if (current == 0) { viewPager.setCurrentItem(lastReal, false); } else if (current == lastReal + 1) { viewPager.setCurrentItem(1, false); } } } //設定viewpager介面卡 private class BannerAdapter extends PagerAdapter { @Override public int getCount() { return imageUrls.size() + 2; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, final int position) { ImageView imageView = new ImageView(getContext()); imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (onBannerItemClick != null) { onBannerItemClick.onItemClick(toRealPosition(position)); } } }); imageView.setScaleType(ImageView.ScaleType.FIT_XY); Glide.with(getContext()).load(imageUrls.get(toRealPosition(position))).into(imageView); container.addView(imageView); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } //新增網路圖片 public void setImageUrls(List<String> imageUrls) { this.imageUrls = imageUrls; if (imageUrls.size() <= 1) { isOneImage = true; }else { isOneImage = false; } initViewPager(); } //載入viewPager private void initViewPager() { if (!isOneImage) { //新增指示點 addPoints(); } BannerAdapter adapter = new BannerAdapter(); viewPager.setAdapter(adapter); //預設當前圖片 viewPager.setCurrentItem(1); //判斷是否自動播放和是否是一張圖片的情況 if (isAutoPlay && !isOneImage) { handler.sendEmptyMessageDelayed(0,autoPlayTime); } } //新增指示點 private void addPoints() { LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); lp.setMargins(10, 10, 10, 10); ImageView imageView; int length = imageUrls.size(); for (int i = 0; i < length; i++) { imageView = new ImageView(getContext()); imageView.setLayoutParams(lp); imageView.setImageResource(R.drawable.select_point_bg); pointLayout.addView(imageView); } switchToPoint(0); } //切換指示器 private void switchToPoint(int currentPoint) { for (int i = 0; i < pointLayout.getChildCount(); i++) { pointLayout.getChildAt(i).setEnabled(false); } pointLayout.getChildAt(currentPoint).setEnabled(true); } //返回真實的位置 private int toRealPosition(int position) { int realPosition; if (imageUrls.size() > 0) { realPosition = (position - 1) % imageUrls.size(); if (realPosition < 0) realPosition += imageUrls.size(); }else{ realPosition = 0; } return realPosition; } public void setAutoPlay(boolean autoPlay) { isAutoPlay = autoPlay; } public void setOnBannerItemClick(OnBannerItemClick onBannerItemClick) { this.onBannerItemClick = onBannerItemClick; } //新增監聽事件回撥 public interface OnBannerItemClick{ void onItemClick(int position); } }
//設定是否自動播放 bannerView.setAutoPlay(true); //新增網路圖片 bannerView.setImageUrls(data); //banner的點選事件 bannerView.setOnBannerItemClick(new BannerView.OnBannerItemClick() { @Override public void onItemClick(int position) { Toast.makeText(MainActivity.this,"圖片" + position,Toast.LENGTH_LONG).show(); } });
這裡我只考慮了使用網路圖片進行展示,使用本地圖片原理是一樣的,在裡面多加個方法即可。此效果程式碼不是很複雜,通俗易懂。唯一值得一說的是我在實現viewpager
無限滑動時採用的是return imageUrls.size() + 2
的方法。這裡我們新增兩條資料分別為第一條和最後一條。第一條代表著最後一張圖片而最後一條則代表著第一張圖片,這裡手動畫個圖:
通過此圖我們應該不難發現,當我們滑動到第二個0的時候則跳轉到第一個0,滑動到第一個2的時候則跳轉到第二個2。這裡0代表第一張圖片,2代表第二張圖片。這樣就可以實現無限滑動的效果了,可能有些人會覺得這樣做有些複雜還要判斷真實的位置不如直接將getConut()
返回一個最大值然後取其中間值即可。但這樣做其實程式碼效能並不是很高。
這樣一個常用的banner就寫好了,當我們需要實現一些滑動動畫的時候,可以在裡面實現viewpager
的動畫屬性即可。先從簡單的入手,慢慢的就可以瞭解更多的原理和知識點,哈哈!這裡貼出傳送門以便參考。
到此這篇關於Android封裝Banner控制元件方法介紹的文章就介紹到這了,更多相關Android封裝Banner內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45