仿淘宝详情页的商品详情

先上效果图

效果就是上面图片的效果 接下来看看如何实现

  • 首先我们来看下布局文件 

 <LinearLayoutandroid:id="@+id/header"android:layout_width="match_parent"android:layout_height="72dp"android:paddingTop="24dp"android:background="#00FFFFFF"android:orientation="horizontal"><ImageViewandroid:layout_width="30dp"android:layout_height="30dp"android:layout_gravity="center"android:src="@drawable/back"/><Viewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><ImageViewandroid:id="@+id/icon"android:layout_width="30dp"android:layout_height="30dp"android:src="@drawable/aa"android:layout_gravity="center"/><Viewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><ImageViewandroid:layout_width="30dp"android:layout_height="30dp"android:layout_gravity="center"/></LinearLayout>

这块主要是设置刚进入页面时的透明头部  主要组成部分有返回键  和头部的方形小图片 还有分享按钮 以及你想附加的标题功能 默认进入是透明的只显示返回按钮

 <FrameLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><RadioGroupandroid:id="@+id/radioGroup"android:background="#00FFFFFF"android:layout_width="match_parent"android:orientation="horizontal"android:layout_height="48dp"><RadioButtonandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:button="@null"android:textColor="#00000000"android:gravity="center"android:text="宝贝"/><RadioButtonandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:button="@null"android:textColor="#00000000"android:gravity="center"android:text="评价"/><RadioButtonandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:button="@null"android:textColor="#00000000"android:gravity="center"android:text="详情"/><RadioButtonandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:button="@null"android:textColor="#00000000"android:text="推荐"/></RadioGroup><Viewandroid:id="@+id/layer"android:layout_width="match_parent"android:background="#00FFFFFF"android:layout_height="48dp"/></FrameLayout>

这部分主要是我们的标签选项卡 我这边采用的是RadioGroup+radioButton实现的 类似于淘宝的商品、评价、详情等标签 

这样我们的页面布局头部就完成了  下面我们来看下具体组成内容

<com.text.lg.ideascrollview.IdeaScrollViewandroid:id="@+id/ideaScrollView"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><LinearLayoutandroid:id="@+id/one"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><com.text.lg.ideascrollview.IdeaViewPagerandroid:id="@+id/viewPager"android:layout_width="match_parent"android:background="@drawable/aa"android:layout_height="wrap_content"/><ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:src="@drawable/one"/></LinearLayout><LinearLayoutandroid:id="@+id/two"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:src="@drawable/two"/><ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:src="@drawable/three"/></LinearLayout><ImageViewandroid:id="@+id/three"android:layout_width="match_parent"android:layout_height="wrap_content"android:src="@drawable/four"/><LinearLayoutandroid:id="@+id/four"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:src="@drawable/five"/><ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:src="@drawable/six"/><ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:src="@drawable/six"/><ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:src="@drawable/six"/></LinearLayout></LinearLayout></com.text.lg.ideascrollview.IdeaScrollView>

这部分就是我们的具体页面内容  可以看到我们的详情页面数据使用自定义的一个Scrollview来包裹的 其中分为4块 我们布局里面写的很清楚 分别对应着详情页中的四个模块  当然  我这里面只是用图片来代替内容了  具体内容可自己填充

  • 下面来看下我们具体实现代码

StatusBarCompat.translucentStatusBar(this);

我这边是采用的第三方的沉浸式透明状态栏  你们可以自行替换

dependencies {compile ('com.github.niorgai:StatusBarCompat:2.1.4', {exclude group: 'com.android.support'})}

这个是我沉浸式状态栏的依赖  感兴趣的可以了解一下

 Rect rectangle= new Rect();getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle);ideaScrollView.setViewPager(viewPager,getMeasureHeight(headerParent)-rectangle.top);icon.setImageAlpha(0);radioGroup.setAlpha(0);radioGroup.check(radioGroup.getChildAt(0).getId());

上面是获取状态栏的高度并且使用自定义scrollview绑定banner图片 并获取图片高度

以及初始化我们头部部分控件的透明度 和默认选择第一个标签

View one = findViewById(R.id.one);
View two = findViewById(R.id.two);
View four = findViewById(R.id.four);
View three = findViewById(R.id.three);
ArrayList<Integer> araryDistance = new ArrayList<>();araryDistance.add(0);
araryDistance.add(getMeasureHeight(one)-getMeasureHeight(headerParent));
araryDistance.add(getMeasureHeight(one)+getMeasureHeight(two)-getMeasureHeight(headerParent));    araryDistance.add(getMeasureHeight(one)+getMeasureHeight(two)+getMeasureHeight(three)-getMeasureHeight(headerParent));ideaScrollView.setArrayDistance(araryDistance);

