不是共享元素!不是共享元素!不是共享元素!重要的话说三遍。共享元素不可以随手指移动的。

先吐槽下饿了么。不提示左右可以滑动。我还是无意中发现的。不提示我怎么知道可以滑动??

这是一个模仿饿了么详情页的例子。并非一个库,并非拿来就可以用,主要讲解思路以及如何实现,可能有一些细节没有处理。

讲述了如何实现。具体祥见源码。

他是一个 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

License

Copyright 2016 androidwing1992

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

android 卡片放大变详情页,ZoomHeader 神交互!饿了么 imageView 放大变为详情页 @codeKK Android开源站...相关推荐

  1. 【深度学习】YOLOv7速度精度超越其他变体,大神AB发推,网友:还得是你!|开源...

    转载自 | 量子位 作者 | Pine 前脚美团刚发布YOLOv6, YOLO官方团队又放出新版本. 曾参与YOLO项目维护的大神Alexey Bochkovskiy在推特上声称: 官方版YOLOv7 ...

  2. android 混音 源码,FFmpegAndroid android 端基于 FFmpeg 实现音频剪切、拼接、转码、混音、编解码;视频剪切、水印、截图、转码、编 @codeKK c开源站...

    android 端基于 FFmpeg 库的使用 添加编译 ffmpeg.shine.mp3lame.x264 源码的参考脚本 目前音视频相关处理: 音频剪切.拼接 音频混音 音频转码 音视频合成 音频 ...

  3. android堆内存解析,heapsnap HeapSnap 是一款针对 Android 进程堆内存进行追踪、定位,以便查出泄露位置的工具 @codeKK c开源站...

    1.HeapSnap 是什么 HeapSnap 是一个定位内存泄露的工具,适用于 Android 平台. 主要特性如下: 对系统负载低 不需要修改目标进程的源代码 支持 Andoroid 上的大多数 ...

  4. android差分升级原理,BigNews Android 增量更新框架差分包升级 @codeKK c开源站

    支持增量包/差分包/升级包 原理:在服务器端使用 bsdiff 工具将新老安装包的差异打包为一个体积较小的差分包/升级包,然后在 App 端通过 bspatch 工具(和 bsdiff 配套的)用差分 ...

  5. android仿支付宝弹窗,AlipayPassDialog Android 仿支付宝密码键盘弹框,可以自定义样式 Dialog,调节字体颜色大小内容 @codeKK Android开源站...

    博客讲解地址,欢迎前往查看 欢迎大家 Star,老铁给鼓励呗 效果图如下: 主要功能 支持自定义文本.颜色.大小 支持自定义关闭图标 支持弹框样式 支持回调函数处理 支持数字位置随机 API 方法介绍 ...

  6. android timer 控件,TimerView 一个解耦良好的计时控件,可自由扩展。 @codeKK Android开源站...

    世上本没有解耦,需求改的多了也便有了解耦. -- 产品经理 本例将通过一个计时控件,聊聊如何解耦~ 本TimerView仅作为demo,不保证其健壮性,请勿在实际项目中使用. 特点 UI 容器与计时逻 ...

  7. android 卡片滑动详情页,在Mugeda中制作顺畅的左右滑动切换卡片效果的教程

    之前在做<刁角武汉>的时候对如何选择景点这个问题做了好几个方案,一个是画一张大地图,另一个是做垂直的列表选择,但我还是选择了左右滑动来切换景点.因为在多次尝试之后发现发现在手机屏上似乎不适 ...

  8. 华为手机吃鸡隐藏功能android,环幕屏只是好看?开启华为Mate30 Pro这个隐藏功能,秒变吃鸡大神!...

    原标题:环幕屏只是好看?开启华为Mate30 Pro这个隐藏功能,秒变吃鸡大神! 作为一名吃鸡游戏玩家,今天看到知名游戏博主@高龄玩家老陈 的一条微博可谓感同身受.本来已经达到了英勇黄金的段位,觉得自 ...

  9. 酷派android是什么系统版本,酷派大神X7的手机系统是什么?能升级安卓5.0吗?

    酷派大神X7的手机系统是什么 大神X7搭载了最新的Cool UI 6.0(基于Android 4.4.2)系统界面. 大神X7采用了Super AMOLED材质的屏幕,尺寸为5.2英寸,分辨率为主流的 ...

最新文章

  1. 016-热更新之FishingJoy一
  2. Java集合查找Map,java:使用hashmap或其他一些java集合创建查找...
  3. jupyter notebook中忽略所有警告,让页面更整洁
  4. c mysql转sqlite_SqliteToMysql
  5. 启用vsftpd服务
  6. java 和javafx_Java,JavaFX的流利设计风格文本字段和密码字段
  7. [html] 说说你对移动优先布局的理解
  8. HDU-1686Oulipo(kmp)
  9. 43个实例xHTML+CSS(DIV+CSS)网页及导航布局教程
  10. BI软件的作用有哪些
  11. luogu P2678 跳石头 二分answer
  12. WINDOWS 98 启动盘(加强版)
  13. 冲压模板自动标注LISP_自动标注.LSP
  14. 98版五笔字型实用学习教程
  15. java面试填空题 jsp_JSP面试题及答案
  16. CUDA10,Torch安装解决NOTFOUND CUDA_cublas_device_LIBRARY,Ubuntu16.04安装torch遇到的错误
  17. 企业授权:SOA被低估的经济价值
  18. 用selenium爬取拉勾网职位信息及常见问题处理
  19. 蓝桥杯大学本科B组考点整理
  20. 蜻蜓优化算法Python代码(详细注释)

热门文章

  1. 6-1 水仙花数判断 (10分)(函数题)
  2. 浙江农林大学第二十二届程序设计竞赛部分题解
  3. 无人机学习之路——材料准备
  4. Re: 什么是OO思想
  5. 01_JavaScript数据结构与算法(一)前言
  6. 现在学IT行业,选择哪个方向较好?
  7. 物流货运移动APP解决方案
  8. 【CSS】标准盒模型和怪异盒模型
  9. 解决app欢迎页面白屏问题
  10. Showing All Errors Only Command PhaseScriptExecution failed with a nonzero exit code