import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; import com.titlebargradient.R; import com.titlebargradient.widget.ObservableScrollView; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; public class ScrollViewActivity extends AppCompatActivity { @BindView(R.id.iv_back) ImageView ivBack; @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.scrollView) ObservableScrollView scrollView; @BindView(R.id.lv_bottom) LinearLayout lvBottom; @BindView(R.id.iv_more) ImageView ivMore; @BindView(R.id.iv_shopping_cart) ImageView ivShoppingCart; @BindView(R.id.content) LinearLayout content; @BindView(R.id.spite_line) View spiteLine; @BindView(R.id.iv_header) ImageView ivHeader; @BindView(R.id.lv_header) LinearLayout lvHeader; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_scrollview); ButterKnife.bind(this); initView(); } private void initView() { //獲取dimen屬性中 標題和頭部圖片的高度 final float title_height = getResources().getDimension(R.dimen.title_height); final float head_height = getResources().getDimension(R.dimen.head_height); //滑動事件回調監聽(一次滑動的過程一般會連續觸發多次) scrollView.setOnScrollListener(new ObservableScrollView.ScrollViewListener() { @Override public void onScroll(int oldy, int dy, boolean isUp) { float move_distance = head_height - title_height; if (!isUp && dy <= move_distance) {//手指往上滑,距離未超過200dp //標題欄逐漸從透明變成不透明 toolbar.setBackgroundColor(ContextCompat.getColor(ScrollViewActivity.this, R.color.color_orange)); TitleAlphaChange(dy, move_distance);//標題欄漸變 HeaderTranslate(dy);//圖片視差平移 } else if (!isUp && dy > move_distance) {//手指往上滑,距離超過200dp TitleAlphaChange(1, 1);//設置不透明百分比為100%,防止因滑動速度過快,導致距離超過200dp,而標題欄透明度卻還沒變成完全不透的情況。 HeaderTranslate(head_height);//這里也設置平移,是因為不設置的話,如果滑動速度過快,會導致圖片沒有完全隱藏。 ivBack.setImageResource(R.mipmap.ic_back_dark); ivMore.setImageResource(R.mipmap.ic_more_dark); ivShoppingCart.setImageResource(R.mipmap.ic_shopping_dark); spiteLine.setVisibility(View.VISIBLE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { getWindow().setStatusBarColor(Color.RED); } } else if (isUp && dy > move_distance) {//返回頂部,但距離頭部位置大於200dp //不做處理 } else if (isUp && dy <= move_distance) {//返回頂部,但距離頭部位置小於200dp //標題欄逐漸從不透明變成透明 TitleAlphaChange(dy, move_distance);//標題欄漸變 HeaderTranslate(dy);//圖片視差平移 ivBack.setImageResource(R.mipmap.ic_back); ivMore.setImageResource(R.mipmap.ic_more); ivShoppingCart.setImageResource(R.mipmap.ic_shopping_cart); spiteLine.setVisibility(View.GONE); } } }); } private void HeaderTranslate(float distance) { lvHeader.setTranslationY(-distance); ivHeader.setTranslationY(distance/2); } private void TitleAlphaChange(int dy, float mHeaderHeight_px) {//設置標題欄透明度變化 float percent = (float) Math.abs(dy) / Math.abs(mHeaderHeight_px); //如果是設置背景透明度,則傳入的參數是int類型,取值范圍0-255 //如果是設置控件透明度,傳入的參數是float類型,取值范圍0.0-1.0 //這里我們是設置背景透明度就好,因為設置控件透明度的話,返回ICON等也會變成透明的。 //alpha 值越小越透明 int alpha = (int) (percent * 255); toolbar.getBackground().setAlpha(alpha);//設置控件背景的透明度,傳入int類型的參數(范圍0~255) ivBack.getBackground().setAlpha(255 - alpha); ivMore.getBackground().setAlpha(255 - alpha); ivShoppingCart.getBackground().setAlpha(255 - alpha); } @OnClick({R.id.iv_back, R.id.iv_shopping_cart, R.id.iv_more}) public void OnClick(View v) { switch (v.getId()) { case R.id.iv_back: Toast.makeText(this, "點擊了返回按鍵", Toast.LENGTH_SHORT).show(); break; case R.id.iv_shopping_cart: Toast.makeText(this, "點擊了加入購物車", Toast.LENGTH_SHORT).show(); break; case R.id.iv_more: Toast.makeText(this, "點擊了更多按鍵", Toast.LENGTH_SHORT).show(); break; } } @Override protected void onDestroy() { // ButterKnife.unbind(this); super.onDestroy(); } }
import android.content.Context; import android.util.AttributeSet; import android.widget.ScrollView; /** * 自定義監聽滑動的ScrollView */ public class ObservableScrollView extends ScrollView { private ScrollViewListener scrollViewListener = null; 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 setOnScrollListener(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) { if (oldy < y ) {// 手指向上滑動,屏幕內容下滑 scrollViewListener.onScroll(oldy,y,false); } else if (oldy > y ) {// 手指向下滑動,屏幕內容上滑 scrollViewListener.onScroll(oldy,y,true); } } } public interface ScrollViewListener{//dy Y軸滑動距離,isUp 是否返回頂部 void onScroll(int oldy,int dy,boolean isUp); } }
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.titlebargradient.widget.ObservableScrollView android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingTop="250dp"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:padding="8dp" android:textSize="20sp" android:lineSpacingExtra="10dp" android:text="@string/TextContent" android:gravity="center"/> </LinearLayout> </com.titlebargradient.widget.ObservableScrollView> </LinearLayout> <LinearLayout android:id="@+id/lv_header" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ImageView android:id="@+id/iv_header" android:layout_width="match_parent" android:layout_height="@dimen/head_height" android:scaleType="centerCrop" android:layout_gravity="center" android:src="@mipmap/bg_header"/> </LinearLayout> <include layout="@layout/layout_toolbar"/> <LinearLayout android:id="@+id/lv_bottom" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_alignParentBottom="true"> <include layout="@layout/layout_bottom"/> </LinearLayout> </RelativeLayout>
底部布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="48dp" android:layout_height="48dp" android:background="@drawable/bg_square" android:gravity="center" android:padding="8dp" android:layout_gravity="center" android:drawableTop="@mipmap/ic_help" android:drawablePadding="2dp" android:text="客服" android:textSize="11sp" /> <TextView android:layout_width="48dp" android:layout_height="48dp" android:background="@drawable/bg_square" android:gravity="center" android:padding="8dp" android:layout_gravity="center" android:drawableTop="@mipmap/ic_market" android:drawablePadding="2dp" android:text="店鋪" android:textSize="11sp"/> <TextView android:layout_width="48dp" android:layout_height="48dp" android:background="@drawable/bg_square" android:gravity="center" android:padding="8dp" android:layout_gravity="center" android:drawableTop="@mipmap/ic_collection" android:drawablePadding="2dp" android:text="收藏" android:textSize="11sp"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="48dp" android:background="@color/color_orange" android:gravity="center" android:text="加入購物車" android:textColor="@android:color/white"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="48dp" android:background="@color/color_red" android:gravity="center" android:text="立即購買" android:textColor="@android:color/white"/> </LinearLayout>
標題欄布局
<?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="wrap_content" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="@dimen/title_height" android:background="@color/color_transparent"> <!--返回按鈕--> <ImageView android:id="@+id/iv_back" android:layout_width="40dp" android:layout_height="40dp" android:background="@drawable/bg_circle" android:padding="8dp" android:src="@mipmap/ic_back" /> <ImageView android:id="@+id/iv_more" android:layout_width="40dp" android:layout_height="40dp" android:layout_gravity="right" android:layout_marginRight="8dp" android:background="@drawable/bg_circle" android:padding="10dp" android:src="@mipmap/ic_more" /> <ImageView android:id="@+id/iv_shopping_cart" android:layout_width="40dp" android:layout_height="40dp" android:layout_gravity="right" android:layout_marginRight="8dp" android:background="@drawable/bg_circle" android:padding="8dp" android:src="@mipmap/ic_shopping_cart" /> </android.support.v7.widget.Toolbar> <View android:id="@+id/spite_line" android:layout_width="match_parent" android:layout_height="0.8dp" android:background="@color/color_light_gray" android:visibility="gone" /> </LinearLayout>
效果:

