android 佈局中某一個View 在scroll滑動的時候吸附在頂部
阿新 • • 發佈:2019-01-30
第一個要重寫scroll,要提供滑動監聽的接口出來:
package com.dksj.suctiontopdemo; import android.content.Context; import android.util.AttributeSet; import android.widget.ScrollView; /** * 重構 ScrollView */ public class AbsScrollView extends ScrollView { privateOnScrollListener onScrollListener; public AbsScrollView(Context context) { super(context); } public AbsScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public AbsScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context,attrs, defStyleAttr); } @Override protected int computeHorizontalScrollRange() { return super.computeHorizontalScrollRange(); } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); if (onScrollListener!= null) { onScrollListener.onScroll(t); } } public interface OnScrollListener { void onScroll(int y); } public void setOnScrollListener(OnScrollListener onScrollListener) { this.onScrollListener = onScrollListener; } }
第二部,在佈局中使用重構的scroll:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent"> <com.dksj.suctiontopdemo.AbsScrollView android:id="@+id/mScrollView" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="none"> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:id="@+id/mTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ff00" android:padding="10dp" android:text="Hello World!" android:textColor="#fff" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World!" /> </LinearLayout> <TextView android:id="@+id/mTextViewTop" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ff00" android:padding="10dp" android:text="Hello World!" android:textColor="#fff" /> </FrameLayout> </com.dksj.suctiontopdemo.AbsScrollView> </RelativeLayout>
第三部在activity中使用:
package com.dksj.suctiontopdemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.ViewTreeObserver; import android.widget.RelativeLayout; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements AbsScrollView.OnScrollListener { private AbsScrollView absScrollView; private RelativeLayout activity_main; private TextView mTextView; private TextView mTextViewTop; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); activity_main = (RelativeLayout) findViewById(R.id.activity_main); absScrollView = (AbsScrollView) findViewById(R.id.mScrollView); absScrollView.setOnScrollListener(this); mTextView = (TextView) findViewById(R.id.mTextView); mTextViewTop = (TextView) findViewById(R.id.mTextViewTop); activity_main.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { onScroll(absScrollView.getScrollY()); } }); } @Override public void onScroll(int y) { int top = Math.max(y, mTextView.getTop()); mTextViewTop.layout(0, top, mTextViewTop.getWidth(), top + mTextViewTop.getHeight()); } }