1. 程式人生 > >ScrollView 實現子視圖滑動到頂部時固定不動

ScrollView 實現子視圖滑動到頂部時固定不動

test you () lap creat psi 的人 log 控件

這個,個人建議使用自己寫的布局使用view的gon或者visble的方法,使用design包中的控件來的話,局限性很大

方法有倆

(1)自定義ScrollView

重寫ScrollView 的 computeScroll()方法 監聽滑動,然後去判斷你想要的布局是否已經到了頂部,如果到了,其實我最開始就寫了兩個一模一樣的布局一個放在屏幕的最上方只不過一直是隱藏的這個時,就需要把它顯示出來就可以了

public class MScrollView extends ScrollView {  
  
    View v1;  
    View v2;  
  
    public MScrollView(Context context) {  
        
super(context); init(); } public MScrollView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public MScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); init(); } private void init() { v2 = findViewById(R.id.Weekend2); } public void setV1(View v1) { this.v1 = v1; } @Override
public void computeScroll() { if (getScrollY() >= v2.getTop()) { v1.setVisibility(View.VISIBLE); } else { v1.setVisibility(View.GONE); } super.computeScroll(); } }

<?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:background="#ffffff">  
  
    <com.example.vsat.test.MScrollView  
        android:id="@+id/scrollView"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:fillViewport="true">  
  
        <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:layout_margin="10dp"  
                android:gravity="center"  
                android:text="星期一" />  
  
            <TextView  
                android:layout_width="match_parent"  
                android:layout_height="wrap_content"  
                android:layout_margin="10dp"  
                android:gravity="center"  
                android:text="星期二" />  
  
            <TextView  
                android:layout_width="match_parent"  
                android:layout_height="wrap_content"  
                android:layout_margin="10dp"  
                android:gravity="center"  
                android:text="星期三" />  
  
            <TextView  
                android:layout_width="match_parent"  
                android:layout_height="wrap_content"  
                android:layout_margin="10dp"  
                android:gravity="center"  
                android:text="星期四" />  
  
            <TextView  
                android:layout_width="match_parent"  
                android:layout_height="wrap_content"  
                android:layout_margin="10dp"  
                android:gravity="center"  
                android:text="星期五" />  
  
            <TextView  
                android:id="@+id/Weekend2"  
                android:layout_width="match_parent"  
                android:layout_height="100dp"  
                android:background="#90C451"  
                android:gravity="center"  
                android:text="餵!你醒醒!再堅持一下,馬上就周末了" />  
  
            <com.example.vsat.test.MListView  
                android:id="@+id/listView"  
                android:layout_width="match_parent"  
                android:layout_height="wrap_content" />  
  
        </LinearLayout>  
  
    </com.example.vsat.test.MScrollView>  
  
    <TextView  
        android:id="@+id/Weekend1"  
        android:layout_width="match_parent"  
        android:layout_height="100dp"  
        android:background="#90C451"  
        android:gravity="center"  
        android:text="餵!你醒醒!再堅持一下,馬上就周末了"  
        android:visibility="gone" />  
</RelativeLayout>  
public class MainActivity extends Activity {  
  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        MScrollView scrollView = (MScrollView) findViewById(R.id.scrollView);  
        MListView listView = (MListView) findViewById(R.id.listView);  
        View v = findViewById(R.id.Weekend1);  
        scrollView.setV1(v);  
        ArrayList<String> list = new ArrayList<>();  
        for (int i = 0; i < 20; i++) {  
            list.add("第" + i + "號機器人");  
        }  
  
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(  
                this,  
                android.R.layout.simple_expandable_list_item_1,  
                list);  
        listView.setAdapter(adapter);  
        listView.setFocusable(false);  
    }  
  
}  

(2)這種只是給無奈用了design的人使用的

附上鏈接:http://www.jianshu.com/p/abdb9828a00d

    1. 將需要懸浮的layout放到CollapsingToolbarLayout之外,AppBarLayout之內
    2. 將CollapsingToolbarLayout的app:layout_scrollFlags設置為scroll
    3. 給滾動的NestedScroolView設置
      app:layout_behavior="@String/appbar_scrolling_view_behavior"
      就大功告成了(記得根布局要是CoordinatorLayout)

這種方法如果是要固定下拉列表等等比較復雜的布局,就會很是尷尬

ScrollView 實現子視圖滑動到頂部時固定不動