国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Android仿京東、天貓app的商品詳情頁的布局架構, 以及功能實現

移動開發 Android
電商內app,重點在于詳情頁商品展示,用戶不僅要看到圖,可以看到各種描述,以及相關規格參數。

前言

電商內app,重點在于詳情頁商品展示,用戶不僅要看到圖,可以看到各種描述,以及相關規格參數。

有需要做電商類app的童鞋可以看看, 首先先看看效果實現

  • 本項目使用的第三方框架:
    • 加載網絡圖片使用的 Fresco
    • 頭部的商品圖輪播 ConvenientBanner
    • 導航欄切換 PagerSlidingTabStrip

先看看效果實現

 

 

 

 

由于代碼量過多, 就不一一講解只介紹幾個核心的自定義控件)

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

  • github地址
  • apk下載
  • 最外層的布局文件
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     xmlns:app="http://schemas.android.com/apk/res-auto" 
  4.     xmlns:tools="http://schemas.android.com/tools" 
  5.     android:layout_width="match_parent" 
  6.     android:layout_height="match_parent" 
  7.     android:orientation="vertical"
  8.      <!-- 頂部標題 --> 
  9.     <LinearLayout 
  10.         android:id="@+id/ll_title_root" 
  11.         android:layout_width="match_parent" 
  12.         android:layout_height="wrap_content" 
  13.         android:background="#ec0f38" 
  14.         android:orientation="vertical"
  15.  
  16.         <LinearLayout 
  17.             android:layout_width="match_parent" 
  18.             android:layout_height="44dp" 
  19.             android:orientation="horizontal"
  20.  
  21.             <LinearLayout 
  22.                 android:id="@+id/ll_back" 
  23.                 android:layout_width="wrap_content" 
  24.                 android:layout_height="match_parent" 
  25.                 android:paddingLeft="15dp"
  26.  
  27.                 <ImageView 
  28.                     android:id="@+id/iv_back" 
  29.                     android:layout_width="22dp" 
  30.                     android:layout_height="22dp" 
  31.                     android:layout_gravity="center_vertical" 
  32.                     android:src="@mipmap/address_come_back" /> 
  33.             </LinearLayout> 
  34.  
  35.             <LinearLayout 
  36.                 android:layout_width="0dp" 
  37.                 android:layout_height="match_parent" 
  38.                 android:layout_weight="1" 
  39.                 android:gravity="center"
  40.  
  41.                 <!-- 商品、詳情、評價切換的控件 --> 
  42.                 <com.gxz.PagerSlidingTabStrip 
  43.                     android:id="@+id/psts_tabs" 
  44.                     android:layout_width="wrap_content" 
  45.                     android:layout_height="32dp" 
  46.                     android:layout_gravity="center" 
  47.                     android:textColor="#ffffff" 
  48.                     android:textSize="15sp" 
  49.                     app:pstsDividerColor="@android:color/transparent" 
  50.                     app:pstsDividerPaddingTopBottom="0dp" 
  51.                     app:pstsIndicatorColor="#ffffff" 

 

  • ItemWebView是SlideDetailsLayout的子View (SlideDetailsLayout代碼太多, 放到了***)
    • 功能為顯示商品簡介的webview
    • 防止往上滑動時會直接滑動到***個View
    • 實現滑動到WebView頂部時, 讓父控件重新獲得觸摸事件
  1. /** 
  2.  * 商品詳情頁底部的webview 
  3.  */ 
  4. public class ItemWebView extends WebView { 
  5.     public float oldY; 
  6.     private int t; 
  7.     private float oldX; 
  8.  
  9.     public ItemWebView(Context context) { 
  10.         super(context); 
  11.     } 
  12.  
  13.     public ItemWebView(Context context, AttributeSet attrs) { 
  14.         super(context, attrs); 
  15.     } 
  16.  
  17.     public ItemWebView(Context context, AttributeSet attrs, int defStyleAttr) { 
  18.         super(context, attrs, defStyleAttr); 
  19.     } 
  20.  
  21.  
  22.     @Override 
  23.     public boolean onTouchEvent(MotionEvent ev) { 
  24.  
  25.         switch (ev.getAction()) { 
  26.             case MotionEvent.ACTION_MOVE: 
  27.                 float Y = ev.getY(); 
  28.                 float Ys = Y - oldY; 
  29.                 float X = ev.getX(); 
  30.  
  31.                 //滑動到頂部讓父控件重新獲得觸摸事件 
  32.                 if (Ys > 0 && t == 0) { 
  33.                     getParent().getParent().requestDisallowInterceptTouchEvent(false); 
  34.                 } 
  35.                 break; 
  36.  
  37.             case MotionEvent.ACTION_DOWN: 
  38.                 getParent().getParent().requestDisallowInterceptTouchEvent(true); 
  39.                 oldY = ev.getY(); 
  40.                 oldX = ev.getX(); 
  41.                 break; 
  42.  
  43.             case MotionEvent.ACTION_UP: 
  44.                 getParent().getParent().requestDisallowInterceptTouchEvent(true); 
  45.                 break; 
  46.  
  47.             default
  48.                 break; 
  49.         } 
  50.         return super.onTouchEvent(ev); 
  51.     } 
  52.  
  53.     @Override 
  54.     protected void onScrollChanged(int l, int t, int oldl, int oldt) { 
  55.         this.t = t; 
  56.         super.onScrollChanged(l, t, oldl, oldt); 
  57.     } 
  58.  

 

  • ItemListView 也是SlideDetailsLayout的子View
    • 和ItemWebView功能大致一樣

 

  1. /** 
  2.  * 商品詳情頁底部的ListView 
  3.  */ 
  4. public class ItemListView extends ListView implements AbsListView.OnScrollListener { 
  5.     private float oldX, oldY; 
  6.     private int currentPosition; 
  7.  
  8.     public ItemListView(Context context) { 
  9.         super(context); 
  10.         setOnScrollListener(this); 
  11.     } 
  12.  
  13.     public ItemListView(Context context, AttributeSet attrs) { 
  14.         super(context, attrs); 
  15.         setOnScrollListener(this); 
  16.     } 
  17.  
  18.     public ItemListView(Context context, AttributeSet attrs, int defStyleAttr) { 
  19.         super(context, attrs, defStyleAttr); 
  20.         setOnScrollListener(this); 
  21.     } 
  22.  
  23.  
  24.     @Override 
  25.     public boolean onTouchEvent(MotionEvent ev) { 
  26.         switch (ev.getAction()) { 
  27.             case MotionEvent.ACTION_MOVE: 
  28.                 float Y = ev.getY(); 
  29.                 float Ys = Y - oldY; 
  30.                 float X = ev.getX(); 
  31.                 int [] location = new int [2]; 
  32.                 getLocationInWindow(location); 
  33.  
  34.                 //滑動到頂部讓父控件重新獲得觸摸事件 
  35.                 if (Ys > 0 && currentPosition == 0) { 
  36.                     getParent().getParent().requestDisallowInterceptTouchEvent(false); 
  37.                 } 
  38.                 break; 
  39.  
  40.             case MotionEvent.ACTION_DOWN: 
  41.                 getParent().getParent().requestDisallowInterceptTouchEvent(true); 
  42.                 oldY = ev.getY(); 
  43.                 oldX = ev.getX(); 
  44.                 break; 
  45.  
  46.             case MotionEvent.ACTION_UP: 
  47.                 getParent().getParent().requestDisallowInterceptTouchEvent(true); 
  48.                 break; 
  49.  
  50.             default
  51.                 break; 
  52.         } 
  53.         return super.onTouchEvent(ev); 
  54.     } 
  55.  
  56.     @Override 
  57.     public void onScrollStateChanged(AbsListView viewint scrollState) { 
  58.         currentPosition = getFirstVisiblePosition(); 
  59.     } 
  60.  
  61.     @Override 
  62.     public void onScroll(AbsListView viewint firstVisibleItem, int visibleItemCount, int totalItemCount) { 
  63.  
  64.     } 

 

  • NoScrollViewPager為最外層的父布局
    • 當滑動到圖文詳情模塊時, 能禁止掉ViewPager的滑動事件
  1. /** 
  2.  * 提供禁止滑動功能的自定義ViewPager 
  3.  */ 
  4. public class NoScrollViewPager extends ViewPager { 
  5.     private boolean noScroll = false
  6.  
  7.     public NoScrollViewPager(Context context, AttributeSet attrs) { 
  8.         super(context, attrs); 
  9.     } 
  10.  
  11.  
  12.     public NoScrollViewPager(Context context) { 
  13.         super(context); 
  14.     } 
  15.  
  16.     public void setNoScroll(boolean noScroll) { 
  17.         this.noScroll = noScroll; 
  18.     } 
  19.  
  20.     @Override 
  21.     public void scrollTo(int x, int y) { 
  22.         super.scrollTo(x, y); 
  23.     } 
  24.  
  25.     @Override 
  26.     public boolean onTouchEvent(MotionEvent arg0) { 
  27.         if (noScroll) 
  28.             return false
  29.         else 
  30.             return super.onTouchEvent(arg0); 
  31.     } 
  32.  
  33.     @Override 
  34.     public boolean onInterceptTouchEvent(MotionEvent arg0) { 
  35.         if (noScroll) 
  36.             return false
  37.         else 
  38.             return super.onInterceptTouchEvent(arg0); 
  39.     } 
  40.  
  41.     @Override 
  42.     public void setCurrentItem(int item, boolean smoothScroll) { 
  43.         super.setCurrentItem(item, smoothScroll); 
  44.     } 
  45.  
  46.     @Override 
  47.     public void setCurrentItem(int item) { 
  48.         super.setCurrentItem(item); 
  49.     } 
  50.  

 

商品模塊最外層的布局是一個自定義的ViewGroup名為SlideDetailsLayout

SlideDetailsLayout內容有兩個View, mFrontView(***個View)和mBehindView(第二個View)

有兩種狀態, 狀態設置為close就顯示***個商品數據View, open狀態就顯示第二個圖文詳情View

  1. @SuppressWarnings("unused"
  2. public class SlideDetailsLayout extends ViewGroup { 
  3.  
  4.     /** 
  5.      * Callback for panel OPEN-CLOSE status changed. 
  6.      */ 
  7.     public interface OnSlideDetailsListener { 
  8.         /** 
  9.          * Called after status changed. 
  10.          * 
  11.          * @param status {@link Status} 
  12.          */ 
  13.         void onStatucChanged(Status status); 
  14.     } 
  15.  
  16.     public enum Status { 
  17.         /** Panel is closed */ 
  18.         CLOSE
  19.         /** Panel is opened */ 
  20.         OPEN
  21.  
  22.         public static Status valueOf(int stats) { 
  23.             if (0 == stats) { 
  24.                 return CLOSE
  25.             } else if (1 == stats) { 
  26.                 return OPEN
  27.             } else { 
  28.                 return CLOSE
  29.             } 
  30.         } 
  31.     } 
  32.  
  33.     private static final float DEFAULT_PERCENT = 0.2f; 
  34.     private static final int DEFAULT_DURATION = 300; 
  35.  
  36.     private View mFrontView; 
  37.     private View mBehindView; 
  38.  
  39.     private float mTouchSlop; 
  40.     private float mInitMotionY; 
  41.     private float mInitMotionX; 
  42.  
  43.  
  44.     private View mTarget; 
  45.     private float mSlideOffset; 
  46.     private Status mStatus = Status.CLOSE
  47.     private boolean isFirstShowBehindView = true
  48.     private float mPercent = DEFAULT_PERCENT; 
  49.     private long mDuration = DEFAULT_DURATION; 
  50.     private int mDefaultPanel = 0; 
  51.  
  52.     private OnSlideDetailsListener mOnSlideDetailsListener; 
  53.  
  54.     public SlideDetailsLayout(Context context) { 
  55.         this(context, null); 
  56.     } 
  57.  
  58.     public SlideDetailsLayout(Context context, AttributeSet attrs) { 
  59.         this(context, attrs, 0); 
  60.     } 
  61.  
  62.     public SlideDetailsLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
  63.         super(context, attrs, defStyleAttr); 
  64.  
  65.         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SlideDetailsLayout, defStyleAttr, 0); 
  66.         mPercent = a.getFloat(R.styleable.SlideDetailsLayout_percent, DEFAULT_PERCENT); 
  67.         mDuration = a.getInt(R.styleable.SlideDetailsLayout_duration, DEFAULT_DURATION); 
  68.         mDefaultPanel = a.getInt(R.styleable.SlideDetailsLayout_default_panel, 0); 

 

這個商品詳情頁的架構也是本人在已上線的項目中使用 

責任編輯:龐桂玉 來源: 安卓巴士Android開發者門戶
相關推薦

2017-01-15 18:51:57

京東手機商品詳情頁

2016-11-28 09:58:53

京東服務閉環實踐

2016-01-04 15:16:01

京東詳情頁實踐

2016-11-23 15:26:01

詳情頁單品頁前端

2024-07-12 14:52:20

2023-07-31 22:02:17

客服訂單詳情

2024-06-03 14:37:22

銳捷天蝎路由器

2022-07-21 08:00:00

京東數據存儲汽車行業

2015-11-13 10:25:04

京東商品搜索架構

2009-07-29 11:46:22

asp.net1.1

2023-05-31 07:57:12

筆記本電腦信譽度

2018-02-26 06:33:53

京東商品系統商品架構

2015-04-16 14:17:53

2015-12-14 15:12:42

京東

2017-04-27 21:00:33

Android滑動分析

2018-06-13 15:47:10

阿里文學

2010-09-14 14:11:35

室外WLAN

2017-06-30 17:48:59

互聯網

2015-12-09 11:07:16

商城源碼android
點贊
收藏

51CTO技術棧公眾號

爱高潮www亚洲精品| 国产精品永久入口久久久| 中国免费黄视频| 丰满诱人av在线播放| 成人黄页毛片网站| 亚洲色图狂野欧美| 日本成人黄色网| 日韩福利视频| 99精品国产九九国产精品| 国产人成亚洲第一网站在线播放| 国产精品高清在线观看| 3d成人动漫在线| 国产激情一区二区三区| 中文字幕av一区二区| 妓院一钑片免看黄大片| 日本一区福利在线| 亚洲最大的成人av| 国产欧美日韩一区| 欧美gay男男猛男无套| 在线色欧美三级视频| 成人欧美一区二区三区视频xxx| 亚洲第一综合| 日本中文字幕在线视频观看| 你懂的视频在线免费| 日韩经典一区| 日韩国产高清影视| 深夜福利一区二区| 51精品在线| 爱福利视频一区| 日韩影视精品| 国产成人免费av在线| 久久视频在线看| 日韩精品一区二区久久| 欧美性xxxx18| avtt亚洲| 成人动漫一区二区| 亚色视频在线观看| 麻豆一区二区三| 日本女优爱爱视频| 男女性色大片免费观看一区二区| 欧美极品少妇与黑人| heyzo高清中文字幕在线| 中日韩免费视频中文字幕| 国产九区一区在线| 亚洲五月综合| 亚洲精品视频网上网址在线观看| 婷婷综合一区| 精品国免费一区二区三区| 国产亚洲精彩久久| 91国产视频在线播放| 天堂在线第六区| 欧美精品视频www在线观看 | 污网站免费在线| 久久精品一区二区三区不卡牛牛| 你懂的av在线| 亚洲欧洲一区二区天堂久久| 日韩免费观看av| 国产精品伦理久久久久久| 肉大捧一出免费观看网站在线播放 | 亚洲精品国产品国语在线app| 日本中文字幕高清视频| 欧美日韩亚洲系列| 天堂在线一二区| 亚洲第一综合色| 天天综合入口| 国产女主播视频一区二区| 69久久久久久| 亚洲一级片在线看| 精品国产一区二区三区| 国产厕所精品在线观看| 中文一区一区三区高中清不卡| 久草中文在线| 中文字幕亚洲欧美在线| 国产精品99久久| 一区二区在线播放视频| 亚洲成人av中文字幕| 久久精品亚洲一区二区| 伊人中文在线| 国产精品国产三级国产专播精品人 | 国产女主播视频一区二区| 日本中文字幕在线看| 欧美日韩精品欧美日韩精品| 色视频在线观看| 黄色影院在线看| 久久艳片www.17c.com| 久久电影tv| 精品国产91乱码一区二区三区四区| 日韩美女视频中文字幕| 国产精品传媒| 久久久久久久久久久av| 日韩激情电影| 日韩精品免费观看| 三级做a全过程在线观看| 中文字幕一区二区三区精华液| 国产男女无遮挡| 99久久99久久精品国产片果冻| 国产精品区二区三区日本| 欧美挤奶吃奶水xxxxx| 欧洲s码亚洲m码精品一区| 最新精品国产| 久久这里只有精品8| 中文字幕亚洲激情| 国产乱码字幕精品高清av| 国产精品视频久久| 国产亚洲成aⅴ人片在线观看| 色婷婷狠狠综合| 51精品在线| 欧美一区二区在线免费播放| 欧美成人h版| 亚洲一区二区三区精品在线观看| 成人午夜视频免费看| av电影在线观看一区二区三区| 日韩欧美一级二级三级久久久| 国产精品国产三级在线观看| 先锋影音资源综合在线播放av| 日韩一区二区视频在线观看| 黄色在线播放| 66m—66摸成人免费视频| 久久99精品国产.久久久久| 日韩av高清在线| 日本成熟性欧美| 久久精品人人做| 亚洲承认视频| 色婷婷精品国产一区二区三区| 亚洲国产精品欧美一二99 | 国产不卡一区| 一二三四视频社区在线| 精品国精品国产尤物美女| 91精品动漫在线观看| 老司机aⅴ毛片免费观看| 欧美日韩国产成人| 99久久精品一区二区| 一二三四视频在线中文| 亚洲人成人77777线观看| 91精品国产色综合久久不卡蜜臀| 妖精视频一区二区三区| 在线免费观看黄| 亚洲午夜精品久久久久久人妖| 91亚洲精华国产精华| 欧美国产日韩一二三区| www.欧美日本韩国| 日本黑人久久| 亚洲视频欧美视频| 亚洲色图视频免费播放| 欧美专区一区| 777777av| 欧美片在线播放| 女性女同性aⅴ免费观女性恋| 欧洲精品亚洲精品| 91国在线高清视频| 亚洲影视九九影院在线观看| 欧美国产日本韩| 亚洲国产精品久久久天堂| 午夜在线网站| 国产视频99| 欧美日韩ab片| 欧美日韩国产精品成人| 99久久精品国产麻豆演员表| 亚洲精品一级二级三级| 岛国av在线网站| 色欧美激情视频在线| 自拍偷拍 国产| 艳色歌舞团一区二区三区| 国产欧美日韩视频| 日韩亚洲欧美中文在线| 日韩一级免费观看| 第九色区aⅴ天堂久久香| 国产69精品久久久久9999人| 中文字幕亚洲精品视频| 色呦呦网站在线观看| 黄色日韩精品| 日韩免费在线视频| 亚洲第一影院| 中文字幕一区综合| 正在播放国产一区| 亚洲欧美日韩一区| aa亚洲婷婷| 99久久er| 日韩精品黄色网| 久久一二三四| 精品福利电影| 婷婷精品进入| 波多野结衣欧美| 日本在线视频一区二区三区| 亚洲先锋影音| 欧美白人做受xxxx视频| 久久精品男人天堂| 亚洲综合偷拍欧美一区色| 亚洲一区二区成人| 欧美激情啪啪| 你懂得在线网址| 成年人视频大全| 国产精品吴梦梦| 亚洲精品国产品国语在线| 亚洲欧美在线aaa| 亚洲欧美日韩国产一区| 视频一区视频二区欧美| 精彩国产在线| 欧美牲交a欧美牲交aⅴ免费真| caoporen国产精品|