这交互炸了:饿了么是怎么让image变成详情页的

三精-大精wing 三精-大精wing     2022-08-17     800

关键词:

晚上叫外卖,打开饿了么,发现推了一个版本,更新以后,点开了个鸡腿,哇,交互炫炸了。

不过还是有槽点。我是无意中才发现可以左右滑动的。这。。。你不告诉我,我怎么知道左右可以滑。

https://github.com/githubwing/ZoomHeader

直接上图啊:

技术分享

挺有意思的,对吧? 所以我就想模仿一下。下面是我做出来的效果:

技术分享

额。。不过图片不是长条的哈。大概意思一样就行了。接下来将和大家分享这个效果是如何实现的。讲思路以及遇到的问题。但是不会讨论细节,具体的细节请看源码。

他是一个Activity还是两个?

相信你肯定有这样的疑问,答案是一个。你看到的中间imageview是viewpager。在Viewpager上面是一个透明的View。当然,这个Activity的背景也是透明的。

实现思路

我使用CoordinatorLayout+Behavior实现的。说实话,Behavior真心强大。。

viewpager+头部

整个实现的思路是这样的。整体布局从上到下依次是:

  • 透明View
  • viewpager
  • RecyclerView

其中透明View和Viewpager 合并成一个自定义的Header。当这个Header上移的时候,图片放大,并且RecyclerView联动上衣,从透明转向并且不透明。

所以首先要定制一个透明的可移动的HeaderView。

在onTouchEvent处理一下手势。。

@Override public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
      case MotionEvent.ACTION_DOWN:
        return true;
      case MotionEvent.ACTION_MOVE:
         if(上下移动到阀值){
            展开为详情()
         }else if(上下滑动到阀值,恢复viewpager){
         }else if(下滑,则关闭Activity)

将header分为三种状态:

  • 上移。则展开为详情页。
  • 下移,则恢复为viewpager。
  • 再下移,则finish Activity。

在上移的过程中,遇到了一点小挑战,这里分享下:

上移的过程中,图片需要放大。但是在做的过程中,不能使用LayoutParams实现。这里就关系到一些动画的小细节。

动画使用LayoutParams实现是一个禁忌。他会导致不停requestLayout,从而影响UI性能。

所以这里我的一个解法就是,我放大图片,不是真正的改变ImageView大小,而是去Scale图片。即使看起来变大了,他的View真正大小也不会变。

所以,有一句话叫做真亦是假、假亦是真 真真假假,你又何必当真呢?动画效果只要遵循这句话,基本上都是可以实现的。你所看到的效果都是假的。都是障眼法。View变大不是真正的变大。View悬浮不是真正的悬浮(有可能是显隐)。就像变魔术一样。。其实很简单。

接下来又遇到问题了。图片放大了,文字如何对齐? 文字的位置当然也不能真正改变。所以这里使用TranslationX实现。在图片放大的过程中,使用scale的系数,与两个端点值进行一个线性变化计算。主要文字对齐代码如下:

      bottom.offsetLeftAndRight(
            (int) (target.getWidth() / 2 - target.getWidth() * (1 + progress) / 2
                + MarginConfig.MARGIN_LEFT_RIGHT - bottom.getX()));

第二个点。就是在图片放大过程中,底部文字和按钮左右padding不能变。这也是我没有封装成一个拿来就用的View的原因(其实还是水平不够)。因为这些空间需要全部按照上方的方法进行动态计算。。所以也是比较坑爹的。。

ViewPager

拿了网上一个画廊的效果。直接

    setPageTransformer(true, new ZoomOutPageTransformer());

这里注意,需要改变一下view的绘制顺序,保证当前view是最后绘制处于最上层

/改变系统绘制顺序
  @Override protected int getChildDrawingOrder(int childCount, int i) {

    int position = getCurrentItem();
    if(position<0){
      return i;
    }else{
      if(i == childCount - 1){//这是最后一个需要刷新的item
        if(position>i){
          position=i;
        }
        return position;
      }
      if(i == position){//这是原本要在最后一个刷新的item
        return childCount - 1;
      }
    }
    return i;
  }
}

RecyclerView

RecyclerView最开始是完全透明的。并且跟随HeaderView上移而上移,在上移的过程中渐渐显示出来。 需要监听RecyclerView滚动,当RecyclerView滚动到顶部的时候。告知Header,该恢复最初原样了。

@Override
  public boolean onNestedFling(CoordinatorLayout coordinatorLayout, View child, View target,
      float velocityX, float velocityY, boolean consumed) {

    //向下Fling并且到顶部
    if (velocityY < 0 && ((RecyclerView) target).getChildAt(0).getY() == 0) {
      mDependency.restore(mDependency.getY());
    }
    return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);
  }

  @Override
  public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target,
      int dx, int dy, int[] consumed) {

    //如果在顶部
    if (((RecyclerView) target).getChildAt(0).getY() == 0) {
      //向下滑动
      if (dy < 0) {
        mDependency.setY(mDependency.getY() - dy);
        //小于阀值
        if (mDependency.getY() < 500) {
          mDependency.restore(mDependency.getY());
        }
      }
    }
    super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
  }
}

Behavior

让header和RecyclerView关联起来的就是Behavior了。Behavior之前写过几篇介绍过了,这里就不再啰嗦。

denpendcy为HeaderView。并且监听RecyclerView的滑动。

具体的细节还是看源码吧~

如果你觉得还不错,欢迎Star
本项目地址

欢迎加入我的qq群: 425983695


饿了么订单记录怎么删除

...我们饿的时候已经不需要再自己动手做饭了,只需要点开饿了么就可以解决吃饭的问题。饿了么的出现给我们生活带来了很大的方便,但是很多朋友一直不知道怎么删除订单记录,今天就让我来教教大家吧。1、打开饿了么,我... 查看详情

饿了么骑手审核不通过怎么办

参考技术A扣钱。饿了么会不定时的抽检骑手,骑手没有通过抽检会扣除骑手的钱,是无法申诉的,饿了么是2008年创立的本地生活平台,主营在线外卖、新零售、即时配送和餐饮供应链等业务。 查看详情

skecth怎么把饿了么组件变成自己的组件

参考技术A打开你已经做好的SU模型,鼠标点击确定之后即可将物体设置成组件。打开你已经做好的SU模型。我们以一个简单的SU模型为例。我们的组件在这里:窗口-组件。打开之后你会看到一个对话框,其中那些组件就是自带的... 查看详情

支付宝饿了吗怎么删除订单(支付宝饿了吗怎么删除历史订单怎么删除)

支付宝饿了么里的订单是可以删除的,具体操作如下:演示所用支付宝版本为10.2.961、打开支付宝以后,点开上方的搜索框。2、在输入框输入“饿了么”,等待自动搜索结束后,点击“饿了么”。3、点击打开小程序“饿了么”... 查看详情

订餐系统之同步饿了么商家订单

...不应该因为口碑没了,就变成破铜废铁。暮然回首,原来饿了么也有商户接口,虽然没有淘宝外卖开放平台那么强大,提供好几种语言的示例代码,没有怎么办?自己动手,丰衣足食!   查看详情

这交互炸了:一分钟让你拥有微信拖拽透明返回photoview(代码片段)

...微信公众号:鸿洋(hongyangAndroid)原创首发《交互炸了》或许是一系列高端特效教程,文中会介绍一些比较炫酷的特效,以及实现的思路。特效实现本身也许不会有太大的难度。难点在于实现的思路。一旦思路被打... 查看详情

饿了么:业务井喷时订单系统架构的演进

摘要:饿了么是一家创业公司,业务发展非常快,可能准备不是很充分,比如说监控、日志、告警、框架、消息、数据库,很多基础设施还在建设之中。在这个过程中出现一些问题是在所难免的,对系统的要求不是不能挂、不能... 查看详情

饿了么:三招错旗让先行者惨败2016

站在互联网变局的风口,饿了么创始人张旭豪又一次感冒了。2016年的初冬,饿了么开始了一场声势浩大的“冬季战役”:高额补贴、冲GMV、从竞争对手挖人等等,一系列的动作,使沉寂已久的外卖O2O市场,再起波澜。让人颇感有... 查看详情

饿了么的萧瑟之秋

650)this.width=650;"src="http://zhuyi.blog.techweb.com.cn/files/2016/09/271828008142082724.jpg"title="271828008142082724"width="400"height="240"class="aligncentersize-fullwp-image-1867"style="border:0 查看详情

饿了么商家名字怎么加后缀

参考技术A饿了么美团店加特符号,就是有你起名时约符号,直接按复制,复制后在游戏里改名添加,按你约爱好设就... 参考技术B饿了么美团店加特符号,就是有你起名时约符号,直接按复制,复制后在游戏里改名添加,按你约... 查看详情

饿了么ui组件库中,image组件预览图片错位的解决(代码片段)

使用过elementUI组件库中的Image组件基本都知道,其组件会自带一个图片预览功能,仅需要通过preview-src-list传入需要预览的图片url列表即可实现点击预览。博主使用了此功能,进行数组的循环渲染,具体渲染代码如... 查看详情

饿了么账户异常怎么解决?

饿了么账户异常有以下几种解决方法:先退出登录,然后在登录试试。一般来说账号在其他地方登录次数过多才会这样。2.不行的话可以用账号申诉,看看自己账号有没有被盗用。3.设置好密保问题,保护好自己账号。也有肯能... 查看详情

仿饿了么购物车下单效果

仿饿了么购物车下单效果前一段由于新项目需要,开发一个类似饿了么购物车下单效果,电商类、外卖类、点餐类项目都可以用的上,废话不多说请看效果。效果图如下:主要的功能:就是左侧展示分类,右侧展示分类下商品的,... 查看详情

饿了么付款时出现设备信息异常怎么解决?

账户异常的解决方法:1、账户异常的话那就得到饿了么里面绑定下,密保要设置好,激活下qq邮箱,或者绑定下你的手机号码。可以解决问题。2、如果还是异常也有可能是软件得情况,卸载掉这个软件,重新下载下,到同步推... 查看详情

这交互炸了:闪屏页是像云一样消失的

《交互炸了》或许是一系列高端特效教程,文中会介绍一些比较炫酷的特效,以及实现的思路。特效实现本身也许不会有太大的难度。难点在于实现的思路。一旦思路被打开,特效将很简单实现。效果项目地址:https://github.com/github... 查看详情

用vue制作饿了么首页

无论是静态网页还是动态交互网页,实现原则是将他们分块,然后各个击破。很明显的饿了么首页分为三个部分(组件),  上面的头部(商家信息),  中间路由  购物车每部分先占住自己位置,然后挨个... 查看详情

饿了么商家版账号密码正确怎么显示验证码无效?

饿了吗商家版账号密码正确,显示验证码无效,那可能过了有效期,你再重新发一个验证码就好了参考技术A饿了么商家版,账号和密码都正确,显示验证码无效,这是因为你输入账号密码后,在输入验证码的时候输入错误引起... 查看详情

看到饿了么事件,我有一个想法,直播做外卖

网友问题:吃外卖最担心的事情还是干净卫生,为了让大家吃得方放心,把做菜这个过程直播出来,考虑到要做得更好吃,每天只做一定的份数,当然价格也要比普通的贵一点。不定期邀请用户上面吃饭小聚,切身体验卫生环境... 查看详情