当前位置: 移动技术网 > IT编程>移动开发>Android > Android仿淘宝商品详情页效果

Android仿淘宝商品详情页效果

2019年08月01日  | 移动技术网IT编程  | 我要评论

嘉峪关物流,romeo must die,山进

本文实例为大家分享了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仿淘宝商品详情页

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网