Android仿QQ空間頂部條背景變化效果
本文給大家分享仿QQ空間頁面頂部條隨界面滑動(dòng)背景透明度變化的效果,這個(gè)效果在其他應(yīng)用程序中也很常見,技能+1。
一、上代碼,具體實(shí)現(xiàn)
筆者之前的文章第二部分總是二話不說,直接上代碼,很干脆,其實(shí)更好的方式是引導(dǎo)讀者思考:這個(gè)效果如何實(shí)現(xiàn)。前期做好效果的功能分析,才能讀者更好的理解。
QQ空間的這個(gè)頁面其實(shí)并不復(fù)雜,我們看看QQ空間的演示界面:

可以看見,整個(gè)頁面其實(shí)只有兩個(gè)根元素,一個(gè)是ListView,一個(gè)是標(biāo)題欄,前者可以上下滑動(dòng),給用戶呈現(xiàn)內(nèi)容;后者固定位置不動(dòng),類似于一個(gè)導(dǎo)航欄,左邊一個(gè)返回鍵圖標(biāo),中間一段文字,右邊一個(gè)內(nèi)容添加圖標(biāo),與用戶進(jìn)行交互。那么我們要自定義的View是哪一個(gè),明顯是樣式變化的ListView,因?yàn)樗L(zhǎng)的和普通的ListView不一樣,“誰家的ListView頂個(gè)黑色矩形做頭部”
①自定義View代碼段——核心代碼段
package com.example.administrator.myview;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
/**
* Created by Administrator on 2018/4/3 0003.
* 拿到ListView滾動(dòng)事件
* 拿到高度變化
* 根據(jù)高度變化,設(shè)置頂部條的背景
* powered by Cpf.com.
*/
public class ScrollChangeHeadView extends ListView {
private View viewHead;
private View topBar;
public ScrollChangeHeadView(Context context,AttributeSet attrs) {
super(context,attrs);
viewHead = LayoutInflater.from(context).inflate(R.layout.scroll_change_head,null);
addHeaderView(viewHead);//這個(gè)addHeaderView
setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (topBar != null) {
//滾動(dòng)中
int headTop = viewHead.getTop();
headTop = Math.abs(headTop);
//0-255 0是全透明 255是不透明
topBar.getBackground().setAlpha(headTop);
}
}
});
}
//人為的構(gòu)造一個(gè)方法,用來傳值,主類獲取對(duì)象實(shí)例之后,通過自定義的這個(gè)方法把對(duì)象傳入第二類,然后第二類才能做事
public void setTopBar(View v){
topBar = v;
}
}
本段代碼是核心代碼段:我們?cè)谶@段代碼里做了最關(guān)鍵的三件事:
1)拿到在自定義View內(nèi)部拿到ListView的滾動(dòng)事件;
2)在滾動(dòng)事件里面拿到矩形頭部的高度變化;
3)根據(jù)矩形頭部的高度變化,設(shè)置頂部條的背景;
在其中,還涉及了幾個(gè)方法,這里簡(jiǎn)單講解一下,幫助讀者理解,1) addHeaderView(),這個(gè)方法是ListView中方法,作用就是Add a fixed view to appear at the top of the list.為L(zhǎng)istView的頂部部分增加一個(gè)頂部矩形;2)getTop(),這個(gè)方法是View中的方法,作用就是Top position of this view relative to its parent.,作用就是獲得一個(gè)View的高度,在滾動(dòng)事件里調(diào)用這個(gè)方法,就可以不斷得到View的高度數(shù)據(jù),以便于當(dāng)做參數(shù)值傳入setAlpha()方法中。
②自定義View的XML布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="#0f0c2f"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是head"
android:textColor="#fff" />
</LinearLayout>
</LinearLayout>
這個(gè)布局文件里面,我們?cè)O(shè)置了添加進(jìn)ListView的頂部部分的樣式,也就是矩形的樣式,便于顯示,這里的顏色設(shè)置為何QQ空間的頂部背景色一樣。
③主布局XML文件中引入自定義布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.myview.MainActivity">
<com.example.administrator.myview.ScrollChangeHeadView
android:id="@+id/schv"
android:layout_width="match_parent"
android:layout_height="match_parent"></com.example.administrator.myview.ScrollChangeHeadView>
<LinearLayout
android:id="@+id/topBar"
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="#12b7f5"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="QQ空間"
android:textColor="#fff"/>
</LinearLayout>
</RelativeLayout>
主布局文件中引入了自定義的LlstView,然后再在后面布局了一個(gè)LinerLayout,作為頂部條的裝載容器,放入一個(gè)TextView,用于顯示頂部條文字。
④主Activity代碼段
package com.example.administrator.myview;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout topBar = (LinearLayout) findViewById(R.id.topBar);
ScrollChangeHeadView schv = (ScrollChangeHeadView) findViewById(R.id.schv);
schv.setTopBar(topBar);
schv.setAdapter(new BaseAdapter() {
@Override
public int getCount() {
return 100;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv = new TextView(MainActivity.this);
tv.setText("+"+position);
return tv;
}
});
}
}
主Activity中,我們獲取到了兩個(gè)控件,1)然后給自定義的ListView設(shè)置適配器和簡(jiǎn)單的傳入數(shù)據(jù);2)接著把頂部條的實(shí)例對(duì)象topBar獲取到,作為參數(shù)傳入到自定義控件里面去。
運(yùn)行效果如下:

