Android之淘宝商品列表长按遮罩效果的实现

先来看看淘宝、唯品会长按商品的效果,以及简单Demo的效果:

首先分析一下场景:

长按条目时,弹出遮罩的效果遮挡在原来的条目布局上; 页面滑动或点击其他的条目,上一个正在遮罩的条目遮罩消失。 长按其他条目时,上一个遮罩的条目撤销遮罩,当前长按的显示遮罩; 条目添加遮罩的时添加动画;

1. 遮罩的效果,我们会很容易的想到Android布局控件FrameLayout布局,是基于叠加在上方的布局。所以在列表条目布局的时候,可以使用FrameLayout布局,在长按列表条目时,用条目的根布局添加一个遮罩的布局,就达到我们想要的效果了。

2. 记录当前长按的根布局,如果点击或长按其他的列表条目,亦或滑动页面(添加活动监听)时,就取消之前长按的条目遮罩,从条目根布局中删除遮罩布局就OK了;

3. 可以利用View动画或属性动画,在添加遮罩布局时显示动画;

接下来, 来撸一下代码吧:

1. 首先,先定义一下遮罩的布局,根据需求自定义View

/***
 * 长按条目遮罩界面
 */
public class ItemMaskLayout extends LinearLayout {

  public ItemMaskLayout(Context context) {
    this(context, null);
  }

  public ItemMaskLayout(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public ItemMaskLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    LayoutInflater.from(context).inflate(R.layout.layout_product_list_item_mask, this, true);
    findViewById(R.id.tv_find_same).setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        if (mItemMaskClickListener != null) {
          mItemMaskClickListener.findTheSame();
        }
      }
    });
    findViewById(R.id.tv_collection).setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        if (mItemMaskClickListener != null) {
          mItemMaskClickListener.collection();
        }
      }
    });
  }

  public ItemMaskClickListener mItemMaskClickListener;
  public void setMaskItemClickListener(ItemMaskClickListener listener) {
    this.mItemMaskClickListener = listener;
  }

  //提供遮罩中按钮点击操作接口 自定义
  public interface ItemMaskClickListener {
    void findTheSame();
    void collection();
  }
}

2. 封装一个帮助类,主要是根据该类的成员变量根据长按的条目指向列表Item的布局,然后为条目添加遮罩的效果;

/**
 * 长按条目添加遮罩操作帮助类
 */
public class ItemLongClickMaskHelper {
  private FrameLayout mRootFrameLayout;
  private ItemMaskLayout mMaskItemLayout;
  private Context mContext;
  private ScaleAnimation anim;
  private String productId;
  public ItemLongClickMaskHelper(Context context){
    this.mContext = context;
    mMaskItemLayout = new ItemMaskLayout(mContext);
    anim = new ScaleAnimation(
        0f, 1.0f, 1.0f, 1.0f,
        Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f
    );
    anim.setDuration(300);
    mMaskItemLayout.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        dismissItemMaskLayout();
      }
    });

    mMaskItemLayout.setOnLongClickListener(new View.OnLongClickListener() {
      @Override
      public boolean onLongClick(View v) {
        dismissItemMaskLayout();
        return true;
      }
    });

    mMaskItemLayout.setMaskItemClickListener(new ItemMaskLayout.ItemMaskClickListener() {
      @Override
      public void findTheSame() {
        ToastUtil.showCustomToast("找相似 " + productId);
      }

      @Override
      public void collection() {
        ToastUtil.showCustomToast("收藏 " + productId);
      }
    });
  }

  public ItemLongClickMaskHelper setRootFrameLayout(FrameLayout frameLayout, String fundId){
    if (mRootFrameLayout != null){
      mRootFrameLayout.removeView(mMaskItemLayout);
    }
    mRootFrameLayout = frameLayout;
    this.productId = fundId;
    mRootFrameLayout.addView(mMaskItemLayout);
    mMaskItemLayout.startAnimation(anim);
    return this;
  }

  public ItemLongClickMaskHelper setMaskItemListener(ItemMaskLayout.ItemMaskClickListener listener){
    this.mMaskItemLayout.setMaskItemClickListener(listener);
    return this;
  }

  /**
   * 遮罩消失
   */
  public void dismissItemMaskLayout(){
    if (mRootFrameLayout != null){
      mRootFrameLayout.removeView(mMaskItemLayout);
    }
  }
}

3.注意在滑动RecyclerView列表的时候,监听滑动,撤销遮罩,直接定义RecyclerView的子类,添加滑动监听回调;

