android 自定义 framelayout_Android仿京东金融首页头像效果

本文介绍了一种在Android应用中动态调整头像大小及位置的方法。通过监听ScrollView的滚动事件,实现随滚动改变头像显示效果。文章提供了完整的代码示例,包括自定义ObservableScrollView类。
摘要由CSDN通过智能技术生成

1.介绍

看下效果图,gif录的有些卡顿,在真机上运行效果很好。

d86a8b68258a2181aca3128fe3d71c3b.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);    }}
到这里就结束啦 往期精彩回顾:
  • Android实现短信验证码自动填充功能

  • Android仿echo精美弹幕功能

  • Android实现头像重叠排列功能

  • Android仿QQ个性标签功能

  • Android仿QQ侧滑删除的功能

fd6dae8b8458696208fa514123bbf6aa.png

e8b10fb88ce4af23204b55ad28aa0328.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值