最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Android仿京东金融首页头像效果
时间:2017-03-15 编辑:简简单单 来源:一聚教程网
1.介绍
看下效果图,gif录的有些卡顿,在真机上运行效果很好。
2.实现
很有意思的一个效果,原理其实很简单,就是通过监听ScrollView在Y轴的滑动距离,然后在代码中动态设置头像的位置和大小。
代码如下 | 复制代码 |
publicclassMainActivityextendsAppCompatActivity {
privateCircleImageView ivPortrait; privateObservableScrollView scrollView;
privateViewGroup.MarginLayoutParams marginLayoutParams;
@Override protectedvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
initView(); }
privatevoidinitView() { ivPortrait = (CircleImageView) findViewById(R.id.iv_portrait); scrollView = (ObservableScrollView) findViewById(R.id.scrollView);
marginLayoutParams =newViewGroup.MarginLayoutParams(ivPortrait.getLayoutParams());
scrollView.setScrollViewListener(newObservableScrollView.ScrollViewListener() { @Override publicvoidonScrollChanged(ObservableScrollView scrollView,intx,inty,intoldx,intoldy) { // 设置头像距离顶部的距离 inttop = 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 =newFrameLayout.LayoutParams(marginLayoutParams); // 头像最大为45dp,最小为30dp intheight = dp2px(45) - y < dp2px(30) ? dp2px(30) : dp2px(45) - y; layoutParams.height = height; layoutParams.width = height; ivPortrait.setLayoutParams(layoutParams); } }); }
privateintdp2px(floatdp) { return(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics()); } } |
布局文件
代码如下 | 复制代码 |
android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFF"> android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> android:layout_width="match_parent" android:layout_height="50dp" android:background="#F2F4F7"> ... android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="match_parent" android:overScrollMode="never" android:scrollbars="none"> android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> android:layout_width="match_parent" android:layout_height="80dp" android:background="#F2F4F7"> ... android:layout_width="match_parent" android:layout_height="1000dp"/> 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"/> |
原生的ScrollView是不支持滑动监听的,需要自定义一个ObservableScrollView。
代码如下 | 复制代码 |
publicclassObservableScrollViewextendsScrollView {
privateScrollViewListener scrollViewListener;
publicObservableScrollView(Context context) { super(context); }
publicObservableScrollView(Context context, AttributeSet attrs,intdefStyle) { super(context, attrs, defStyle); }
publicObservableScrollView(Context context, AttributeSet attrs) { super(context, attrs); }
publicvoidsetScrollViewListener(ScrollViewListener scrollViewListener) { this.scrollViewListener = scrollViewListener; }
@Override protectedvoidonScrollChanged(intx,inty,intoldx,intoldy) { super.onScrollChanged(x, y, oldx, oldy); if(scrollViewListener !=null) { scrollViewListener.onScrollChanged(this, x, y, oldx, oldy); } }
publicinterfaceScrollViewListener { voidonScrollChanged(ObservableScrollView scrollView,intx,inty,intoldx,intoldy); } } |
3.写在最后
欢迎同学们吐槽评论,如果你觉得本篇博客对你有用,那么就留个言或者顶一下吧(^-^)