这块是我们获取到我们的四个模块的高度 并把高度存到集合中 传入到我们自定义的scrollview中

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

scrollview通过传过来的高度进行定位滑动 意思就是点击我们的标题选项滑动到相应的位置

 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();}

这个是获取控件高度的方法

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) {}});

这个监听方法是监测我们滑动的距离 来改变我们标题的颜色 从透明慢慢滑动进行颜色渐变 以及设置我们头部控件的颜色 和展示我们的标题选项卡

public int getAlphaColor(float f){return Color.argb((int) (f*255),0x09,0xc1,0xf4);}public int getLayerAlphaColor(float f){return Color.argb((int) (f*255),0x09,0xc1,0xf4);}public int getRadioCheckedAlphaColor(float f){return Color.argb((int) (f*255),0x44,0x44,0x44);}public int getRadioAlphaColor(float f){return Color.argb((int) (f*255),0xFF,0xFF,0xFF);}

可以根据这块来改变我们头部以及标题的颜色 根据传入的值来进行颜色渐变

 ideaScrollView.setOnSelectedIndicateChangedListener(new IdeaScrollView.OnSelectedIndicateChangedListener() {@Overridepublic void onSelectedChanged(int position) {isNeedScrollTo = false;radioGroup.check(radioGroup.getChildAt(position).getId());isNeedScrollTo = true;}});radioGroup.setOnCheckedChangeListener(radioGroupListener);private RadioGroup.OnCheckedChangeListener radioGroupListener =new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, @IdRes int checkedId) {for(int i=0;i<radioGroup.getChildCount();i++){RadioButton radioButton = (RadioButton) radioGroup.getChildAt(i);radioButton.setTextColor(radioButton.isChecked()?getRadioCheckedAlphaColor(currentPercentage):getRadioAlphaColor(currentPercentage));if(radioButton.isChecked()&&isNeedScrollTo){ideaScrollView.setPosition(i);}}}};

根据这两个监听方法来改变我们标题的选中tab 滑动到不同的位置选中对应的Tab并改变颜色 具体实现方法看自定义Scrollview

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

 @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);}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;}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;}

下面是自定义Scrollview的全部代码

package com.text.lg.ideascrollview;import android.content.Context;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.WindowManager;
import android.widget.ScrollView;import java.util.ArrayList;public class IdeaScrollView extends ScrollView {private final Point point;private IdeaViewPager viewPager;private int position = 0;ArrayList<Integer> arrayDistance = new ArrayList<>();private int headerHeight;public IdeaScrollView(Context context) {this(context,null,0);}public IdeaScrollView(Context context, AttributeSet attrs) {this(context, attrs,0);}public IdeaScrollView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);point = new Point();windowManager.getDefaultDisplay().getSize(point);}@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);}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;}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;}private void scrollToPosition() {scrollToPosition(position);}private void scrollToPosition(int position){scrollTo(0,arrayDistance.get(position));}public void setViewPager(IdeaViewPager viewPager,int headerHeight){this.viewPager = viewPager;this.headerHeight = headerHeight;}public interface OnScrollChangedColorListener{void onChanged(float percentage);void onChangedFirstColor(float percentage);void onChangedSecondColor(float percentage);}public interface OnSelectedIndicateChangedListener{void onSelectedChanged(int position);}private OnSelectedIndicateChangedListener onSelectedIndicateChangedListener;private OnScrollChangedColorListener onScrollChangedColorListener;public OnScrollChangedColorListener getOnScrollChangedColorListener() {return onScrollChangedColorListener;}public void setOnScrollChangedColorListener(OnScrollChangedColorListener onScrollChangedColorListener) {this.onScrollChangedColorListener = onScrollChangedColorListener;}public IdeaViewPager getViewPager() {return viewPager;}public int getPosition() {return position;}public void setPosition(int position) {this.position = position;scrollToPosition();}public ArrayList<Integer> getArrayDistance() {return arrayDistance;}public void setArrayDistance(ArrayList<Integer> arrayDistance) {this.arrayDistance = arrayDistance;}public OnSelectedIndicateChangedListener getOnSelectedIndicateChangedListener() {return onSelectedIndicateChangedListener;}public void setOnSelectedIndicateChangedListener(OnSelectedIndicateChangedListener onSelectedIndicateChangedListener) {this.onSelectedIndicateChangedListener = onSelectedIndicateChangedListener;}
}

