Scrollview总结:滑动问题、监听Scrollview实现头部局改变

时间:2022-08-10 05:04:44

ScrollView就是一个可以滚动的View,这个滚动的方向是垂直方向的,而HorizontalScrollView则是一个水平方向的可以滚动的View。

ScrollView的简单介绍

ScrollView和HorizontalScrollView只是两种滚动方向不同的View而已,其他方面都基本相同,所以下面只单单以ScrollView来介绍。

ScrollView必须有一个确定的高度才能正常工作,因为它实际上所做的就是将一系列不确定高度的子组件装进一个确定高度的容器(通过滚动操作)。

要给一个ScrollView确定一个高度的话,要么直接给它设置高度(不建议),要么确定所有的父容器都已经绑定了高度。

下面来说说我遇到的问题:

一、嵌套listview

因为scrollview嵌套listview会出现冲突

所以我们得自定义Listview

public class MyListViewForScrollView extends ListView{
public MyListViewForScrollView(Context context) {
super(context);
} public MyListViewForScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
} public MyListViewForScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
} /**
* 只需要重写这个方法即可
计算listview最大高度
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = View.MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
View.MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}

布局文件

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical">
//这里用我们自定义的listview
<ky.eyepetizer.com.ky.ListViewForScrollView
android:id="@+id/lv_hot_author"
android:layout_width="match_parent"
android:layout_height="wrap_content"></ky.eyepetizer.com.ky.ListViewForScrollView> </RelativeLayout>
</ScrollView>

找控件:

lv_hot_author = (ListViewForScrollView) view.findViewById(R.id.lv_hot_author);

之后使用listview和适配器还是一样的,这里就不做描述了。

二、嵌套GrideViwe同Listview

public class NoScrollGridView extends GridView {
public NoScrollGridView(Context context) {
super(context);
} public NoScrollGridView(Context context, AttributeSet attrs) {
super(context, attrs);
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}

三、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 setScrollViewListener(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) {
scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
}
}
public interface ScrollViewListener { void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy); }
}

1.implements ObservableScrollView.ScrollViewListener
2.sv_my = (ObservableScrollView) findViewById(R.id.sv_my);
sv_my.setScrollViewListener(this);
3.计算透明度方法根据需要自定义

@Override
public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) {
float alpha = 0;
if (lin_top != null) {
if (y >= UnitSociax.dip2px(context, 100)) {
alpha = 1;
} else {
alpha = y / (UnitSociax.dip2px(context, 100)*1.0f);
}
lin_top.setAlpha(alpha);
} }

BY 磊磊Tua