public class TouchCallbackRecyclerView extends RecyclerView {
   public TouchCallbackRecyclerView(Context context) {
    super(context);
  }

  public TouchCallbackRecyclerView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
  }

  public TouchCallbackRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  public interface ScrollCallback {
    /**
     * 滑动手指抬起事件
     *
     * @param diffY 抬起时相对于按下时的偏移量<br/>大于0:列表往下拉, 小于0: 列表往上拉
     */
    void onTouchUp(float diffY);
  }

  private ScrollCallback mScrollCallback;
  public void setScrollCallback(ScrollCallback callback) {
    this.mScrollCallback = callback;
  }

  private float mDownY, mMovingY, mUpY;
  private boolean isUp = false;

  @SuppressWarnings("deprecation")
  private static final float SLOP = ViewConfiguration.getTouchSlop();

  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
      case MotionEvent.ACTION_DOWN:
        mDownY = ev.getY();
        isUp = false;
        break;
      case MotionEvent.ACTION_MOVE:
        mMovingY = ev.getY();
        isUp = false;
        break;
      case MotionEvent.ACTION_UP:
        mUpY = ev.getY();
        isUp = true;
        break;
    }
    if (isUp && mScrollCallback != null && Math.abs(mUpY - mDownY) > SLOP) {
      mScrollCallback.onTouchUp(mMovingY - mDownY);
    }
    return super.dispatchTouchEvent(ev);
  }
}

以上就是主要的代码实现部分,灵活地扩展应用ItemLongClickMaskHelper基本就能实现类似淘宝长按遮罩效果了。希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • 360浏览器文本框获得焦点后被android软键盘遮罩该怎么办
(0)

相关推荐

  • 360浏览器文本框获得焦点后被android软键盘遮罩该怎么办

    场景是这样的,站点上筛选按钮点击后弹出层(fixed),当输入框获取焦点以后弹出系统自带的软键盘,在android上十款浏览器挨个测试比对,发现在360浏览器弹出键盘以后获取焦点的文本框被软键盘覆盖了. 截图如下 (未获取软键盘焦点的情况) (chrome浏览器调起软键盘的情况) (360浏览器调起软键盘情况) 那么问题来了,浏览器的软键盘显示出来又哪几种情况呢?英文   中文(网上找的) 经过简单的了解,大概分析了一下软键盘在浏览器上弹出应该包含软键盘占用主activity空间,让主activ

  • Android之淘宝商品列表长按遮罩效果的实现

    先来看看淘宝.唯品会长按商品的效果,以及简单Demo的效果: 首先分析一下场景: 长按条目时,弹出遮罩的效果遮挡在原来的条目布局上: 页面滑动或点击其他的条目,上一个正在遮罩的条目遮罩消失. 长按其他条目时,上一个遮罩的条目撤销遮罩,当前长按的显示遮罩: 条目添加遮罩的时添加动画: 1. 遮罩的效果,我们会很容易的想到Android布局控件FrameLayout布局,是基于叠加在上方的布局.所以在列表条目布局的时候,可以使用FrameLayout布局,在长按列表条目时,用条目的根布局添加一个遮罩

  • 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

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

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

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

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

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

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

  • python按综合、销量排序抓取100页的淘宝商品列表信息

    进入淘宝网,分别按综合.销量排序抓取100页的所有商品的列表信息. 1.按综合 import re from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium

  • 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仿淘宝商品拖动查看详情及标题栏渐变功能

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

  • Android仿淘宝首页头条View垂直滚动效果

    之前本来是打算做TextView垂直向上滚动的,后来发现一位大神做得很好,https://github.com/sfsheng0322/MarqueeView 孙福生大神,然后自己要用到多个View向上滚动,也就是类似淘宝首页头条的那种滚动,所以就按照那个思路想了系啊,可以把View拿来滚动,这样可以自己随意的修改View里面的内容,还比较简单一些.所以这个整个思路就是把View就行循环滚动. 看一下循环滚动View的内容咋写的吧,非常简单. package com.dreamlive.upma

  • PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例

    说起来做这个功能还真是一时好奇.前段时间在做一个淘客网站的时候,想到是否能抓取到淘宝商品的买家秀呢?经过一番折腾发现,淘宝商品用户评价信息是通过Ajax来调取的,通过嗅探网址发现,评论数据的请求接口是: https://rate.tmall.com/list_detail_rate.htm?itemId=524394294771&spuId=341564036&sellerId=100414600&order=3&currentPage=1&append=0&

随机推荐