本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发。

源码已经上传到我的Github上了,希望小伙伴们Follow,star,fork
(https://github.com/Hankkin/TaoBaoDetailDemo)

二维码下载预览:

绪论

最近一直比较忙,也没抽出时间来写博客,也不得不说是自己犯了懒癌,人要是一懒就什么事都不想做了,如果不能坚持下来的话,那么估计就废了,��。最近自己攒了好多东西,接下来的时间我会慢慢都分享出来的。好了废话不多说了,下面我们开始正题:
今天要分享的是淘宝的详情页,之前在淘宝上买东西的时候看到淘宝的详情页效果比较不错,所以今天就来仿一下它的效果吧,可能没有淘宝的好,希望见谅啊。

效果图

先上效果图:
这是淘宝的:

我自己做的:

怎么样效果还差不多吧?GIF图效果看的不太清楚,见谅。
下面我们来看看怎么实现的吧

实现

首先我们分析淘宝布局的界面难点大致就下面3个部分:
*标题栏渐变,文字渐变隐藏
*透明通知栏(支持到4.4)
*继续拖动查看详情,Scrollview有一个弹性的效果
前两点我之前都已经实现过了,这里就不做过多介绍了,不清楚的小伙伴可以看我之前的文章:
Android带你解析ScrollView–仿QQ空间标题栏渐变
下面我们主要介绍一下Scrollview继续拖动查看详情有一个弹性动画的效果:
仔细分析这个效果我们知道上面的布局可以滑动,当滑动到下面的布局时候同时下面的布局依然可以滑动,所以我们自定义一个View来包含两个Scrollview,上面一个下面一个;然后监听Scrollview滑动到底部添加动画效果让其滑动到下面的Scrollview,当下面的Scrollview滑动到顶部的时候再添加一个向上的动画让其滑动到上面的Scrollview。
下面我们来看一下代码实现:
1.首先我们重写拦截事件:

在DOWN行为时获取跟踪触摸屏事件的速率也就是VelocityTracker,设置mEvents=0,可以拖拽;当触发ACTION_POINTER_UP事件时防止多点拖拽。

当触发MOVE事件时,我们记录下拖拽的距离并且处理事件冲突。
并且当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view重新调用他的onMeasure onLayout来对重新设置自己位置。

当手指抬起触发UP事件时,通过判断y轴滑动速度以及手指滑动方向利用计时器实现上下View的滚动事件,这里详细介绍一下requestLayout()这个方法

我们可以理解为重新布局了一下view;
用途:有时我们在改变一个view 的内容之后 可能会造成显示出现错误,比如写ListView的时候 重用convertview中的某个TextView 可能因为前后填入的text长度不同而造成显示出错,此时我们可以在改变内容之后调用requestLayout方法加以解决。
Invalidate和postInvalidate和requestLayout都是用来刷新view控件的:
主线程可以直接调用Invalidate()方法刷新。
子线程可以直接调用postInvalidate()方法刷新。
API的描述是这样的 : Invalidatethe whole view. If the view is visible, onDraw(Canvas) will be called at somepoint in the future. This must be called from a UI thread. To call from anon-UI thread, call postInvalidate().。当Invalidate()被调用的时候,View的OnDraw()就会被调用,Invalidate()必须是在UI线程中被调用,如果在新线程中更新视图的就调用postInvalidate()。

    @Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {switch (ev.getActionMasked()) {case MotionEvent.ACTION_DOWN:if (vt == null)vt = VelocityTracker.obtain();//获得VelocityTracker类实例elsevt.clear();mLastY = ev.getY();System.out.println("---ACTION_DOWN-mLastY------"+ev.getY());vt.addMovement(ev);mEvents = 0;break;case MotionEvent.ACTION_POINTER_DOWN:case MotionEvent.ACTION_POINTER_UP:// 多一只手指按下或抬起时舍弃将要到来的第一个事件move,防止多点拖拽的bugmEvents = -1;break;case MotionEvent.ACTION_MOVE:vt.addMovement(ev);//将事件加入到VelocityTracker类实例中if (canPullUp && mCurrentViewIndex == 0 && mEvents == 0) {mMoveLen += (ev.getY() - mLastY);// 防止上下越界if (mMoveLen > 0) {mMoveLen = 0;mCurrentViewIndex = 0;} else if (mMoveLen < -mViewHeight) {mMoveLen = -mViewHeight;mCurrentViewIndex = 1;if(isTuninginterface){isTuninginterface=false;}}if (mMoveLen < -8) {// 防止事件冲突ev.setAction(MotionEvent.ACTION_CANCEL);}} else if (canPullDown && mCurrentViewIndex == 1 && mEvents == 0) {mMoveLen += (ev.getY() - mLastY);// 防止上下越界if (mMoveLen < -mViewHeight) {mMoveLen = -mViewHeight;mCurrentViewIndex = 1;} else if (mMoveLen > 0) {mMoveLen = 0;mCurrentViewIndex = 0;}if (mMoveLen > 8 - mViewHeight) {// 防止事件冲突ev.setAction(MotionEvent.ACTION_CANCEL);}} elsemEvents++;mLastY = ev.getY();//  requestLayout:当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view重新调用他的onMeasure onLayout来对重新设置自己位置。requestLayout();break;case MotionEvent.ACTION_UP:mLastY = ev.getY();vt.addMovement(ev);//参数:units  你想要指定的得到的速度单位,如果值为1,代表1毫秒运动了多少像素。如果值为1000,代表 1秒内运动了多少像素vt.computeCurrentVelocity(700);// 获取Y方向的速度 可以通过getXVelocity()和getYVelocity()获得横向和竖向的速率float mYV = vt.getYVelocity();if (mMoveLen == 0 || mMoveLen == -mViewHeight)break;if (Math.abs(mYV) < 500) {// 速度小于一定值的时候当作静止释放,这时候两个View往哪移动取决于滑动的距离if (mMoveLen <= -mViewHeight / 2) {state = AUTO_UP;} else if (mMoveLen > -mViewHeight / 2) {state = AUTO_DOWN;}} else {// 抬起手指时速度方向决定两个View往哪移动if (mYV < 0)state = AUTO_UP;elsestate = AUTO_DOWN;}mTimer.schedule(2);try {vt.recycle();vt=null;} catch (Exception e) {e.printStackTrace();}break;}super.dispatchTouchEvent(ev);return true;}

2.接下来我们重写onLayout,onMeasure方法重新测量绘制上下两个Scrollview的视图

@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {topView.layout(0, (int) mMoveLen, mViewWidth,topView.getMeasuredHeight() + (int) mMoveLen);bottomView.layout(0, topView.getMeasuredHeight() + (int) mMoveLen,mViewWidth, topView.getMeasuredHeight() + (int) mMoveLen+ bottomView.getMeasuredHeight());}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);if (!isMeasured) {isMeasured = true;mViewHeight = getMeasuredHeight();mViewWidth = getMeasuredWidth();System.out.println("======onMeasure====mViewHeight======"+mViewHeight);System.out.println("======onMeasure====mViewWidth======"+mViewWidth);topView = getChildAt(0);bottomView = getChildAt(1);bottomView.setOnTouchListener(bottomViewTouchListener);topView.setOnTouchListener(topViewTouchListener);}}

3.最后重写上下两个Scrollview的touch时间监听,主要通过判是否滑动到顶、底控制是否可以上拉下拉

private OnTouchListener topViewTouchListener = new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {ScrollView sv = (ScrollView) v;if (sv.getScrollY() == (sv.getChildAt(0).getMeasuredHeight() - sv.getMeasuredHeight()) && mCurrentViewIndex == 0)canPullUp = true;elsecanPullUp = false;return false;}};private OnTouchListener bottomViewTouchListener = new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {ScrollView sv = (ScrollView) v;if (sv.getScrollY() == 0 && mCurrentViewIndex == 1)canPullDown = true;elsecanPullDown = false;return false;}};

