github:https://github.com/nickeyCode/RoundImageViewPager

说实话不知道怎么描述这个效果,在网页上见得跟多,公司要求做这个效果得时候不知道怎么用文字描述找不到对应的dome只好自己写。

先上图

大概效果就是这个。主要用的的知识点就是viewpager的自定义动画。

项目目录:

roundimg是圆形图片,继承ImageView的,上网好多可以搜索得到

viewpager主要分成三部分

一是viewpager本身,设置adapter,绑定监听器等。

二是adapter,继承PagerAdapter,用法跟listview的差不多。

三是动画类,继承PageTransformer。

首先看看最核心的动画类(能做到这个效果就是根据对应的动画变动)

HeadViewPagerTransformer.Java

public class HeadViewPagerTransformer implements PageTransformer{private static final float MIN_SCALE = 0.75f; //主要是设置在不同位置上的VIEW的活动动画
    @Overridepublic void transformPage(View view, float position) {// TODO Auto-generated method stubint pageWidth = view.getWidth();  if (position < -1) { // [-Infinity,-1)   view.setAlpha(0);  }else if (position <= 0) { // [-1,0]  view.setAlpha(1);  view.setTranslationX(0);  float x = -1.0f * (2f / 3f) * pageWidth * position;view.setTranslationX(x);  float scaleFactor = MIN_SCALE + (2 - MIN_SCALE) * (1 - Math.abs(position)); view.setScaleX(scaleFactor);  view.setScaleY(scaleFactor); } else if (position <= 1) { // (0,1]  view.setAlpha(1);  float x = -1.0f * (2f / 3f) * pageWidth * position;view.setTranslationX(x);  float scaleFactor = MIN_SCALE + (2 - MIN_SCALE) * (1 - Math.abs(position));  view.setScaleX(scaleFactor);  view.setScaleY(scaleFactor);  }}}

因为在这个类中,viewpager中view都有对应的位置编号,在正中间显示的view位置是0

在左边的view位置是-1,在右边的view位置是1.(相当于一个坐标轴)

只要viewpager发生滑动,就会调用tansFromPager();position之说以是float类型,是因为如果发生滑动,位置就会有对应的变化,而变化精确到0.0001.

在函数中使用if-else来设定在不同位置区间中的view的动画变化;

if (position < -1) { // [-Infinity,-1)     view.setAlpha(0);
}  

这是负无穷到-1的区间,当然,如果你的viewpager缓存的view只有三个的话,这个就没有作用了,因为最多只有三个view,多出来就销毁了。

else if (position <= 0) { // [-1,0]  view.setAlpha(1);  view.setTranslationX(0);  float x = -1.0f * (2f / 3f) * pageWidth * position;view.setTranslationX(x);  float scaleFactor = MIN_SCALE + (2 - MIN_SCALE) * (1 - Math.abs(position)); view.setScaleX(scaleFactor);  view.setScaleY(scaleFactor); }

这是-1到0的区间,就是左边的view到中间或中间的view到左边的动画效果,这里主要是做了两个动画变化,一是大小,二是位置。

这两个变化公式是根据位置的变化与动画数值的关系,解二元一次方程求出来的(初中数学知识。。。。)

具体方式就是balbalblabalbalb。。。。。(不多说)

同理

else if (position <= 1) { // (0,1]  view.setAlpha(1);  float x = -1.0f * (2f / 3f) * pageWidth * position;view.setTranslationX(x);  float scaleFactor = MIN_SCALE + (2 - MIN_SCALE) * (1 - Math.abs(position));  }

0到1的区间一样。在实际动画设计的过程中,公式是需要变动的。

剩下的都是普通的viewpager使用,设置adapter  (HeadViewPagerAdapter.java)

public class HeadViewPagerAdapter extends PagerAdapter {private Context mContext;private List<MyImageView> mList;public HeadViewPagerAdapter(Context context,List<MyImageView> list){this.mContext = context;this.mList = list;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mList.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stubreturn arg0 == arg1;}//当缓存view的数量超过上限时,会销毁最先的一个
    @Overridepublic void destroyItem(ViewGroup container, int position, Object object) {// TODO Auto-generated method stub//Log.d("remove", mImageViews[position].hashCode() + "");container.removeView(mList.get(position));}//添加View
    @Overridepublic Object instantiateItem(ViewGroup container, int position) {// TODO Auto-generated method stubcontainer.addView(mList.get(position),0);return mList.get(position);}}

还有就是对应的绑定:HeadViewPager.java

public class HeadViewPager extends FrameLayout {private Context mContext;private ViewPager mViewPager;private List<Integer> mImageIds;private List<MyImageView> mImageViews;private ViewGroup mViewGroup;private List<ImageView> tips;private int tipsChoseImgId;private int tipsUnchoseImgId;public HeadViewPager(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stub
        creatView(context);}public HeadViewPager(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub
        creatView(context);}public HeadViewPager(Context context) {super(context);// TODO Auto-generated constructor stub
        creatView(context);}public HeadViewPager(Context context,List<MyImageView> imgageList) {super(context);// TODO Auto-generated constructor stub
        creatView(context,imgageList);}public void creatView(Context context){this.mContext = context;LayoutInflater.from(context).inflate(R.layout.head_view_pager, this);mViewPager = (ViewPager)findViewById(R.id.viewpager);mViewGroup = (ViewGroup)findViewById(R.id.viewgroup);mImageViews = new ArrayList<MyImageView>();mImageIds = new ArrayList<Integer>();tips = new ArrayList<ImageView>();tipsChoseImgId = R.drawable.img_bg_chose;tipsUnchoseImgId = R.drawable.img_bg_unchose;build();}public void creatView(Context context,List<MyImageView> imgageList){this.mContext = context;LayoutInflater.from(context).inflate(R.layout.head_view_pager, this);mViewPager = (ViewPager)findViewById(R.id.viewpager);mViewGroup = (ViewGroup)findViewById(R.id.viewgroup);mImageViews = imgageList;mImageIds = new ArrayList<Integer>();tips = new ArrayList<ImageView>();tipsChoseImgId = R.drawable.img_bg_chose;tipsUnchoseImgId = R.drawable.img_bg_unchose;build();}public void build(){buildTips();mViewPager.setAdapter(new HeadViewPagerAdapter(mContext,mImageViews));//设置默认显示页面为第0页mViewPager.setCurrentItem(0);//设置选择页面时的动画mViewPager.setPageTransformer(true, new HeadViewPagerTransformer());//设置缓存View的个数,默认是3个,这表示缓存了5个mViewPager.setOffscreenPageLimit(4);//页面发生改变的监听器mViewPager.setOnPageChangeListener(new OnPageChangeListener() {//选择发生改变
            @Overridepublic void onPageSelected(int arg0) {// TODO Auto-generated method stub
                changeTips(arg0);}//有滑动操作
            @Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {// TODO Auto-generated method stub
                }//滑动操作或选择改变
            @Overridepublic void onPageScrollStateChanged(int arg0) {// TODO Auto-generated method stub
                }});}//初始化底部导航圆点条public void buildTips(){for (int i = 0 ; i < mImageViews.size() ; i ++){ImageView imageView = new ImageView(mContext);  imageView.setLayoutParams(new LayoutParams(10,10));   if(i == 0){  imageView.setBackgroundResource(tipsChoseImgId);  }else{  imageView.setBackgroundResource(tipsUnchoseImgId);  }  LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(new ViewGroup.LayoutParams(12,12));  layoutParams.leftMargin = 5;  layoutParams.rightMargin = 5;  tips.add(imageView); mViewGroup.addView(imageView, layoutParams);  }}//当选定的页面发生改变时,导航条也对应改变public void changeTips(int index){for (int i = 0 ; i < tips.size() ; i ++){  if(i == index){  tips.get(i).setBackgroundResource(tipsChoseImgId);  }else{  tips.get(i).setBackgroundResource(tipsUnchoseImgId);  }  }}public Context getmContext() {return mContext;}public void setmContext(Context mContext) {this.mContext = mContext;}public ViewPager getmViewPager() {return mViewPager;}public void setmViewPager(ViewPager mViewPager) {this.mViewPager = mViewPager;}public List<MyImageView> getmImageViews() {return mImageViews;}//改变图片队列时,要更新整个viewPagerpublic void setmImageViews(List<MyImageView> mImageViews) {this.mImageViews = mImageViews;this.mViewPager.notify();this.mViewPager.setCurrentItem(0);}public ViewGroup getmViewGroup() {return mViewGroup;}public void setmViewGroup(ViewGroup mViewGroup) {this.mViewGroup = mViewGroup;}public int getTipsChoseImgId() {return tipsChoseImgId;}public void setTipsChoseImgId(int tipsChoseImgId) {this.tipsChoseImgId = tipsChoseImgId;}public int getTipsUnchoseImgId() {return tipsUnchoseImgId;}public void setTipsUnchoseImgId(int tipsUnchoseImgId) {this.tipsUnchoseImgId = tipsUnchoseImgId;}
}

样例项目资源:

http://download.csdn.NET/detail/nickey_1314/8932807

点击打开链接

Android 自定义viewpager 三张图片在同一屏幕轮播的效果相关推荐

  1. Android 使用ViewPager 做的半吊子的图片轮播

    Android 使用ViewPager 做的半吊子的图片轮播 效果图 虽然不咋样,但是最起码的功能是实现了,下面我们来一步步的实现它. 界面 下面我们来分析一下界面的构成 整体的布局: 因为我们要做出 ...

  2. Android使用ViewPager实现左右循环滑动及轮播效果

    ViewPager是一个常用的android组件,不过通常我们使用ViewPager的时候不能实现左右无限循环滑动,在滑到边界的时候会看到一个不能翻页的动画,可能影响用户体验.此外,某些区域性的Vie ...

  3. Android自定义动画三-SVG动画

    Android自定义动画三-SVG动画 本篇文章主要是对SVG的一个介绍和使用,以及Android中对SVG的一个支持,从而可以帮助我们在android下很轻松的通过SVG实现一些非常酷炫的动画效果. ...

  4. android 两边圆角,Android自定义View实现带4圆角或者2圆角的效果

    1 问题 实现任意view经过自定义带4圆角或者2圆角的效果 2 原理 1) 实现view 4圆角 我们只需要把左边的图嵌入到右边里面去,最终显示左边的图就行. 2) 实现view上2圆角 我们只需要 ...

  5. 自定义组合控件:Banner、轮播图、广告栏控件

    1. 项目概述 这里,我们使用自定义组合控件实现一个自动轮播的广告条,也叫轮播图,完整版的效果图如下图所示.其实,这就是我们经常见到的滚动广告,默认情况下每隔N 秒会自动滚动,用手指左右滑动时也会切换 ...

  6. Android之——史上最简单图片轮播广告效果实现

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/48049913 如今的Android开发需求越来越来多,实现效果越来越酷炫,很多An ...

  7. 淘宝店铺装修之一怎样在自定义内容区做个商品图片轮播展示

    <wbr><span style="font-size:24px"><strong>店铺装修之一怎样在自定义内容区做个商品图片轮播展示</ ...

  8. Android 循环滚动控件ViewFlipper,可实现跑马灯或轮播图效果

    ViewFlipper--Android循环滚动控件 1.效果如下: 2.实现方法 (1)创建进出动画 上下滚动动画 y_in.xml <?xml version="1.0" ...

  9. Android 自定义ViewPager设置屏蔽左右滑动事件

    只要有欲望,就应该有奋斗的心.... 屏蔽左右滑动事件的viewPager public class CustomNoScrollViewPager extends ViewPager{private ...

最新文章

  1. elasticsearch 客户端工具_万字长文:详解 Spring Boot 中操作 ElasticSearch
  2. uva 725 Division(暴力模拟)
  3. mysql避免回环复制_【20181204】 MySQL 双主复制是如何避免回环复制的
  4. linux改变文件夹权限吗,linux改变文件/文件夹权限
  5. python中if嵌套语句的作用_讲解Python中if语句的嵌套用法
  6. 神经网络-损失函数是不是凸的
  7. python多因子量化选股模型_量化新兵第十步:多因子选股模型
  8. Spring Boot 2.2 正式发布,大幅性能提升 Java 13 支持 | CSDN 博文精选
  9. db2 控制台执行创建函数语句_Python函数定义及调用
  10. c语言编程帐薄结算,用C++语言设计个人帐薄管理系统最终版(备份存档)
  11. STL中的序列式容器——stack(栈)
  12. 同步IO和异步IO的区别?
  13. 2021漫画小说听书三合一分销平台源码+带采集+带视频教程
  14. 描写火车站场景_描写火车站人多的场景_描写火车站人多的作文
  15. 管理文件夹,批量重命名排序
  16. Matlab水果识别——基于形态学处理的水果识别
  17. 一对一网络课堂教室应用教程实例
  18. CStdioFile类
  19. FL Studio中的音频剪辑功能
  20. javascript中JSON对象和formdata格式互相转换

热门文章

  1. 修改centos等linux的hostname-永久生效
  2. synchronized锁的基本用法
  3. java金钱千分位处理_java对金额的处理,保留两位小数、千分位符
  4. 四十四种Javascript技巧大全
  5. 办公室计算机网络使用情况,企事业单位办公网络的现状及解决方案.doc
  6. 重理工c语言实验指导书答案,常熟理工学院 C语言程序设计实验实验指导书及答案...
  7. python读取txt行问题
  8. 第九天2017/04/18(1、友元函数、运算符重载)
  9. 【深度学习】sigmoid - 二次代价函数 - 交叉熵 - logistic回归 - softmax
  10. 意想不到的有趣linux命令