先直接上圖看效果:
WeChat_20170916214217_20170916214334.gif
項目需求:
滑動的時候標題漸變顏色浑塞,并且左右兩邊的圖片漸變切換郑叠。并且Toolbar能夠懸浮置頂膏燕,查閱了一些資料有用ScrollView實現(xiàn) 有用CoordinatorLayout +AppBarLayout +CollapsingToolbarLayout +Toolbar 實現(xiàn)第焰,沒錯我用的就是后者咽袜,其實實現(xiàn)了也就是這么回事,蠻簡單的盅视。
所以寫下博客捐名,一個是幫助其他小伙伴,另外一個是記錄下自己的菜鳥成長之路吧闹击。也決定之后有空了,把自己過去在項目中遇到的問題都記錄下來镶蹋,做成筆記。
實現(xiàn)原理:
為什么要用CoordinatorLayout CollapsingToolbarLayout是用來對Toolbar進行再次包裝的ViewGroup,主要是用于實現(xiàn)折疊(其實就是看起來像伸縮~)的App Bar效果贺归。它需要放在AppBarLayout布局里面淆两,并且作為AppBarLayout的直接子View。就不做過多解釋了不懂的可以看下這邊文章 玩轉(zhuǎn)AppBarLayout更酷炫的頂部欄
貼上代碼:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="ShopDetailsAcitvity"
type="com.example.youjia.shopping.MainActivity" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/toolbar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#f7f7f7"
app:contentScrim="?attr/colorPrimary"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/view"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/banner_layout"
android:layout_width="match_parent"
android:layout_height="264dp"
android:orientation="vertical">
<com.youth.banner.Banner
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:image_scale_type="center_crop"
app:indicator_drawable_selected="@mipmap/banner_red"
app:indicator_drawable_unselected="@mipmap/banner_grey"
app:indicator_height="9dp"
app:indicator_margin="3dp"
app:indicator_width="9dp"
app:is_auto_play="true" />
<View
style="@style/View"
android:layout_alignParentBottom="true" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/relativelayout_goods"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/banner_layout"
android:background="@color/white"
android:gravity="center_vertical"
android:paddingBottom="12dp"
android:paddingLeft="13.3dp"
android:paddingRight="13.3dp"
android:paddingTop="12dp">
<TextView
android:text="祿福來精品翡翠"
android:id="@+id/shop_details_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lineSpacingExtra="5dp"
android:textColor="#282828"
android:textSize="16sp" />
<TextView
android:text="¥399.00"
android:id="@+id/shop_details_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/shop_details_1"
android:layout_marginTop="10dp"
android:textColor="#e75446"
android:textSize="16sp" />
<TextView
android:text="原價¥500.00"
android:id="@+id/shop_details_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/shop_details_2"
android:layout_marginTop="10dp"
android:textColor="#999999"
android:textSize="12sp" />
<!--android:layout_alignBottom="@+id/shop_details_2"-->
<TextView
android:text="月銷8238筆"
android:id="@+id/sumSotre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:textColor="#656565"
android:textSize="14sp" />
</RelativeLayout>
<LinearLayout
android:id="@+id/linearLayout_goods"
android:layout_width="match_parent"
android:layout_height="46.3dp"
android:layout_alignParentStart="true"
android:layout_below="@+id/relativelayout_goods"
android:layout_marginTop="19dp"
android:background="@drawable/ripple_item_white_bg"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="13dp"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="選擇:商品規(guī)格"
android:textColor="#282828"
android:textSize="15.3sp" />
<View style="@style/View" />
</LinearLayout>
</RelativeLayout>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbaretail"
android:layout_width="match_parent"
android:layout_height="70dp"
app:layout_collapseMode="pin"
android:fitsSystemWindows="true"
android:paddingTop="15dp"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark" >
<ImageView
android:src="@mipmap/share_shop"
android:id="@+id/share_img"
android:layout_gravity="center|right"
android:layout_marginRight="15dp"
android:layout_marginTop="5dp"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
</android.support.v7.widget.Toolbar>
</android.support.design.widget.CollapsingToolbarLayout>
<android.support.design.widget.TabLayout
android:id="@+id/infoPhoneTabLayou"
app:tabTextColor="#989898"
app:tabSelectedTextColor="#e91b04"
app:tabIndicatorColor="@color/tablayout"
app:tabBackground="@drawable/ripple_tab_bg"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</android.support.design.widget.TabLayout>
<View
android:background="@color/view"
android:layout_width="match_parent"
android:layout_height="1dp"/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:id="@+id/NestedScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="always"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<com.example.youjia.shopping.WrapContentHeightViewPager
android:id="@+id/infoPhone_Fragment_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:background="@color/white"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1.2"
android:background="@drawable/ripple_item_white_bg"
android:drawablePadding="2dp"
android:drawableTop="@mipmap/shop_details_3"
android:gravity="center_horizontal"
android:text="店鋪"
android:textColor="#656565"
android:textSize="10sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1.2"
android:background="@drawable/ripple_item_white_bg"
android:drawablePadding="2dp"
android:drawableTop="@mipmap/shop_details_4"
android:gravity="center_horizontal"
android:text="進貨單"
android:textColor="#656565"
android:textSize="10sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:background="#ff6554"
android:drawablePadding="5dp"
android:gravity="center"
android:text="加入進貨單"
android:textColor="#ffffff" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:background="#ff334c"
android:drawablePadding="5dp"
android:gravity="center"
android:text="立即采購"
android:textColor="#ffffff" />
</LinearLayout>
</LinearLayout>
</layout>
package com.example.youjia.shopping;
import android.databinding.DataBindingUtil;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import com.example.youjia.shopping.databinding.ActivityMainBinding;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding mBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
mBinding.setShopDetailsAcitvity(this);
mBinding.shopDetails3.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG);
TabLayout();
initBanner();
setToolBar();
}
/**
* 初始化輪播圖
*/
private void initBanner() {
List<Integer> integers = new ArrayList<>();
integers.add(R.drawable.img1);
integers.add(R.drawable.img2);
integers.add(R.drawable.img3);
// integers.add(R.drawable.img4);
// integers.add(R.drawable.img5);
// integers.add(R.drawable.img6);
// integers.add(R.drawable.img7);
mBinding.banner.startAutoPlay();
mBinding.banner.setDelayTime(2000);
mBinding.banner.setImages(integers).setImageLoader(new GlideImageLoader()).start();
}
/**
* 初始化setToolBar
*/
private void setToolBar(){
setSupportActionBar(mBinding.toolbaretail);
mBinding.toolbaretail.setTitleTextColor(Color.WHITE);
mBinding.toolbarLayout.setTitleEnabled(false);
mBinding.toolbarLayout.setExpandedTitleGravity(Gravity.CENTER);//設置展開后標題的位置
mBinding.toolbarLayout.setCollapsedTitleGravity(Gravity.CENTER);//設置收縮后標題的位置
mBinding.toolbarLayout.setExpandedTitleColor(Color.WHITE);//設置展開后標題的顏色
mBinding.toolbarLayout.setCollapsedTitleTextColor(Color.WHITE);//設置收縮后標題的顏色
mBinding.appBar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
//verticalOffset 當前偏移量 appBarLayout.getTotalScrollRange() 最大高度 便宜值
int Offset = Math.abs(verticalOffset); //目的是將負數(shù)轉(zhuǎn)換為絕對正數(shù)拂酣;
//標題欄的漸變
mBinding.toolbaretail.setBackgroundColor(changeAlpha(getResources().getColor(R.color.redcustom)
, Math.abs(verticalOffset * 1.0f) / appBarLayout.getTotalScrollRange()));
/**
* 當前最大高度便宜值除以2 在減去已偏移值 獲取浮動 先顯示在隱藏
*/
if (Offset < appBarLayout.getTotalScrollRange() / 2) {
mBinding.toolbaretail.setTitle("");
mBinding.toolbaretail.setAlpha((appBarLayout.getTotalScrollRange() / 2 - Offset * 1.0f) / (appBarLayout.getTotalScrollRange() / 2));
mBinding.shareImg.setAlpha((appBarLayout.getTotalScrollRange() / 2 - Offset * 1.0f) / (appBarLayout.getTotalScrollRange() / 2));
mBinding.shareImg.setImageDrawable(getResources().getDrawable(R.mipmap.share_shop));
mBinding.toolbaretail.setNavigationIcon(R.mipmap.shop_details_2);
/**
* 從最低浮動開始漸顯 當前 Offset就是 appBarLayout.getTotalScrollRange() / 2
* 所以 Offset - appBarLayout.getTotalScrollRange() / 2
*/
} else if (Offset > appBarLayout.getTotalScrollRange() / 2) {
float floate = (Offset - appBarLayout.getTotalScrollRange() / 2) * 1.0f / (appBarLayout.getTotalScrollRange() / 2);
mBinding.toolbaretail.setAlpha(floate);
mBinding.shareImg.setAlpha(floate);
mBinding.toolbaretail.setNavigationIcon(R.mipmap.image_left);
mBinding.shareImg.setImageDrawable(getResources().getDrawable(R.mipmap.img_share));
mBinding.toolbaretail.setTitle("祿福來精品翡翠");
mBinding.toolbaretail.setAlpha(floate);
}
}
});
}
/**
* 根據(jù)百分比改變顏色透明度
*/
public int changeAlpha(int color, float fraction) {
int alpha = (int) (Color.alpha(color) * fraction);
return Color.argb(alpha, 0, 128, 0);
}
/**TabLayout
* 初始化
*/
private void TabLayout(){
List<String>list_Title = new ArrayList<>();
list_Title.add("圖文詳情");
list_Title.add("規(guī)格參數(shù)");
List<Fragment> fragmentList = new ArrayList<>();
fragmentList.add(new Fragment1());
fragmentList.add(new Fragment2());
mBinding.infoPhoneFragmentPager.setAdapter(new HomeFragmentPageAdapter(getSupportFragmentManager(),fragmentList,list_Title,2));
mBinding.infoPhoneTabLayou.setTabMode(TabLayout.MODE_FIXED);
mBinding.infoPhoneTabLayou.setupWithViewPager(mBinding.infoPhoneFragmentPager);
}
}
漸變核心實現(xiàn)AppBarLayout.addOnOffsetChangedListener監(jiān)聽
通過verticalOffset 拿到當前的當前偏移量,appBarLayout.getTotalScrollRange() 是最大高度 偏移值 有了這兩個參數(shù)我們就可以計算 浮度
是不是感覺很簡單呢到此就結(jié)束了秋冰,在此奉上源碼點擊下載
有更好的方式或者需要改進的地方請給我留言,大家共同學習進步婶熬。
圖片是一個做微商朋友提供的剑勾,要是需要玉的話可以給我留言。就當給他推廣推廣啦