1.介绍

看下效果图,gif录的有些卡顿,在真机上运行效果很好。
2.实现
很有意思的一个效果,原理其实很简单,就是通过监听ScrollView在Y轴的滑动距离,然后在代码中动态设置头像的位置和大小。
public class MainActivity extends AppCompatActivity {
private CircleImageView ivPortrait;
private ObservableScrollView scrollView;
private ViewGroup.MarginLayoutParams marginLayoutParams;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
ivPortrait = (CircleImageView) findViewById(R.id.iv_portrait);
scrollView = (ObservableScrollView) findViewById(R.id.scrollView);
marginLayoutParams = new ViewGroup.MarginLayoutParams(ivPortrait.getLayoutParams());
scrollView.setScrollViewListener(new ObservableScrollView.ScrollViewListener() {
@Override
public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) {
// 设置头像距离顶部的距离
int top = dp2px(70) - y;
if (top < dp2px(10)) {
// 固定在标题栏
marginLayoutParams.setMargins(dp2px(20), dp2px(10), 0, 0);
} else {
// 向上移动
marginLayoutParams.setMargins(dp2px(20), dp2px(70) - y, 0, 0);
}
// 根据向上滑动的距离设置头像的大小
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(marginLayoutParams);
// 头像最大为45dp,最小为30dp
int height = dp2px(45) - y < dp2px(30) ? dp2px(30) : dp2px(45) - y;
layoutParams.height = height;
layoutParams.width = height;
ivPortrait.setLayoutParams(layoutParams);
}
});
}
private int dp2px(float dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
getResources().getDisplayMetrics());
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFF"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:background="#F2F4F7"> ... </RelativeLayout> <com.yl.jdfinanceindex.ObservableScrollView android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="match_parent" android:overScrollMode="never" android:scrollbars="none"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="80dp" android:background="#F2F4F7"> ... </RelativeLayout> <View android:layout_width="match_parent" android:layout_height="1000dp" /> </LinearLayout> </com.yl.jdfinanceindex.ObservableScrollView> </LinearLayout> <com.yl.jdfinanceindex.CircleImageView android:id="@+id/iv_portrait" android:layout_width="45dp" android:layout_height="45dp" android:layout_marginLeft="20dp" android:layout_marginTop="70dp" android:src="@mipmap/ic_portrait" /> </FrameLayout>
原生的ScrollView是不支持滑动监听的,需要自定义一个ObservableScrollView。
public class ObservableScrollView extends ScrollView {
private ScrollViewListener scrollViewListener;
public ObservableScrollView(Context context) {
super(context);
}
public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public ObservableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setScrollViewListener(ScrollViewListener scrollViewListener) {
this.scrollViewListener = scrollViewListener;
}
@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
super.onScrollChanged(x, y, oldx, oldy);
if (scrollViewListener != null) {
scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
}
}
public interface ScrollViewListener {
void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);
}
}
3.写在最后
欢迎同学们吐槽评论,如果你觉得本篇博客对你有用,那么就留个言或者顶一下吧(^-^)
完整的Demo下载
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android仿京东金融首页头像效果
# Android首页头像效果
# Android京东金融首页头像
# Android仿京东首页秒杀倒计时
# Android仿京东首页画轴效果
# Android仿京东首页轮播文字效果
# Android实现京东首页效果
# 对你
# 同学们
# 自定义
# 不支持
# 写在
# 机上
# 很有意思
# 留个
# 大家多多
# 如果你觉得
# 其实很简单
# 效果很好
# 标题栏
# 博客
# id
# findViewById
# initView
# setScrollViewListener
# getLayoutParams
# iv_portrait
相关文章:
如何通过FTP服务器快速搭建网站?
建站之星免费版是否永久可用?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
,怎么在广州志愿者网站注册?
网站制作说明怎么写,简述网页设计的流程并说明原因?
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
如何在新浪SAE免费搭建个人博客?
制作网站的模板软件,网站怎么建设?
网站app免费制作软件,能免费看各大网站视频的手机app?
如何获取上海专业网站定制建站电话?
C#如何在一个XML文件中查找并替换文本内容
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
如何在阿里云香港服务器快速搭建网站?
,怎么用自己头像做动态表情包?
如何通过老薛主机一键快速建站?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
表情包在线制作网站免费,表情包怎么弄?
网站制作模板下载什么软件,ppt模板免费下载网站?
如何通过商城免费建站系统源码自定义网站主题?
建站之星代理平台如何选择最佳方案?
制作电商网页,电商供应链怎么做?
如何高效配置IIS服务器搭建网站?
建站主机是什么?如何选择适合的建站主机?
建站168自助建站系统:快速模板定制与SEO优化指南
网站网页制作专业公司,怎样制作自己的网页?
大连 网站制作,大连天途有线官网?
青浦网站制作公司有哪些,苹果官网发货地是哪里?
如何在VPS电脑上快速搭建网站?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星与建站宝盒如何选择最佳方案?
如何通过可视化优化提升建站效果?
常州自助建站费用包含哪些项目?
如何用花生壳三步快速搭建专属网站?
如何快速上传建站程序避免常见错误?
建站之星安装路径如何正确选择及配置?
如何在腾讯云免费申请建站?
如何选择美橙互联多站合一建站方案?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
网站制作服务平台,有什么网站可以发布本地服务信息?
已有域名和空间,如何快速搭建网站?
详解jQuery中基本的动画方法
个人网站制作流程图片大全,个人网站如何注销?
ppt制作免费网站有哪些,ppt模板免费下载网站?
如何在IIS中新建站点并配置端口与IP地址?
c# 在高并发场景下,委托和接口调用的性能对比
建站之星如何修改网站生成路径?
如何快速搭建高效可靠的建站解决方案?
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。