[转]Android开发:Parallax效果的ScrollerView,改编自ParallaxListView
https://github.com/nirhart/ParallaxScroll这个gethub上的地址
本文转自http://www.2cto.com/kf/201502/376970.html
最近在项目中,有用到一个仿照Path的Parallax效果,苦苦搜寻,在github上面,有一个类似的效果,不过是listview的,加一个顶部的headerView,实现了该效果,不过我需要的是ScrollerView的,于是对该代码进行的修改,实现了ScrollerView下面的Parallax效果,效果图参照如下:

在阅读下面代码前,可以先查看下Github上面的源码
我对于原先的代码进行了大量的删减,只实现了我需要的效果,看起来简单易懂,最怕那种绕来绕去的代码了,看核心的实现代码:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | publicclassParallaxScollView extendsScrollView implementsOnScrollListener {    publicfinalstaticdoubleNO_ZOOM = 1;    publicfinalstaticdoubleZOOM_X2 = 2;    privateImageView mImageView;    privateintmImageViewHeight = -1;    privateintmDefaultImageViewHeight = 0;    privateintoriginImageViewHeight;    privateintmMaxHeight;    privateinterfaceOnOverScrollByListener {        publicbooleanoverScrollBy(intdeltaX, intdeltaY, intscrollX,                                    intscrollY, intscrollRangeX, intscrollRangeY,                                    intmaxOverScrollX, intmaxOverScrollY, booleanisTouchEvent);    }    privateinterfaceOnTouchEventListener {        publicvoidonTouchEvent(MotionEvent ev);    }    publicParallaxScollView(Context context, AttributeSet attrs,                                 intdefStyle) {        super(context, attrs, defStyle);        init(context);    }    publicParallaxScollView(Context context, AttributeSet attrs) {        super(context, attrs);        init(context);    }    publicParallaxScollView(Context context) {        super(context);        init(context);    }    publicvoidinit(Context context) {        mDefaultImageViewHeight = context.getResources().getDimensionPixelSize(R.dimen.size_default_height);        originImageViewHeight = context.getResources().getDimensionPixelSize(R.dimen.size_default_height);    }    @Override    publicvoidonScrollStateChanged(AbsListView view, intscrollState) {    }    @Override    protectedbooleanoverScrollBy(intdeltaX, intdeltaY, intscrollX,                                   intscrollY, intscrollRangeX, intscrollRangeY,                                   intmaxOverScrollX, intmaxOverScrollY, booleanisTouchEvent) {        booleanisCollapseAnimation = false;                isCollapseAnimation = scrollByListener.overScrollBy(deltaX, deltaY,                scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX,                maxOverScrollY, isTouchEvent)                || isCollapseAnimation;        /*return isCollapseAnimation ? true : super.overScrollBy(deltaX, deltaY,                scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX,                0, isTouchEvent);*/        returnfalse;    }    @Override    publicvoidonScroll(AbsListView view, intfirstVisibleItem,                         intvisibleItemCount, inttotalItemCount) {    }        @Override    protectedvoidonMeasure(intwidthMeasureSpec, intheightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);    }    @Override    protectedvoidonScrollChanged(intl, intt, intoldl, intoldt) {        super.onScrollChanged(l, t, oldl, oldt);        View firstView = (View) mImageView.getParent();        // firstView.getTop < getPaddingTop means mImageView will be covered by top padding,        // so we can layout it to make it shorter        if(firstView.getTop() < getPaddingTop() && mImageView.getHeight() > mImageViewHeight) {            mImageView.getLayoutParams().height = Math.max(mImageView.getHeight() - (getPaddingTop() - firstView.getTop()), mImageViewHeight);            // to set the firstView.mTop to 0,            // maybe use View.setTop() is more easy, but it just support from Android 3.0 (API 11)            firstView.layout(firstView.getLeft(), 0, firstView.getRight(), firstView.getHeight());            mImageView.requestLayout();        }    }    @Override    publicbooleanonTouchEvent(MotionEvent ev) {        touchListener.onTouchEvent(ev);        returnsuper.onTouchEvent(ev);    }    publicvoidsetParallaxImageView(ImageView iv) {        mImageView = iv;        mImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);    }    publicvoidsetViewsBounds(doublezoomRatio) {        if(mImageViewHeight == -1) {            mImageViewHeight = mImageView.getHeight();            if(mImageViewHeight <= 0) {                mImageViewHeight = mDefaultImageViewHeight;            }            doubleratio = ((double) mImageView.getDrawable().getIntrinsicWidth()) / ((double) mImageView.getWidth());        }    }    privateOnOverScrollByListener scrollByListener = newOnOverScrollByListener() {        @Override        publicbooleanoverScrollBy(intdeltaX, intdeltaY, intscrollX,                                    intscrollY, intscrollRangeX, intscrollRangeY,                                    intmaxOverScrollX, intmaxOverScrollY, booleanisTouchEvent) {            if(isTouchEvent) {                if(true) {                        mImageView.getLayoutParams().height = mImageView.getHeight() - deltaY / 2;                        mImageView.requestLayout();                }             }            returnfalse;        }    };    privateOnTouchEventListener touchListener = newOnTouchEventListener() {        @Override        publicvoidonTouchEvent(MotionEvent ev) {            if(ev.getAction() == MotionEvent.ACTION_UP) {                if(mImageViewHeight - 1< mImageView.getHeight()) {                    ResetAnimimation animation = newResetAnimimation(                            mImageView, mImageViewHeight);                    animation.setDuration(300);                    mImageView.startAnimation(animation);                }            }        }    };    publicclassResetAnimimation extendsAnimation {        inttargetHeight;        intoriginalHeight;        intextraHeight;        View mView;        protectedResetAnimimation(View view, inttargetHeight) {            this.mView = view;            this.targetHeight = targetHeight;            originalHeight = view.getHeight();            extraHeight = this.originalHeight - originImageViewHeight;            Log.i(debug, target heitht  + targetHeight +  original height  + originalHeight  +  extraheight  + extraHeight);        }        @Override        protectedvoidapplyTransformation(floatinterpolatedTime, Transformation t) {            intnewHeight;            newHeight = (int) (originImageViewHeight + extraHeight * (1- interpolatedTime));            mView.getLayoutParams().height = newHeight;            mView.requestLayout();        }    }} | 
第二布:在xml中,引用该ParallaxScollView:
最后一步,在activity中,引用ParallaxScrollerView,并且设置imageview:
| 1 2 3 | mImageView = (ImageView) findViewById(R.id.headview);        scrollView = (ParallaxScollView) findViewById(R.id.parallax_scroll_view);        scrollView.setParallaxImageView(mImageView); | 
大功告成,也可以在ScrollerView上实现炫酷的Parallax效果了
[转]Android开发:Parallax效果的ScrollerView,改编自ParallaxListView的更多相关文章
- 50个Android开发人员必备UI效果源码[转载]
		50个Android开发人员必备UI效果源码[转载] http://blog.csdn.net/qq1059458376/article/details/8145497 Android 仿微信之主页面 ... 
- Android开发——为EditText添加烟花效果的实现
		)什么时候发射烟花:监听EditText的文字改变,获取文字数量的变化以确定风的方向,还有获取光标的位置确定爆炸的位置.光标的位置没有具体的方法确定坐标,要通过反射自己计算. 2. 主要实现类 库里 ... 
- Android开发:文本控件详解——TextView(二)文字跑马灯效果实现
		一.需要使用的属性: 1.android:ellipsize 作用:若文字过长,控制该控件如何显示. 对于同样的文字“Android开发:文本控件详解——TextView(二)文字跑马灯效果实现”,不 ... 
- Android开发之去掉listview的点击效果,一行代码间接粗暴,解决你的问题。
		作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发之去掉listview的点击效果,一行代码间接粗暴,解决你的问题. 当你在用list ... 
- [转载] 50个Android开发人员必备UI效果源码
		好东西,多学习! Android 仿微信之主页面实现篇Android 仿微信之界面导航篇Android 高仿QQ 好友分组列表Android 高仿QQ 界面滑动效果Android 高仿QQ 登陆界面A ... 
- Android 开发笔记___textvieww__跑马灯效果
		<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ... 
- Android开发实战之底部Dialog弹出效果
		在Android开发中,有很多情况下我们需要使用到对话框,遗憾的是,安卓自带的对话框样式不能满足我们实际的需要,所以往往需要我们自定义对话框,具体做法:写一个对话框继承自Dialog实现他的一个构造方 ... 
- Android 开发一定要看的15个实战项目
		前言: 虽说网上有太多的Android课程,但是大多都是视频,有Android在线开发环境的几乎没有,但是对于学习Android的人来说拥有在线的Android开发环境是非常好的,可以随时动手操作学习 ... 
- Android开发学习之路-Android中使用RxJava
		RxJava的核心内容很简单,就是进行异步操作.类似于Handler和AsyncTask的功能,但是在代码结构上不同. RxJava使用了观察者模式和建造者模式中的链式调用(类似于C#的LINQ). ... 
随机推荐
- 运用String类实现一个模拟用户登录程序
			package Test; import java.util.Scanner; // 模拟用户登录程序 // 思路: // 1.用两个String类分别接收用户名和密码 // 2.判断输入的用户名和密 ... 
- windows7内核驱动开发试验环境配置
			首先配置环境参照这个: http://blog.csdn.net/qing666888/article/details/50858272 然后在win10里可能由于没有做测试签名因此一直没有成功加载驱 ... 
- ANDROID开发之问题积累及解决方案(一)
			一.activity跳转及传值 当进行activity之间的跳转时我们会遇到这样的问题.首先熟悉下activity之间跳转.Activity跳转与传值,主要是通过Intent类来连接多个Activit ... 
- java_js_json_日期格式化
			调用方法: var createBeginTime= createBeginTime.Format("yyyy-MM-dd 00:00:00"); 方法: Date.prototy ... 
- 利用SlidingPaneLayout实现侧滑
			利用SlidingPaneLayout实验仿QQ侧滑效果 1.效果图 2.布局文件 <?xml version="1.0" encoding=" ... 
- linux下添加链接与删除链接(ln命令的用法)
			添加链接使用ln命令用法:#ln --help用法:ln [选项]... 目标 [链接名]或:ln [选项]... 目标... 目录或:ln [选项]... --target-directory=目录 ... 
- Finders Keepers
			function find(arr, func) { //var num = 0; //return num; var res = arr.filter(func); if(res.length){ ... 
- 最简单的访问google的办法
			我用的是猎豹浏览器,在工具下面的猎豹应用市场里面,搜索红杏,安装即可. 打开google产品地址时,如果地址栏里面右边的杏是绿色的,代表正常,如果是红色的,代表不正常. 可能是装了其他代理软件,如Sw ... 
- SUSE zypper failed to work
			记录解决的一个问题. 在SUSE 中zypper 不能使用,错误如下: hostname~ # zypper install make Refreshing service 'packman'.Une ... 
- 设计模式:Context模式
			作者:吴香伟 发表于 2014/09/12 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 Ceph实现中使用了大量派生于Context抽象类的子类,用法简单却很 ... 
