看到有人在问如何实现淘宝商品详情页效果,手痒了就撸了一个,献上效果图

大致梳理一下思路,这里不提供源码

状态栏透明使用开源库StatusBarCompat,为了兼容手机4.4

dependencies {compile ('com.github.niorgai:StatusBarCompat:2.1.4', {exclude group: 'com.android.support'})}allprojects {repositories {...maven { url "https://jitpack.io" }}}

标题栏图标透明度变化参考Api setAlpha()已过时

 icon.setImageAlpha(0);

Banner控件为ViewPager,淘宝显示为正方形,这里需要修改ViewPager measure函数


public class IdeaViewPager extends ViewPager {private Point point;public IdeaViewPager(Context context) {this(context,null);}public IdeaViewPager(Context context, AttributeSet attrs) {super(context, attrs);WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);point = new Point();windowManager.getDefaultDisplay().getSize(point);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);setMeasuredDimension(point.x,point.x);}
}

测量View高度,获取到高度集合绑定到ScrollView,根据ScrollView滑动距离判断是属于哪一个Tab选项

public int getMeasureHeight(View view){int width = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);int height = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);view.measure(width, height);return view.getMeasuredHeight();}

重新onScrollChanged函数,实现ViewPager滑动速度比其他View慢

  @Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt) {super.onScrollChanged(l, t, oldl, oldt);if (viewPager != null && t != oldt) {viewPager.setTranslationY(t/2);}}

根据限定距离(Banner)计算百分比偏移量,实现颜色渐变、透明度渐变(淘宝商品详情页有二次颜色渐变)

 @Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt) {super.onScrollChanged(l, t, oldl, oldt);if(viewPager!=null&&t<=point.x-headerHeight&&getOnScrollChangedColorListener()!=null){getOnScrollChangedColorListener().onChanged(Math.abs(t)/Float.valueOf(point.x-headerHeight));if(t<=(point.x-headerHeight)/2){getOnScrollChangedColorListener().onChangedFirstColor(t/(point.x-headerHeight)/2);}else{getOnScrollChangedColorListener().onChangedSecondColor((t-(point.x-headerHeight)/2)/(point.x-headerHeight)/2);}}int currentPosition = getCurrentPosition(t,arrayDistance);if(currentPosition!=position&&getOnSelectedIndicateChangedListener()!=null){getOnSelectedIndicateChangedListener().onSelectedChanged(currentPosition);}this.position = currentPosition;}

单一颜色渐变透明度,还原argb通道,修改a值

 ideaScrollView.setOnScrollChangedColorListener(new IdeaScrollView.OnScrollChangedColorListener() {@Overridepublic void onChanged(float percentage) {int color = getAlphaColor(percentage>0.9f?1.0f:percentage);header.setBackgroundDrawable(new ColorDrawable(color));radioGroup.setBackgroundDrawable(new ColorDrawable(color));icon.setImageAlpha((int) ((percentage>0.9f?1.0f:percentage)*255));radioGroup.setAlpha((percentage>0.9f?1.0f:percentage)*255);setRadioButtonTextColor(percentage);}@Overridepublic void onChangedFirstColor(float percentage) {}@Overridepublic void onChangedSecondColor(float percentage) {}});ideaScrollView.setOnSelectedIndicateChangedListener(new IdeaScrollView.OnSelectedIndicateChangedListener() {@Overridepublic void onSelectedChanged(int position) {isNeedScrollTo = false;radioGroup.check(radioGroup.getChildAt(position).getId());isNeedScrollTo = true;}});public int getAlphaColor(float f){return Color.argb((int) (f*255),0x09,0xc1,0xf4);}

Tab选项属性不能太频繁,会有颜色值闪烁情况出现,这里需要策略

 public void setRadioButtonTextColor(float percentage){if(Math.abs(percentage-currentPercentage)>=0.1f){for(int i=0;i<radioGroup.getChildCount();i++){RadioButton radioButton = (RadioButton) radioGroup.getChildAt(i);radioButton.setTextColor(radioButton.isChecked()?getRadioCheckedAlphaColor(percentage):getRadioAlphaColor(percentage));}this.currentPercentage = percentage;}}

判断当前属于哪个选项,根据滑动距离与传入绑定的View高度集合来计算

