public class MyScrollView extends ScrollView { private OnScrollViewListener mOnScrollViewListener; public MyScrollView(Context context) { super(context); } public MyScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } /** * 添加回調接口,便於把滑動事件的數據向外拋 */ public interface OnScrollViewListener { void onScrollViewListener(int l, int t, int oldl, int oldt); } /** * 註冊回調接口監聽事件 * * @param onScrollViewListener */ public void setOnScrollViewListener(OnScrollViewListener onScrollViewListener) { this.mOnScrollViewListener = onScrollViewListener; } /** * * @param l Current horizontal scroll origin. 當前滑動的x軸位置 * @param t Current vertical scroll origin. 當前滑動的y軸位置 * @param oldl Previous horizontal scroll origin. 上一次滑動的x軸位置 * @param oldt Previous vertical scroll origin. 上一次滑動的y軸位置 */ @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); if (mOnScrollViewListener != null) { //將監聽到的數據向外拋 mOnScrollViewListener.onScrollViewListener(l, t, oldl, oldt); } } }
自定義一個scrollView,ide
xml使用注意事項:this
在scrollView中所包裹的必須是LinearLayout,因此務必用LinearLayout對其進行包裹server
使用:xml
my_scroll.setOnScrollViewListener(this);
img_bg.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mHeight = img_bg.getHeight(); } });
設置高度時,需設置ViewTree監聽,防止沒有拿到實際高度接口
/** * @param l Current horizontal scroll origin. 當前滑動的x軸位置 * @param t Current vertical scroll origin. 當前滑動的y軸位置 * @param oldl Previous horizontal scroll origin. 上一次滑動的x軸位置 * @param oldt Previous vertical scroll origin. 上一次滑動的y軸位置 */ @Override public void onScrollViewListener(int l, int t, int oldl, int oldt) { if (t <= mHeight) { //頂部設置可見性 title.setVisibility(View.INVISIBLE); } else if (t > mHeight && t < (mHeight ) && (t > oldt)) { //滑動過程當中,漸變 Animation animation = new AlphaAnimation(0.1f, 1.0f); animation.setDuration(1000); animation.setFillAfter(true); title.startAnimation(animation); animation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { animation.cancel(); title.clearAnimation(); } @Override public void onAnimationRepeat(Animation animation) { } }); } else { //過頂部圖區域設置可見性 title.setVisibility(View.VISIBLE); title.setBackgroundColor(Color.BLACK); } }
本篇文章參考與 https://www.jianshu.com/p/ec0d4a73c970 小菜鳥一枚,請你們多多指教事件