我的工具太少了之Android无限轮播图片,最后一张过度动画很重要
2015-12-08 11:32
471 查看
1.为什么要写个无限轮播图片?
使用录太高啦!
2.为什么要自己写个无限轮播,Android的FilterView就可以啊!
自己写的才是最好的,FilteView滑动太不自然啦!
好啦,废话不多说,看图说代码~!
上面怎么没有图片?O(∩_∩)O~,不要在意这些细节,大家是来学习代码的,图片我用色块代替了!
好,下面是代码部分,由于轮播使用频繁,我就自定义了一个类,下次需要,只要把这个自定义类,写入xml,设置高度就可以了,什么都不用改,
当然,你还是要改为自己需要的轮播图片才可以哦!这就是尽信书不如无书的道理~!
使用录太高啦!
2.为什么要自己写个无限轮播,Android的FilterView就可以啊!
自己写的才是最好的,FilteView滑动太不自然啦!
好啦,废话不多说,看图说代码~!
上面怎么没有图片?O(∩_∩)O~,不要在意这些细节,大家是来学习代码的,图片我用色块代替了!
好,下面是代码部分,由于轮播使用频繁,我就自定义了一个类,下次需要,只要把这个自定义类,写入xml,设置高度就可以了,什么都不用改,
当然,你还是要改为自己需要的轮播图片才可以哦!这就是尽信书不如无书的道理~!
package com.cake.util; import android.content.Context; import android.os.Handler; import android.os.Message; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Scroller; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; /** * Created by small cake on 2015/12/3. */ public class CarouselView extends RelativeLayout { private int[] mImages = {R.drawable.page1, R.drawable.page2, R.drawable.page3, R.drawable.page4}; private int[] mPots = {R.drawable.pot_icon_select, R.drawable.pot_icon_unselect}; private static final int POT_SELECT = 0; private static final int POT_UNSELECT = 1; private static final int SCROLL_TIME = 5000; private final static boolean IS_NEED_POTS = true; public int myPosition=0; private ViewPager mViewPager; private LinearLayout layoutPot; private MyPageAdapter adapter; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 0: int index = mViewPager.getCurrentItem(); index = (index + 1) % list.size(); mViewPager.setCurrentItem(index, true); mHandler.sendEmptyMessageDelayed(0, SCROLL_TIME); break; } } }; private ViewPagerScroller scroller; private List<View> list; public CarouselView(Context context) { super(context); init(); } public CarouselView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CarouselView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mViewPager = new ViewPager(getContext()); addViewPager(); } /** * loading img */ private void addViewPager() { //1.add ViewPager this.addView(mViewPager); list = new ArrayList<View>(); ImageView imgHead = new ImageView(getContext()); imgHead.setBackgroundResource(mImages[mImages.length-1]); list.add(imgHead); for (int resId :mImages) { ImageView img = new ImageView(getContext()); img.setBackgroundResource(resId); list.add(img); } ImageView imgLast = new ImageView(getContext()); imgLast.setBackgroundResource(mImages[0]); list.add(imgLast); Log.i("list","长度:"+list.size()); adapter = new MyPageAdapter(list); mViewPager.setAdapter(adapter); //2. is need the pots if (IS_NEED_POTS) { addViewPots(); } //3.listener this page mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { myPosition = position; if (IS_NEED_POTS) { if (position>=1) setSelectPot((position-1) % mImages.length); } } @Override public void onPageScrollStateChanged(int state) { //页面到达最后一页,state==0表示页面动画完成状态 if ( myPosition >mImages.length&&state==0) { mViewPager.setCurrentItem(1, false); //false:不显示跳转过程的动画,这里跳转到1 } } private void setSelectPot(int selectNum) { for (int i = 0; i < mImages.length; i++) { layoutPot.getChildAt(i).setBackgroundResource(mPots[POT_UNSELECT]); } layoutPot.getChildAt(selectNum).setBackgroundResource(mPots[POT_SELECT]); } }); //4.设置过度动画 scroller = new ViewPagerScroller(getContext()); scroller.setScrollDuration(2000); scroller.initViewPagerScroll(mViewPager); mHandler.sendEmptyMessage(0); } /** * add the pots */ private void addViewPots() { layoutPot = new LinearLayout(getContext()); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); layoutPot.setGravity(Gravity.RIGHT); layoutPot.setLayoutParams(layoutParams); LinearLayout.LayoutParams imgParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); imgParams.setMargins(8, 8, 8, 8); for (int i = 0; i < mImages.length; i++) { ImageView pot = new ImageView(getContext()); if (i==0){ pot.setBackgroundResource(mPots[POT_SELECT]); }else{ pot.setBackgroundResource(mPots[POT_UNSELECT]); } pot.setLayoutParams(imgParams); layoutPot.addView(pot); } this.addView(layoutPot); } class MyPageAdapter extends PagerAdapter { private List<View> mListViews; public MyPageAdapter(List<View> views) { this.mListViews = views; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(mListViews.get(position)); } @Override public Object instantiateItem(ViewGroup container, final int position) { View view = mListViews.get(position); container.addView(view); return view; } @Override public int getCount() { return mListViews.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } } public class ViewPagerScroller extends Scroller { private int mScrollDuration = 2000; // 滑动速度 /** * 设置速度速度 * @param duration */ public void setScrollDuration(int duration){ this.mScrollDuration = duration; } public ViewPagerScroller(Context context) { super(context); } @Override public void startScroll(int startX, int startY, int dx, int dy, int duration) { super.startScroll(startX, startY, dx, dy, mScrollDuration); } @Override public void startScroll(int startX, int startY, int dx, int dy) { super.startScroll(startX, startY, dx, dy, mScrollDuration); } public void initViewPagerScroll(ViewPager viewPager) { try { Field mScroller = ViewPager.class.getDeclaredField("mScroller"); mScroller.setAccessible(true); mScroller.set(viewPager, this); } catch(Exception e) { e.printStackTrace(); } } } }其实代码很简单,大家看看都能懂,不懂的留言!也欢迎爱交流吐槽的同学~!
相关文章推荐
- Android - 文件读写操作 总结
- Android:Layout_weight的深刻理解(转载于51CTO)
- android 触摸事件、点击事件的区别,执行流程
- Android BroadcastReceiver
- android Instrumentation剖析
- android-support-v7包问题
- android 单元测试案例
- android jockeyjs库对webview的封装
- The method getTabHost() is undefined问题解决
- Android控件之ListView基本属性配置
- 【android】drawable和Bitmap转换
- android(45)(帧动画,补间动画,xml补间动画)
- android性能测试
- 初学Android Studio
- 慕课网:Android异步加载AsyncTask项目实战中
- Android项目开发实战常用知识点
- android学习笔记3:存储数据
- 【Android】AsyncTask异步类
- 记录Android Studio项目提交到github上的出错处理
- Android Scroll 中嵌套ListView