Android仿淘宝商品详情页效果
本文实例为大家分享了android仿淘宝商品详情页的具体代码,供大家参考,具体内容如下
demo地址:先上效果图
效果就是上面图片的效果 接下来看看如何实现
首先我们来看下布局文件
<linearlayout android:id="@+id/header" android:layout_width="match_parent" android:layout_height="72dp" android:paddingtop="24dp" android:background="#00ffffff" android:orientation="horizontal"> <imageview android:layout_width="30dp" android:layout_height="30dp" android:layout_gravity="center" android:src="@drawable/back" /> <view android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"/> <imageview android:id="@+id/icon" android:layout_width="30dp" android:layout_height="30dp" android:src="@drawable/aa" android:layout_gravity="center"/> <view android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"/> <imageview android:layout_width="30dp" android:layout_height="30dp" android:layout_gravity="center" /> </linearlayout>
这块主要是设置刚进入页面时的透明头部 主要组成部分有返回键 和头部的方形小图片 还有分享按钮 以及你想附加的标题功能 默认进入是透明的只显示返回按钮
<framelayout android:layout_width="match_parent" android:layout_height="wrap_content"> <radiogroup android:id="@+id/radiogroup" android:background="#00ffffff" android:layout_width="match_parent" android:orientation="horizontal" android:layout_height="48dp"> <radiobutton android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:button="@null" android:textcolor="#00000000" android:gravity="center" android:text="宝贝"/> <radiobutton android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:button="@null" android:textcolor="#00000000" android:gravity="center" android:text="评价"/> <radiobutton android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:button="@null" android:textcolor="#00000000" android:gravity="center" android:text="详情"/> <radiobutton android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:button="@null" android:textcolor="#00000000" android:text="推荐"/> </radiogroup> <view android:id="@+id/layer" android:layout_width="match_parent" android:background="#00ffffff" android:layout_height="48dp"/> </framelayout>
这部分主要是我们的标签选项卡 我这边采用的是radiogroup+radiobutton实现的 类似于淘宝的商品、评价、详情等标签
这样我们的页面布局头部就完成了 下面我们来看下具体组成内容
<com.text.lg.ideascrollview.ideascrollview android:id="@+id/ideascrollview" android:layout_width="match_parent" android:layout_height="match_parent"> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <linearlayout android:id="@+id/one" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <com.text.lg.ideascrollview.ideaviewpager android:id="@+id/viewpager" android:layout_width="match_parent" android:background="@drawable/aa" android:layout_height="wrap_content"/> <imageview android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/one"/> </linearlayout> <linearlayout android:id="@+id/two" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <imageview android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/two"/> <imageview android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/three"/> </linearlayout> <imageview android:id="@+id/three" android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/four"/> <linearlayout android:id="@+id/four" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <imageview android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/five"/> <imageview android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/six"/> <imageview android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/six"/> <imageview android: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() { @override public 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); } @override public void onchangedfirstcolor(float percentage) { } @override public 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() { @override public void onselectedchanged(int position) { isneedscrollto = false; radiogroup.check(radiogroup.getchildat(position).getid()); isneedscrollto = true; } }); radiogroup.setoncheckedchangelistener(radiogrouplistener); private radiogroup.oncheckedchangelistener radiogrouplistener =new radiogroup.oncheckedchangelistener() { @override public 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)计算百分比偏移量,实现颜色渐变、透明度渐变(淘宝商品详情页有二次颜色渐变)
@override protected 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); } @override protected 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; } }
以上代码就实现了文中效果图样式。
本文借鉴了大佬博客内容 android仿淘宝商品详情页
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 小男孩在吃东西