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仿淘宝商品详情页

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

(0)

相关推荐

  • Android自定义LinearLayout实现淘宝详情页

    1.简单说明 淘宝详情页就不用我一一介绍了,昨天逛淘宝看到这个效果时,让我想起了去年刚学习Android只会使用现成的时候,当时在网上找了一个这种效果的使用了,并不懂怎么实现的.现在就看到一种效果就想自己实现一下,我想这就是刚接触某个知识时的好奇心吧 说走咱就走啊,本文只是介绍一种实现思路,网上也已经有了很多种实现方式,有问题请指正 效果图(我有很用心的找美女图的) 2.实现思路 继承LinearLayout,设置方向为垂直 控件中有两个ScrollView,至于为什么要使用ScrollView

  • Android自定义ViewGroup实现淘宝商品详情页

    最近公司在新版本上有一个需要,要在首页添加一个滑动效果,具体就是仿照X宝的商品详情页,拉到页面底部时有一个粘滞效果,如下图X东的商品详情页,如果用户继续向上拉的话就进入商品图文描述界面: 刚开始是想拿来主义,直接从网上找个现成的demo来用, 但是网上无一例外的答案都特别统一: 几乎全部是ScrollView中再套两个ScrollView,或者是一个LinearLayout中套两个ScrollView. 通过指定父view和子view的focus来切换滑动的处理界面---即通过view的requ

  • Android仿淘宝商品详情页

    看到有人在问如何实现淘宝商品详情页效果,献上效果图 大致梳理一下思路,这里不提供源码 状态栏透明使用开源库StatusBarCompat,为了兼容手机4.4 dependencies { compile ('com.github.niorgai:StatusBarCompat:2.1.4', { exclude group: 'com.android.support' }) } allprojects { repositories { ... maven { url "https://jitpa

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

    一.淘宝商品详情页效果 我们的效果 二.实现思路 使用两个scrollView,两个scrollView 竖直排列,通过自定义viewGroup来控制两个scrollView的竖直排列,以及滑动事件的处理.如下图 三.具体实现 1.继承viewGroup自定义布局View 重写onMeasure()和onLayout方法,在onLayout方法中完成对两个子ScrollView的竖直排列布局,代码如下: 布局文件: <RelativeLayout xmlns:android="http:/

  • Android仿淘宝详情页面viewPager滑动到最后一张图片跳转的功能

    需要做一个仿淘宝客户端ViewPager滑动到最后一页,再拖动的时候跳到详情的功能,刚开始没什么思路,后来搜了一下,发现有好几种实现方法,最好的一种就是在ViewPager图片的后面再加一个view,然后滑动viewpager的时候,判断一下就行了. 附一个链接,我写的代码就是参考的这个,稍微改了一点点,先看看效果图. 实现起来比较简单,先写一个滑动加载详情的布局,然后在viewpager的instantiateItem里面判断一下,如果是最后一张,就显示加载详情的那个布局.不过需要注意的是,v

  • Android仿淘宝商品详情页效果

    本文实例为大家分享了Android仿淘宝商品详情页的具体代码,供大家参考,具体内容如下 Demo地址:先上效果图 效果就是上面图片的效果 接下来看看如何实现 首先我们来看下布局文件 <LinearLayout android:id="@+id/header" android:layout_width="match_parent" android:layout_height="72dp" android:paddingTop="24

  • Android仿淘宝商品拖动查看详情及标题栏渐变功能

    绪论 最近一直比较忙,也没抽出时间来写博客,也不得不说是自己犯了懒癌,人要是一懒就什么事都不想做了,如果不能坚持下来的话,那么估计就废了,��.最近自己攒了好多东西,接下来的时间我会慢慢都分享出来的.好了废话不多说了,下面我们开始正题: 今天要分享的是淘宝的详情页,之前在淘宝上买东西的时候看到淘宝的详情页效果比较不错,所以今天就来仿一下它的效果吧,可能没有淘宝的好,希望见谅啊. 先上效果图: 这是淘宝的: 我自己做的: 怎么样效果还差不多吧?GIF图效果看的不太清楚,见谅. 下面我们来看看怎么实

  • Android 仿淘宝商品属性标签页

    需求 1.动态加载属性,如尺码,颜色,款式等 由于每件商品的属性是不确定的,有的商品的属性是颜色和尺码,有的是口味,有的是大小,所以这些属性不能直接写死到页面上. 2.动态加载属性下的标签 每个属性下的标签个数也不是一定的,比如有的商品的尺码是是S,M,XL,有的是均码,也就是每种属性的具体的内容是不一定的. 技术点 自定义ViewGroup,使其中的TextView可以依据内容长短自动换行,如下图所示 实现 布局 通过ListView来显示商品所有属性,每种属性作为ListView的Item.

  • Android实现淘宝商品列表切换效果

    本文实例为大家分享了Android仿淘宝商品列表切换,供大家参考,具体内容如下 源码:Android实现淘宝商品列表切换 布局文件 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.androi

  • python爬取淘宝商品详情页数据

    在讲爬取淘宝详情页数据之前,先来介绍一款 Chrome 插件:Toggle JavaScript (它可以选择让网页是否显示 js 动态加载的内容),如下图所示: 当这个插件处于关闭状态时,待爬取的页面显示的数据如下: 当这个插件处于打开状态时,待爬取的页面显示的数据如下:   可以看到,页面上很多数据都不显示了,比如商品价格变成了划线价格,而且累计评论也变成了0,说明这些数据都是动态加载的,以下演示真实价格的找法(评论内容找法类似),首先检查页面元素,然后点击Network选项卡,刷新页面,可

  • Android仿淘宝商品浏览界面图片滚动效果

    用手机淘宝浏览商品详情时,商品图片是放在后面的,在第一个ScrollView滚动到最底下时会有提示,继续拖动才能浏览图片.仿照这个效果写一个出来并不难,只要定义一个Layout管理两个ScrollView就行了,当第一个ScrollView滑到底部时,再次向上滑动进入第二个ScrollView.效果如下: 需要注意的地方是: 1.如果是手动滑到底部需要再次按下才能继续往下滑,自动滚动到底部则不需要 2.在由上一个ScrollView滑动到下一个ScrollView的过程中多只手指相继拖动也不会导

随机推荐