Android 首頁當ScrollView向上滑動時,設定標題欄的背景透明變化
阿新 • • 發佈:2019-01-03
頁面整個佈局大體上是ScrollView裡面包含了一個ImageView和RecyclerView,所以先得到ImageView的高度,當ScrollView向上滑動時,設定標題欄的背景色、文字顏色,當超過ImageView的高度時,設定其背景為白色,字型為黑色。
重寫ScrollView,獲取手勢滑動距離
ObservableScrollView
import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.ScrollView; public class ObservableScrollView extends ScrollView { private OnScrollChangedListener mOnScrollChangedListener; 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 setOnScrollChangedListener(OnScrollChangedListener onScrollChangedListener) { this.mOnScrollChangedListener = onScrollChangedListener; } @Override protected void onScrollChanged(int x, int y, int oldx, int oldy) { super.onScrollChanged(x, y, oldx, oldy); if (mOnScrollChangedListener != null) { mOnScrollChangedListener.onScrollChanged(this, x, y, oldx, oldy); } } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return false; // 此處為了演示,阻止ScrollView攔截Touch事件 } interface OnScrollChangedListener { void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy); } }
然後是計算滑動高度,設定顏色
int mAlpha = 0; scrollview.setOnScrollChangedListener(new ObservableScrollView.OnScrollChangedListener() { @Override public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) { int minHeight = 50; int maxHeight = rl_userhome_top.getMeasuredHeight(); if (maxHeight == 0) { maxHeight = 500; } if (scrollView.getScrollY() <= minHeight) { mAlpha = 0; } else if (scrollView.getScrollY() > maxHeight) { mAlpha = 255; } else { mAlpha = (scrollView.getScrollY() - minHeight) * 255 / (maxHeight - minHeight); } if (mAlpha <= 0) { tv_title.setTextColor(Color.rgb(255, 255, 255)); iconColorFilter(Color.parseColor("#ffffff")); rl_userhome_title.setBackgroundColor(Color.argb(0, 255, 255, 255)); } else if (mAlpha >= 255) { tv_title.setTextColor(Color.rgb(0, 0, 0)); iconColorFilter(Color.parseColor("#000000")); rl_userhome_title.setBackgroundColor(Color.argb(mAlpha, 255, 255, 255)); } else { tv_title.setTextColor(Color.rgb(255 - mAlpha, 255 - mAlpha, 255 - mAlpha)); iconColorFilter(Color.rgb(255 - mAlpha, 255 - mAlpha, 255 - mAlpha)); rl_userhome_title.setBackgroundColor(Color.argb(mAlpha, mAlpha, mAlpha, mAlpha)); } } });
若導航欄有圖示,修改icon
/**
* 標題欄/導航欄icon 顏色改變
*
* @param color
*/
private void iconColorFilter(int color) {
PorterDuffColorFilter colorFilter = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP);
iv_back.setColorFilter(colorFilter);
}