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
相关文章:
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
Swift中swift中的switch 语句
中山网站推广排名,中山信息港登录入口?
如何在建站之星绑定自定义域名?
如何在腾讯云服务器快速搭建个人网站?
宿州网站制作公司兴策,安徽省低保查询网站?
如何快速上传自定义模板至建站之星?
如何快速搭建自助建站会员专属系统?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
如何基于PHP生成高效IDC网络公司建站源码?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
,如何利用word制作宣传手册?
如何快速使用云服务器搭建个人网站?
c# 在高并发场景下,委托和接口调用的性能对比
成都网站制作报价公司,成都工业用气开户费用?
如何在Tomcat中配置并部署网站项目?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
如何用y主机助手快速搭建网站?
建站之星如何一键生成手机站?
Swift中循环语句中的转移语句 break 和 continue
如何快速搭建支持数据库操作的智能建站平台?
制作旅游网站html,怎样注册旅游网站?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
如何通过老薛主机一键快速建站?
如何在IIS服务器上快速部署高效网站?
如何在阿里云高效完成企业建站全流程?
建站主机是否属于云主机类型?
建站之星如何优化SEO以实现高效排名?
建站OpenVZ教程与优化策略:配置指南与性能提升
佛山网站制作系统,佛山企业变更地址网上办理步骤?
制作网站的软件免费下载,免费制作app哪个平台好?
临沂网站制作企业,临沂第三中学官方网站?
建站VPS选购需注意哪些关键参数?
C#如何在一个XML文件中查找并替换文本内容
制作宣传网站的软件,小红书可以宣传网站吗?
Python如何创建带属性的XML节点
宝塔建站后网页无法访问如何解决?
长沙企业网站制作哪家好,长沙水业集团官方网站?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
如何在阿里云服务器自主搭建网站?
网站制作话术技巧,网站推广做的好怎么话术?
如何在景安云服务器上绑定域名并配置虚拟主机?
如何在香港免费服务器上快速搭建网站?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
建站之星导航菜单设置与功能模块配置全攻略
已有域名如何免费搭建网站?
太原网站制作公司有哪些,网约车营运证查询官网?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
建站之星如何实现PC+手机+微信网站五合一建站?
*请认真填写需求信息,我们会在24小时内与您取得联系。