最后我们在xml布局里面最外层用这个ScrollviewContainer包裹着两个Scrollview分别为上面的布局和下面的布局就可以了,当然因为我们上面的布局还涉及到标题栏渐变,所以上面的Scrollview要自定义滑动监听,上面提到的文章里面有详细介绍。
参考文章:
[猴子的沉浸状态栏]
(https://github.com/laobie/StatusBarUtil)

Android--仿淘宝商品详情(继续拖动查看详情)及标题栏渐变相关推荐

  1. Android仿淘宝、京东Banner滑动查看图文详情

    文章目录 写在前面 效果图 原理分析 核心代码 源码地址 写在前面 本文基于 ViewPager2 实现的 Banner 效果,进而实现了仿淘宝.京东Banner滑动至最后一页时继续滑动来查看图文详情 ...

  2. Android 仿淘宝商品详情页下拉足迹Demo

    DropDownMultiPager 仿淘宝等商品详情页下拉足迹效果SimpleDemo 可colne之后看MainActivity的调用,方便二次开发 依赖 compile 'com.nineold ...

  3. 【商城开发三】Android 仿淘宝商品详情页下拉足迹修改版

    开发商城的快有半个月了,需要做到详情页下拉足迹的效果,网上找了找没找到,找到一个差不多还有点问题,然后在基础上进行了二次开发 感谢http://blog.csdn.net/yaphetzhao/art ...

  4. Android 仿淘宝商品详情标题栏变色,布局层叠效果

    如图效果 思路:如图可以将图片中布局分成三个部分,1标题栏透明背景,2上半部分布局,3下半部分布局,当我们向上拉动的时候,1布局实现渐变,从透明变到白色,2布局背景色渐变到白色,23布局随滚动条上拉, ...

  5. Android仿淘宝详情页面viewPager滑动到最后一张图片跳转的功能

    需要做一个仿淘宝客户端ViewPager滑动到最后一页,再拖动的时候跳到详情的功能,刚开始我也迷糊了,通过查阅相关资料发现有好多种实现方法,下面小编给大家分享实例代码,感兴趣的朋友一起看看吧 需要做一 ...

  6. 高仿淘宝和聚美优品商城详情页实现《IT蓝豹》

    高仿淘宝和聚美优品商城详情页实现 android-vertical-slide-view高仿淘宝和聚美优品商城详情页实现,在商品详情页,向上拖动时,可以加载下一页. 使用ViewDragHelper, ...

  7. 仿淘宝商品放大展示效果制作(放大镜效果)

    如果您觉得这篇文章有用,欢迎点赞收藏或有什么建议请在评论区留言,我看到后会第一时间回复的,谢谢! (分享时刻) mac上取色比较好用的小工具:啜色: 好用的截屏小工具:Snipaste (常用的一个功 ...

  8. Android仿淘宝首页UI(附代源代码及示例图片)

    Android仿淘宝首页UI(附代源代码及示例图片) 可以收获 运行出来的效果 部分代码 源代码 可以收获 更改Layout中的文字和drawble中的图片即可生成适应于不同情景的APP,帮助开发者完 ...

  9. Android仿淘宝淘口令实现

    先复制信息到剪切板,然后再打开淘宝,.既然是复制,肯定是复制到系统的剪切板了,我们可以通过下边的代码来把口令给复制到系统的剪切板里 1 2 3 4 5 6 //获取剪贴板管理器: ClipboardM ...

  10. android 仿淘宝、京东商品详情页 向上拖动查看图文详情控件

    一.淘宝商品详情页效果 先看一下淘宝详情页的效果 我们的效果 二.实现思路 使用两个scrollView,两个scrollView 竖直排列,通过自定义viewGroup来控制两个scrollView ...

最新文章

  1. Unity视觉效果图初学教程 Unity Visual Effects Graph for Beginners
  2. Windows Phone 8初学者开发—第19部分:设置RecordAudio.xaml页面
  3. TransG : A Generative Model for Knowledge Graph Embedding ACL 2016.Berlin, Germany.
  4. 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 五 )
  5. SQLServer导入Excel截断数据的解决办法
  6. 为什么都瞧不起QQ邮箱?
  7. 深入浅出linux驱动,Linux Kernel 字符驱动的深入浅出讲解
  8. webpack前端构建工具学习总结(一)之webpack安装、创建项目
  9. namenode和datanode的功能分别是什么_海德堡印刷机电路板分别是什么功能
  10. 什么是JSONP及其实现原理
  11. python的线程池_python线程池 ThreadPoolExecutor 的用法示例
  12. 蓝桥本第九届省赛刷题记录
  13. lbs云 java_百度 LBS 云使用介绍
  14. 前端屏幕尺寸和分辨率_移动端尺寸基础知识
  15. python猫狗大战游戏下载_猫狗大战RPG游戏下载
  16. Entry name ‘org/apache/commons/codec/language/bm/gen_approx_greeklatin.txt’ collided
  17. 19 - Dva框架基础
  18. 简单c语言实现的成语接龙小游戏
  19. 服务器显示蜘蛛,新换服务器后蜘蛛都不来捉取文章链接怎么办?
  20. 信号的用法,signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数

热门文章

  1. 计算机技术为我们带来的影响,计算机技术对社会发展的影响探析
  2. 管理者如何做好“冲突管理”
  3. Stata:面板数据模型的完整步骤(NPL与企业绿色创新)
  4. oracle12 client 64位,oracle官方64位客户端-instantclient-basic-windows.x64-12.2.0.1.0.zip
  5. 免费的QQ微信消息推送机器人
  6. 安装XAMPP遇到的问题(一)——要求关闭UAC以及权限问题
  7. [Python]通过有道词典API获取单词发音MP3
  8. 视频教程-网络工程师的5天修炼-软考
  9. android toolbar 搜索框,SearchView配合RecyclerView实现分页搜索过滤关键字
  10. 退出CrOS Factory,进入正常Chrome OS