小結(jié):本節(jié)內(nèi)容主要是實(shí)現(xiàn)了一個(gè)仿QQ空間頂部條隨滾動(dòng)事件發(fā)生而背景變化的效果,在應(yīng)用程序中的使用率蠻高,還有一些其他的對(duì)于頂部條的處理,其實(shí)現(xiàn)方式其實(shí)都比較類似,比如下面這個(gè)“廚房故事”(2016年谷歌Material Design設(shè)計(jì)獎(jiǎng)獲得者)的應(yīng)用程序(筆者用的是最新版本),其頂部條的變化,我們也可以運(yùn)用上面的方法,進(jìn)行實(shí)現(xiàn),效果是頂部條隨滾動(dòng)事件的發(fā)生而出現(xiàn)或者隱藏。有興趣的讀者,可以參考筆者的代碼進(jìn)行實(shí)現(xiàn)。

總結(jié)
以上所述是小編給大家介紹的Android仿QQ空間頂部條背景變化效果,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Android仿QQ空間動(dòng)態(tài)界面分享功能
- Android開發(fā)仿QQ空間根據(jù)位置彈出PopupWindow顯示更多操作效果
- Android仿新浪微博/QQ空間滑動(dòng)自動(dòng)播放視頻功能
- Android基于ListView實(shí)現(xiàn)類似QQ空間的滾動(dòng)翻頁與滾動(dòng)加載效果
- Android ScrollView滑動(dòng)實(shí)現(xiàn)仿QQ空間標(biāo)題欄漸變
- Android UI設(shè)計(jì)系列之自定義ListView仿QQ空間阻尼下拉刷新和漸變菜單欄效果(8)
- Android仿QQ空間底部菜單示例代碼
- Android仿QQ空間主頁面的實(shí)現(xiàn)
相關(guān)文章
Android集成騰訊X5實(shí)現(xiàn)文檔瀏覽功能
Android內(nèi)部沒有控件來直接顯示文檔,跳轉(zhuǎn)WPS或其他第三方文檔App體驗(yàn)性不好,使用騰訊X5內(nèi)核能很好的解決的這一問題這篇文章主要介紹了Android集成騰訊X5實(shí)現(xiàn)文檔瀏覽功能,需要的朋友可以參考下2019-10-10
基于App自適應(yīng)draw9patch不失真背景的方法詳解
本篇文章是對(duì)App自適應(yīng)draw9patch不失真背景的方法進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下2013-05-05
Android 實(shí)現(xiàn)仿支付寶的密碼均分輸入框
這篇文章主要介紹了Android 實(shí)現(xiàn)仿支付寶的密碼均分輸入框的相關(guān)資料,需要的朋友可以參考下2017-06-06
Android應(yīng)用中使用XmlSerializer序列化XML數(shù)據(jù)的教程
這篇文章主要介紹了Android應(yīng)用中使用XmlSerializer序列化XML數(shù)據(jù)的教程,XmlSerializer序列化XML同時(shí)也是將數(shù)據(jù)寫為XML格式的基本方法,需要的朋友可以參考下2016-04-04
android studio集成unity導(dǎo)出工程的實(shí)現(xiàn)
本文主要介紹了android studio集成unity導(dǎo)出工程的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
Android獲取系統(tǒng)儲(chǔ)存以及內(nèi)存信息的方法(一)
這篇文章主要為大家詳細(xì)介紹了Android獲取系統(tǒng)儲(chǔ)存以及內(nèi)存信息的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Android ServiceManager的啟動(dòng)和工作原理
這篇文章主要介紹了Android ServiceManager的啟動(dòng)和工作原理,幫助大家更好的理解和學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下2021-03-03
Android向node.js編寫的服務(wù)器發(fā)送數(shù)據(jù)并接收請(qǐng)求
這篇文章主要為大家詳細(xì)介紹了Android向node.js編寫的服務(wù)器發(fā)送數(shù)據(jù),并接收請(qǐng)求,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10