以上代码就实现了文中效果图样式

本文借鉴了大佬博客内容  https://blog.csdn.net/AnalyzeSystem/article/details/79442196?from=singlemessage 

GitHub项目地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/61747.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何抓取淘宝上的商品信息和详情页信息

来源于微擎里的人人商城里的插件&#xff0c; 采用接口&#xff1a; 第一个接口未获取基本信息接口,id为淘宝商品ID http://hws.m.taobao.com/cache/wdetail/5.0/?id .$id 第二个接口为获取商品详情信息&#xff0c;id为淘宝商品ID http://hws.m.taobao.com/cache/wdesc/…

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

一、淘宝商品详情页效果 先看一下淘宝详情页的效果 我们的效果 二、实现思路 使用两个scrollView&#xff0c;两个scrollView 竖直排列&#xff0c;通过自定义viewGroup来控制两个scrollView的竖直排列&#xff0c;以及滑动事件的处理。如下图 三、具体实现 1、继承viewGroup自…

HTML之淘宝界面案例

特殊符号 <<br/> <!--<小于号--> ><br/> <!-->大于号--> &amp;<br/> <!--&与--> &reg;<br /> <!--已注册商标--> ©<br /> <!--©版权标记--> &trade;<br /> <!--…

Android开发之仿淘宝商品详情页

看到有人在问如何实现淘宝商品详情页效果&#xff0c;手痒了就撸了一个&#xff0c;献上效果图 大致梳理一下思路&#xff0c;这里不提供源码 状态栏透明使用开源库StatusBarCompat&#xff0c;为了兼容手机4.4 dependencies {compile (com.github.niorgai:StatusBarCompa…

淘宝获得详情页详细教程

请求参数 请求参数&#xff1a;num_iid681459303535&is_promotion1 参数说明&#xff1a;num_iid:淘宝商品ID is_promotion:是否获取取促销价 API接口工具 { "item": { "num_iid": "681459303535", "title&qu…

淘宝商品详情页api

采集淘宝商品列表和商品详情遇到滑块验证码的解决方法&#xff08;带SKU和商品描述&#xff0c;可高并发&#xff09;&#xff0c;主要是解决了高频情况下的阿里系滑块和必须要N多小号才能解决的反扒问题&#xff0c;以后都可以使用本方法了。 大家都知道&#xff0c;淘宝的反爬…

用计算机玩王者荣耀,王者荣耀你们用电脑玩王者荣耀顺手吗? - 游戏发言 - 酷酷跑手机游戏...

我感觉有一点不顺手&#xff0c;那我也是一个职业&#xff0c;专门玩撸啊撸的玩家&#xff0c;但是呢&#xff0c;我就觉得王者荣耀这款游戏不应该搬上电脑这个平面上。王者荣耀是手游它搬上电脑给了诸多英雄&#xff0c;造成不便。比如其中的李白&#xff0c;难道你在李白释放…

王者荣耀太空人名字怎么弄 王者荣耀太空人名字设置方法

在玩王者荣耀游戏时很多人都会遇到一些有趣的名字&#xff0c;比如空白名、彩色名&#xff0c;甚至是会动的名字&#xff0c;而最近王者荣耀就出现了会动的太空人名字&#xff0c;那么&#xff0c;王者荣耀太空人名字怎么弄?下面来看看王者荣耀太空人名字设置方法吧。 王者荣…

苹果微信王者荣耀哪个服务器人多,王者荣耀:QQ区和微信区哪个玩家多?看完会明白...

原标题&#xff1a;王者荣耀&#xff1a;QQ区和微信区哪个玩家多&#xff1f;看完会明白 导读&#xff1a;王者荣耀&#xff1a;QQ区和微信区哪个玩家多&#xff1f;看完会明白 文|刺激小宇哥 阅读到这篇文章的各位趣友大家好&#xff01;游戏无时无刻的丰富着我们的生活&#…

服务器匹配原理,王者荣耀实现原理学习笔记

原作来自腾讯游戏学院 以下是原文部分节选 一、服务器架构 “房间模式” 房间类玩法和MMORPG有很大不同: 1.广播单元的不确定性 2.广播数量很小 3.需要匹配一台房间服务器让少数人进入同一个服务器 这一类游戏最重要的是其“游戏大厅”的承载量,每个“游戏房间”受逻辑所限,…

微信不同服务器能匹配吗,王者荣耀:玩家匹配到自己,体验服微信区和QQ区是互通的?...

原标题&#xff1a;王者荣耀&#xff1a;玩家匹配到自己&#xff0c;体验服微信区和QQ区是互通的&#xff1f; 不少玩家希望官方能够将微信和QQ区的数据打通&#xff0c;但官方的回复是技术无法做到&#xff0c;玩家们也只能因此作罢。近日有游戏博主称&#xff0c;自己王者荣耀…

如何一小时登上微信头脑王者王者段位

废话不多说&#xff0c;直接切入正题。 准备 连接于同一无线网络下的电脑一台、手机一部。 打开下面的网址&#xff0c;下载我们要用的到文件。 https://gitee.com/BroChicken/brain //【GitHub太高级了玩不来&#xff0c;就用了Gitee&#xff08;码云&#xff09;】 点击附件…

训练AI 玩王者荣耀,这算不算开挂?!(附源码)

用自己训练的AI玩王者荣耀 基于深度学习框架pytorch编写&#xff08;resnet101GPT&#xff09;&#xff0c;目前只是验证演示&#xff0c;因为训练数据少以及还没有进入强化学习阶段所以水平不高。 本源码模型主要用了SamLynnEvans Transformer 的源码的解码部分。以及pytorc…

数据分析软件解读王者荣耀一年的“王者”成绩单

玩手游的孩子应该都听过“王者农药”&#xff08;王者荣耀&#xff09;&#xff0c;小编也觉得此游戏&#xff0c;有毒&#xff0c;导致见面第一句话变成了&#xff0c;组团开黑啊&#xff01; 这档游戏有多火&#xff1f;看Power-BI 数据分析软件分析出的数据你就知道了。有人…

我和AI打了六局王者荣耀,心态崩了

十三 发自 凹非寺量子位 报道 | 公众号 QbitAI 今天&#xff0c;我和AI绝悟打了6局王者荣耀&#xff0c;心态有点崩。 没赢过&#xff1f;不&#xff0c;比分3:3打平&#xff0c;还拿过MVP。 那怎么就崩溃了&#xff1f;听我慢慢道来。 PVP对战手游王者荣耀在五一节期间上线了一…

王者荣耀安卓微信有什么服务器,王者荣耀:QQ和微信区哪个好?看排行榜就知道,别不懂清楚转区...

大家都知道&#xff0c;王者荣耀同时拥有安卓和IOS两大区服&#xff0c;它们的每日在线人数都是极其庞大的&#xff0c;而一直以来&#xff0c;关于QQ区和微信区谁强谁弱一直都是玩家们争辩的主要话题。有网友断言&#xff1a;QQ区本来就强&#xff0c;职业选手多&#xff0c;微…

王者荣耀战力查询微信小程序源码下载支持安卓苹果微信Q等多区查询

这是一款战力查询的微信小程序源码 源码内自带了接口 目前支持了微信,Q,苹果,安卓全区都可以查询 ,而且搭建安装简单 使用微信开发者工具打开源码然后设置一下合法域名上传审核即可 该小程序还有战区修改教程等等,具体功能等你来挖掘 另外该小程序无需服务器和域名,让你无…

微信小程序:王者荣耀战力查询微信小程序源码下载支持安卓苹果微信QQ等多区查询

这是一款战力查询的微信小程序源码 源码内自带了接口 目前支持了微信,QQ,苹果,安卓全区都可以查询 支持流量主收益,而且搭建安装简单 使用微信开发者工具打开源码然后设置一下合法域名上传审核即可 该小程序还有战区修改教程等等,具体功能等你来挖掘 另外该小程序无需服务…

王者荣耀改名神器助手微信小程序

这是一个强大的改名神器,强大的生成功能 输入您想要制作的名字可以一键生成N个重复名供您选择 这样就不用担心有些重复名被别人使用了导致无法使用 另外还有英雄昵称,提供多种昵称分类自动生成 比如情侣名字,英雄名字等等(到时候大家看小编演示图即可了解) 支持一键生成N个…

王者荣耀微信一区的服务器没了,为什么王者荣耀微信区和QQ区玩起来像两个游戏?...

我真是被微信区的大叔大妈坑到没脾气……而且有一说一&#xff0c;微信区不仅智商不在线的人很多&#xff0c;还有很多很迷惑的人&#xff0c;根本看不懂他在玩什么也看不懂他想干什么&#xff0c;像人机一般。qq区的人虽然浪&#xff0c;但是傻逼和迷惑的人不多&#xff0c;基…