原标题:Android仿京东、天猫app的商品详情页的布局架构, 以及功能实现

快,点击蓝色“字体”关注这个公众号,一起涨姿势

前言

电商内app,重点在于详情页商品展示,用户不仅要看到图,可以看到各种描述,以及相关规格参数。

有需要做电商类app的童鞋可以看看, 首先先看看效果实现

本项目使用的第三方框架:

加载网络图片使用的 Fresco

头部的商品图轮播 ConvenientBanner

导航栏切换 PagerSlidingTabStrip

先看看效果实现

由于代码量过多, 就不一一讲解只介绍几个核心的自定义控件)

不想看的童鞋可以下载apk或者在github上下载源码使用

github地址

apk下载

最外层的布局文件

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/ll_title_root"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:background="#ec0f38"

android:orientation="vertical">

android:layout_width="match_parent"

android:layout_height="44dp"

android:orientation="horizontal">

android:id="@+id/ll_back"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:paddingLeft="15dp">

android:id="@+id/iv_back"

android:layout_width="22dp"

android:layout_height="22dp"

android:layout_gravity="center_vertical"

android:src="@mipmap/address_come_back" />

android:layout_width="0dp"

android:layout_height="match_parent"

android:layout_weight="1"

android:gravity="center">

android:id="@+id/psts_tabs"

android:layout_width="wrap_content"

android:layout_height="32dp"

android:layout_gravity="center"

android:textColor="#ffffff"

android:textSize="15sp"

app:pstsDividerColor="@android:color/transparent"

app:pstsDividerPaddingTopBottom="0dp"

app:pstsIndicatorColor="#ffffff"

ItemWebView是SlideDetailsLayout的子View (SlideDetailsLayout代码太多, 放到了最后)

功能为显示商品简介的webview

防止往上滑动时会直接滑动到第一个View

实现滑动到WebView顶部时, 让父控件重新获得触摸事件

/**

* 商品详情页底部的webview

*/

public class ItemWebView extends WebView {

public float oldY;

private int t;

private float oldX;

public ItemWebView(Context context) {

super(context);

}

public ItemWebView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public ItemWebView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

@Override

public boolean onTouchEvent(MotionEvent ev) {

switch (ev.getAction()) {

case MotionEvent.ACTION_MOVE:

float Y = ev.getY();

float Ys = Y - oldY;

float X = ev.getX();

//滑动到顶部让父控件重新获得触摸事件

if (Ys > 0 && t == 0) {

getParent().getParent().requestDisallowInterceptTouchEvent(false);

}

break;

case MotionEvent.ACTION_DOWN:

getParent().getParent().requestDisallowInterceptTouchEvent(true);

oldY = ev.getY();

oldX = ev.getX();

break;

case MotionEvent.ACTION_UP:

getParent().getParent().requestDisallowInterceptTouchEvent(true);

break;

default:

break;

}

return super.onTouchEvent(ev);

}

@Override

protected void onScrollChanged(int l, int t, int oldl, int oldt) {

this.t = t;

super.onScrollChanged(l, t, oldl, oldt);

}

}

ItemListView 也是SlideDetailsLayout的子View

和ItemWebView功能大致一样

/**

* 商品详情页底部的ListView

*/

public class ItemListView extends ListView implements AbsListView.OnScrollListener {

private float oldX, oldY;

private int currentPosition;

public ItemListView(Context context) {

super(context);

setOnScrollListener(this);

}

public ItemListView(Context context, AttributeSet attrs) {

super(context, attrs);

setOnScrollListener(this);

}

public ItemListView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

setOnScrollListener(this);

}

@Override

public boolean onTouchEvent(MotionEvent ev) {

switch (ev.getAction()) {

case MotionEvent.ACTION_MOVE:

float Y = ev.getY();

float Ys = Y - oldY;

float X = ev.getX();

int [] location = new int [2];

getLocationInWindow(location);

//滑动到顶部让父控件重新获得触摸事件

if (Ys > 0 && currentPosition == 0) {

getParent().getParent().requestDisallowInterceptTouchEvent(false);

}

break;

case MotionEvent.ACTION_DOWN:

getParent().getParent().requestDisallowInterceptTouchEvent(true);

oldY = ev.getY();

oldX = ev.getX();

break;

case MotionEvent.ACTION_UP:

getParent().getParent().requestDisallowInterceptTouchEvent(true);

break;

default:

break;

}

return super.onTouchEvent(ev);

}

@Override

public void onScrollStateChanged(AbsListView view, int scrollState) {

currentPosition = getFirstVisiblePosition();

}

