一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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.写在最后

欢迎同学们吐槽评论,如果你觉得本篇博客对你有用,那么就留个言或者顶一下吧(^-^)

热门栏目