Android 仿京東金融首頁(yè)頭像效果

封面

1.介紹

看下效果圖堵泽,gif錄的有些卡頓赊窥,在真機(jī)上運(yùn)行效果很好爆惧。

京東金融

2.實(shí)現(xiàn)

很有意思的一個(gè)效果,原理其實(shí)很簡(jiǎn)單锨能,就是通過(guò)監(jiān)聽(tīng)ScrollView在Y軸的滑動(dòng)距離扯再,然后在代碼中動(dòng)態(tài)設(shè)置頭像的位置和大小。

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) {
                // 設(shè)置頭像距離頂部的距離
                int top = dp2px(70) - y;
                if (top < dp2px(10)) {
                    // 固定在標(biāo)題欄
                    marginLayoutParams.setMargins(dp2px(20), dp2px(10), 0, 0);
                } else {
                    // 向上移動(dòng)
                    marginLayoutParams.setMargins(dp2px(20), dp2px(70) - y, 0, 0);
                }

                // 根據(jù)向上滑動(dòng)的距離設(shè)置頭像的大小
                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是不支持滑動(dòng)監(jiān)聽(tīng)的熄阻,需要自定義一個(gè)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.寫(xiě)在最后

歡迎同學(xué)們吐槽評(píng)論倔约,如果你覺(jué)得本篇博客對(duì)你有用秃殉,那么就留個(gè)言或者點(diǎn)下喜歡吧(^-^)

完整的Demo下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市浸剩,隨后出現(xiàn)的幾起案子钾军,更是在濱河造成了極大的恐慌,老刑警劉巖绢要,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吏恭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡重罪,警方通過(guò)查閱死者的電腦和手機(jī)樱哼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)剿配,“玉大人搅幅,你說(shuō)我怎么就攤上這事『襞撸” “怎么了茄唐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蝇更。 經(jīng)常有香客問(wèn)我沪编,道長(zhǎng),這世上最難降的妖魔是什么簿寂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮宿亡,結(jié)果婚禮上常遂,老公的妹妹穿的比我還像新娘。我一直安慰自己挽荠,他們只是感情好克胳,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布平绩。 她就那樣靜靜地躺著,像睡著了一般漠另。 火紅的嫁衣襯著肌膚如雪捏雌。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天笆搓,我揣著相機(jī)與錄音性湿,去河邊找鬼。 笑死满败,一個(gè)胖子當(dāng)著我的面吹牛肤频,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播算墨,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宵荒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了净嘀?” 一聲冷哼從身側(cè)響起报咳,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挖藏,沒(méi)想到半個(gè)月后暑刃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡熬苍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年稍走,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柴底。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婿脸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出柄驻,到底是詐尸還是另有隱情狐树,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布鸿脓,位于F島的核電站抑钟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏野哭。R本人自食惡果不足惜在塔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拨黔。 院中可真熱鬧蛔溃,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至麸塞,卻和暖如春秃臣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哪工。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工奥此, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人正勒。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓得院,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親章贞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祥绞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,506評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件鸭限、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評(píng)論 4 62
  • 我作為妻子養(yǎng)了家這么久朴皆。他沒(méi)有把我的支出單列出來(lái),只是習(xí)慣于向我索取泛粹。今天女兒對(duì)我的分析我很吃驚遂铡。女兒在為我考慮,...
    lygly9閱讀 182評(píng)論 0 0
  • (天上亮起了火樹(shù)銀花晶姊,茉雪和承夜走在街上) 茉雪:誒扒接,今天為什么要放煙花啊们衙? 承夜(翻看了下手機(jī)):今天4月1日钾怔,...
    易若清流閱讀 284評(píng)論 0 0
  • 你嫁衣如血灼傷了天涯, 從此烙印我心上永如朱砂 執(zhí)子之手蒙挑,與子偕老
    王徽閱讀 502評(píng)論 1 2