@Override

public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

}

}

NoScrollViewPager为最外层的父布局

当滑动到图文详情模块时, 能禁止掉ViewPager的滑动事件

/**

* 提供禁止滑动功能的自定义ViewPager

*/

public class NoScrollViewPager extends ViewPager {

private boolean noScroll = false;

public NoScrollViewPager(Context context, AttributeSet attrs) {

super(context, attrs);

}

public NoScrollViewPager(Context context) {

super(context);

}

public void setNoScroll(boolean noScroll) {

this.noScroll = noScroll;

}

@Override

public void scrollTo(int x, int y) {

super.scrollTo(x, y);

}

@Override

public boolean onTouchEvent(MotionEvent arg0) {

if (noScroll)

return false;

else

return super.onTouchEvent(arg0);

}

@Override

public boolean onInterceptTouchEvent(MotionEvent arg0) {

if (noScroll)

return false;

else

return super.onInterceptTouchEvent(arg0);

}

@Override

public void setCurrentItem(int item, boolean smoothScroll) {

super.setCurrentItem(item, smoothScroll);

}

@Override

public void setCurrentItem(int item) {

super.setCurrentItem(item);

}

}

商品模块最外层的布局是一个自定义的ViewGroup名为SlideDetailsLayout

SlideDetailsLayout内容有两个View, mFrontView(第一个View)和mBehindView(第二个View)

有两种状态, 状态设置为close就显示第一个商品数据View, open状态就显示第二个图文详情View

@SuppressWarnings("unused")