private int getCurrentPosition(int t, ArrayList<Integer> arrayDistance) {int index = 0;for (int i=0;i<arrayDistance.size();i++){if(i==arrayDistance.size()-1){index = i;}else {if(t>=arrayDistance.get(i)&&t<arrayDistance.get(i+1)){index = i;break;}}}return index;}

切换选项卡以及回到顶部按钮的具体实现参考scrollTo函数

private void scrollToPosition(int position){scrollTo(0,arrayDistance.get(position));}

以上代码实现了上图效果,当然也可以使用RecyclerView AbsListView做容器

Android开发之仿淘宝商品详情页相关推荐

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

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

  2. 仿淘宝商品详情页图片滑动并且数字也跟着变化

    今天遇到需求需要做个淘宝那样的商品详情页如图(这里只差放图片了)支持移动端,当然用的是swiper.js支持左右滑动 上代码 html代码 <div class="swiper-con ...

  3. 仿淘宝商品详情页TabLayout+ListView

    第一次写博客,我是一名Android的小码农写代码也有三四年了.有点好玩的跟大家分享一下 项目对商品详情页改版有新需求.顶部是一个渐变的Title包括"宝贝","详情&q ...

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

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

  5. 仿淘宝商品详情页顶部nav屏幕滑动出现-商品/详情/评价/分享

    项目开发实录 将其简化为一个demo方便后续使用 简化淘宝顶部的淡入淡出并将其修改为两个不同盒子之间的切换,毕竟实际项目实际操作嘛. 下面的代码块为简略版的demo,直接复制粘贴即可实现效果(移动端喔 ...

  6. 仿淘宝商品详情页中(继续拖动到图文详情)

    参考文章http://www.jb51.net/article/91858.htm 核心view 有2个 一个是自定义的ViewGroup 一个是自定义的ScrollView 首先是自定义的Scrol ...

  7. 仿淘宝商品详情页顶部banner和沉浸式效果

    这边使用第三方沉浸式库https://github.com/gyf-dev/ImmersionBar 使用自己去研究 一.沉浸式效果 主要是看滑动过程中toolBar的透明度变化 布局如下: < ...

  8. 仿淘宝商品详情页[带有视频和图片的轮播功能]

    因为工作需求的原因,自己写了一个demo,既实现了功能,又能与大家分享,很高兴!Demo已上传GitHub,https://github.com/xinniangdeweidao/CloneTaoba ...

  9. 自定义viewGroup防淘宝商品详情页

    解决在顶部.底部还可以拖动的问题if (child==fragment2){if (top<0){//让fragment2底部不能上拉 显示viewGroup的背景色lastTop = 0;}} ...

最新文章

  1. 写给Java程序员的Java虚拟机学习指南
  2. .Net Framework 4.5.1 安装时遇到严重错误 问题的解决方法
  3. 法律应是站在加密和隐私这面的……
  4. Linux ls 命令详解
  5. 关于epoll中的read函数说明
  6. 那年我学过的SpringBoot笔记
  7. 前景检测算法 (GMM)
  8. 如何在苹果Mac中设置 Excel 文件打印范围刚好是一页纸?
  9. 苹果mac虚拟机软件:Parallels Desktop 17(pd虚拟机)Intel专用版
  10. mysql水平union_mysql_union操作符
  11. 《Python数据分析实战》3 NumPy库
  12. Android音视频【七】H265硬编解码视频通话
  13. CAD快捷键命令------画矩形
  14. 坚持学英语 -- 公司前台MM 一日英语小记
  15. Python-裁判文书网
  16. 农夫住房抵押贷款叫醒农村沉睡资本
  17. 学会用打码平台处理验证码
  18. php 井字棋,Unity3D 井字棋
  19. List多条件组合排序
  20. [Practical.Vim(2012.9)].Drew.Neil.Tip10学习摘要

热门文章

  1. 操作系统的启动过程详解
  2. DLT645-2007通讯规约解析
  3. UE4.24版本使用AndroidStudio配置打包环境
  4. linux标准发音视频,Linux的标准发音
  5. 量化风控系列--风险定价(一)
  6. pycharm对项目进行重命名后导致项目内文件一系列异常
  7. live555峰哥的私房菜(二)-----计划任务(TaskScheduler)探讨
  8. C语言编程笔试题(一)
  9. Unity:排序图层
  10. Wireshark - 【学习笔记】(Ubuntu18.04)、协议分析(IP、ARP、ICMP、DNS、UDP、TCP、DHCP、HTTP、HTTPS、FTP、Telnet)