<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
通常,我們會被要求實現類似支付寶首頁的特效:隨著介面的滑動,標題列的背景透明度漸變。
在實際開發中,常見的滑動有列表RecyclerView(ListView)滑動,NestedScrollView(ScrollView)巢狀滑動等等。
本文主要從上述兩方面來探討滑動效果。
廢話不多說,直接擼程式碼:
佈局檔案如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:background="@color/white" tools:context=".scroll_toolbar.ScrollToolBarActivity"> <!-- title標題列--> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white"> <ImageView android:id="@+id/ivBack" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="@dimen/qb_px_20" android:gravity="center_vertical" android:src="@drawable/theme_toolbar_btn_back_fg_normal0" android:textColor="#ffffff" /> <TextView android:id="@+id/tvName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#666666" android:textSize="16sp" android:padding="@dimen/qb_px_20" android:text="RecyclerView控制titleBar漸變"/> </android.support.v7.widget.Toolbar> <android.support.v7.widget.RecyclerView android:id="@+id/rvZhangjie" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_marginLeft="@dimen/qb_px_50" android:layout_marginRight="@dimen/qb_px_50" android:layout_marginTop="@dimen/qb_px_20" android:background="@color/back_ground"/> </LinearLayout>
Java程式碼如下:
private void toolBarColor(){ Toolbar toolbar = findViewById(R.id.toolbar); ImageView ivBack = findViewById(R.id.ivBack); TextView tvName = findViewById(R.id.tvName); RecyclerView rvZhangjie = findViewById(R.id.rvZhangjie); List<String> stringList = dealData(); ScrollAdapter scrollAdapter = new ScrollAdapter(this, stringList); LinearLayoutManager manager = new LinearLayoutManager(this); manager.setOrientation(LinearLayoutManager.VERTICAL); rvZhangjie.setLayoutManager(manager); rvZhangjie.setAdapter(scrollAdapter); rvZhangjie.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { //toolbar的高度 toolbarHeight = toolbar.getBottom(); //滑動的距離 mDistanceY += dy; //當滑動的距離 <= toolbar高度的時候,改變Toolbar背景色的透明度,達到漸變的效果 if (mDistanceY <= toolbarHeight) { float scale = (float) mDistanceY / toolbarHeight; float alpha = scale * 255; toolbar.setBackgroundColor(Color.argb((int) alpha, 255, 0, 0)); } else { //上述雖然判斷了滑動距離與toolbar高度相等的情況,但是實際測試時發現,標題列的背景色 //很少能達到完全不透明的情況,所以這裡又判斷了滑動距離大於toolbar高度的情況, //將標題列的顏色設定為完全不透明狀態 toolbar.setBackgroundResource(R.color.colorPrimary); } } }); }
上面程式碼中的 dealData()方法很簡單就是想一個String型List裡面新增資料,沒什麼難度。
關鍵點在於給rvZhangjie.addOnScrollListener()也就是給RecyclerView設定滑動監聽,並複寫onScrolled()方法。該方法裡面3個引數:
第一個RecyclerView recyclerView,這個很明顯就是目標RecyclerView;
第二個int dx,表示RecyclerView在水平X方向的相對滑動量;
第三個int dy,表示RecyclerView在垂直Y方向的相對滑動量;
我們可以通過累加計算RecyclerView滑動的距離相對於指定距離的百分比,來計算透明度的變化量:
mDistanceY += dy; float scale = (float) mDistanceY / toolbarHeight; float alpha = scale * 255;
最後再將alpha透明度值設定給ToolBar:
toolbar.setBackgroundColor(Color.argb((int) alpha, 255, 0, 0));
其實NestedScrollView滑動漸變和RecyclerView的滑動漸變原理是一樣的,本質上都是監聽View滑動的距離,通過距離換算成透明度值。只不過二者的滑動偏移量稍有點不同。
程式碼細節我就不貼出來了,就說說關鍵的對NestedScrollView的監聽和偏移量的處理:
nsvScroolBack.setOnScrollChangeListener(new View.OnScrollChangeListener() { @Override public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { //scrollY > oldScrollY:向上滑動 //scrollY < oldScrollY:向下滑動 // scrollY:捲動過的距離。 toolbarHeight = toolbar.getBottom() * 1.5f; if (scrollY <= toolbarHeight){ float scale = (float)scrollY / toolbarHeight; float alpha =scale * 255; toolbar.setBackgroundColor(Color.argb((int) alpha, 255, 0, 0)); }else { toolbar.setBackgroundColor(Color.BLUE); } } });
通過上面的程式碼,很容易發現NestedScrollView滑動漸變和RecyclerView的滑動漸變就一回事。程式碼實現上差別很細微。不同的是RecyclerView的滑動漸變哪裡,我們要通過對dy的累加來獲得RecyclerView在垂直方向的滑動偏移量。而在NestedScrollView的滑動漸變裡面,NestedScrollView在x或者y方向的滑動偏移量,系統已經幫我們計算出來了:scrollX或者scrollY。然後進行透明度的計算即可。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45