public class SlideDetailsLayout extends ViewGroup {

/**

* Callback for panel OPEN-CLOSE status changed.

*/

public interface OnSlideDetailsListener {

/**

* Called after status changed.

*

* @param status {@link Status}

*/

void onStatucChanged(Status status);

}

public enum Status {

/** Panel is closed */

CLOSE,

/** Panel is opened */

OPEN;

public static Status valueOf(int stats) {

if (0 == stats) {

return CLOSE;

} else if (1 == stats) {

return OPEN;

} else {

return CLOSE;

}

}

}

private static final float DEFAULT_PERCENT = 0.2f;

private static final int DEFAULT_DURATION = 300;

private View mFrontView;

private View mBehindView;

private float mTouchSlop;

private float mInitMotionY;

private float mInitMotionX;

private View mTarget;

private float mSlideOffset;

private Status mStatus = Status.CLOSE;

private boolean isFirstShowBehindView = true;

private float mPercent = DEFAULT_PERCENT;

private long mDuration = DEFAULT_DURATION;

private int mDefaultPanel = 0;

private OnSlideDetailsListener mOnSlideDetailsListener;

public SlideDetailsLayout(Context context) {

this(context, null);

}

public SlideDetailsLayout(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public SlideDetailsLayout(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SlideDetailsLayout, defStyleAttr, 0);

mPercent = a.getFloat(R.styleable.SlideDetailsLayout_percent, DEFAULT_PERCENT);

mDuration = a.getInt(R.styleable.SlideDetailsLayout_duration, DEFAULT_DURATION);

mDefaultPanel = a.getInt(R.styleable.SlideDetailsLayout_default_panel, 0);

这个商品详情页的架构也是本人在已上线的项目中使用

感谢 coexist同学投稿,Github地址:

https://github.com/hexianqiao3755/GoodsInfoPage

觉得实用的话,欢迎在作者的 Github 给个Star 也可以分享给小伙伴哦; 小编每天都兢兢业业的为整理干货,支持小编在下方给鼓励+1,需要投稿与及有疑问的小伙伴可以在下方留言,小编会第一时间与您联系!

大家都在看

微信不支持外链,请点击原文查看完整文章详情.返回搜狐,查看更多

责任编辑:

android商品上架功能实现,Android仿京东、天猫app的商品详情页的布局架构, 以及功能实现...相关推荐

  1. Android 简单实现订单模块类APP的物流详情页

    不废话,需求:做一个订单模块类APP的物流详情页,怎么办? 这个功能完全是看到别人写的好,自己学习一下,主要写一下自己对别人代码的理解.参考文章:https://blog.csdn.net/weixi ...

  2. android app开发混合开发,混合开发入门 Vue结合Android/iOS开发仿京东项目App

    download:混合开发入门 Vue结合Android/iOS开发仿京东项目App 无需原生开发基础,也能完美呈现京东商城.本课程融合vue.Android.IOS等目前流行的前端和移动端技术,混合 ...

  3. android自定义视频列表,Android仿京东天猫列表页播视频看这一篇就足够了

    阅读本文解决什么问题? 解决android 滑动列表页自动播视频中的一些技术难点.助力更好的实现类似需求.不涉及到播放器的具体编解码技术,因为各家用的播放器可能都不一样(其实是我不会~) 何时播视频最 ...

  4. 适合初学者入门的项目,通过对 Kotlin 的系统运用,实现的一个功能完备符合主流市场标准 App。包含知识点(MVVM 开发架构、单 Activity 多 Fragment 项目设计、暗夜模式、屏幕

    fragmject 项目地址:miaowmiaow/fragmject 简介: 适合初学者入门的项目,通过对 Kotlin 的系统运用,实现的一个功能完备符合主流市场标准 App.包含知识点(MVVM ...

  5. 【android】高仿京东商城App,集成react-native热更功能

    简介 高仿京东商城项目具有完整的结构,代码整洁规范,结构清晰,集成React-Native热更功能,功能还在持续更新中-如果对你有帮助,给个star 使用kotlin语言开发,项目使用模块化开发,降低 ...

  6. android天猫app首页布局,仿天猫App实现商品列表布局切换效果

    昨天有朋友问了我这样一个需求,就是在天猫App中首页进入搜索界面,搜索出的商品页中,有一个按钮可以切换商品列表的布局.没有用过或者用的少天猫App的赶紧下载体验下(哈哈,给天猫打个广告~).如果你很懒 ...

  7. 高仿京东商城App,集成react-native 热更新功能

    前言 这是一个高仿京东商城的android 混合项目,具有完整的结构,代码整洁规范,结构清晰,集成React-Native热更功能,使用最新MVI架构开发 kotlin . retrofit2 + o ...

  8. 仿京东天猫商品详情页

    1.参考借鉴 Android仿京东商品详情页上拉查看图文详情 [模仿淘宝.京东.蘑菇街商品详情页,可嵌套ListView.WebView.ViewPager.FragmentTabhost等](htt ...

  9. 高仿京东商城app、集成react-native热更新功能

    简介 这是一个高仿京东商城的安卓项目,有完整的结构,代码整洁规范,结构清晰,集成React-Native热更功能 kotlin . retrofit2 + okhttp3 网络请求 .多模块 leak ...

  10. Android 使用Toolbar+DrawerLayout快速实现仿“知乎APP”侧滑导航效果

    在以前,做策划导航的时候,最常用的组件便是SlidingMenu了,当初第一次用它的时候觉得那个惊艳啊,体验可以说是非常棒. 后来,Android自己推出了一个可以实现策划导航的组件DrawerLay ...

最新文章

  1. IPv6新形势下的安全解决方案
  2. 计算机网络基础(路由原理)
  3. 【计算机网络】物理层 : 数据通信 ( 数据通信模型 | 信源 | 信宿 | 信道 | 通信方式 | 单工 | 半双工 | 全双工 | 数据传输方式 | 串行 | 并行 )
  4. [云炬创业管理笔记]第三章打造优秀创业团队讨论3
  5. 正式开始学习GO语言
  6. 时序图(Sequence Diagram)—UML图(六)
  7. 2021-06-21层次选择器
  8. 决策树识别MNIST数据集
  9. 赶超磁盘的磁带备份技术
  10. UVA12304 2D Geometry 110 in 1!
  11. 在XP IIS5.1手工安装PHP 5.2.11
  12. CentOS安装NETCDF
  13. html打印页标题行,打印标题行的设置方法
  14. 上海市高新技术企业各区奖励政策汇总2022版
  15. 二叉排序树(二叉搜索树)
  16. 工业元宇宙 三人行系列直播 12场规划
  17. *5-1 CCF 2015-03-1 图像旋转
  18. VisionPro之脚本
  19. 山东理工大学-2022级-程序设计基础I-实验9 字符串
  20. lcg_magic算法笔记:堆排序

热门文章

  1. echarts水球图-动态波纹百分比数据显示
  2. 全面理解面向对象的 JavaScript(转载)
  3. 【c语言】判断一个数n能否同时被3和5整除
  4. 思维导图 基础篇(06)思维方法-曼陀罗思考法
  5. 硬盘是计算机的 奥鹏,奥鹏2016计算机应用基础一
  6. Sisyphus----a log data-mining toolkit安装过程
  7. Largest Contentful Paint (LCP)
  8. 如何在云服务器上自动运行.py文件
  9. TCP/UDP端口列表(转)
  10. 2022 年排名前 10 的聊天机器人[示例]