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

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

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

前言

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

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

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

加载网络图片使用的 Fresco

头部的商品图轮播 ConvenientBanner

导航栏切换 PagerSlidingTabStrip

先看看效果实现

2b11ee642daca52563975f74b4e6d4c2.gif

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

不想看的童鞋可以下载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,需要投稿与及有疑问的小伙伴可以在下方留言,小编会第一时间与您联系!

大家都在看

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

责任编辑:

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现实时聊天应用程序,您需要使用以下技术: 1. Spring Boot:用于构建应用程序后端,它提供了一组开箱即用的库和工具,使构建Web应用程序变得容易。 2. MySQL:用于存储应用程序的数据,例如用户信息,聊天记录等。 3. Android Studio:用于构建移动应用程序的开发环境。 4. Socket.IO:用于实现实时通信的JavaScript库。 下面是实现步骤: 1. 首先,您需要创建一个Spring Boot应用程序,并将MySQL作为数据库。您可以使用Spring Initializr来创建应用程序。 2. 创建一个名为“chat”的数据库,并添加“users”和“messages”表。用户表将存储用户信息,例如用户名和密码。消息表将存储聊天记录。 3. 创建一个REST API,用于处理用户注册,登录和消息发送请求。您可以使用Spring MVC来创建API。 4. 在Android Studio中创建一个新的Android应用程序,并添加Socket.IO库。这将允许您通过WebSocket通信协议实现实时通信。 5. 实现用户注册和登录功能。当用户注册时,将其用户名和密码保存到MySQL数据库中。当用户登录时,验证其凭据并返回一个JSON Web Token(JWT)。 6. 实现消息发送和接收功能。在Android应用程序中,您可以使用Socket.IO库将消息发送到后端,然后将其保存到MySQL数据库中。在后端,您可以使用Socket.IO库将消息推送给其他连接到应用程序的客户端。 7. 实现聊天界面。在Android应用程序中,您可以使用RecyclerView和Adapter来显示聊天记录。当新消息到达时,将其添加到RecyclerView中。 8. 最后,测试您的应用程序。确保您可以注册,登录,发送消息并收到实时通知。 希望这可以帮助您实现实时聊天应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值