ListView、ExpandableListView和ScrollView滑动悬停效果是开发需求中经常遇到的效果,最近的开发需求刚好碰到了ScrollView悬停效果,效果类似于listview的列表效果,但是最终还是选择了用ScrollView
来实现,因为每个条目中又包含了不同的控件,有edittext、textview、imageview等,特别是edittext这个控件,在listview中当虚拟键盘弹起的时候,edittext的焦点以及数据复用问题,还有就是Android虚拟键盘适配等问题不太好解决,所以还是用ScrollView来实现,其实最主要的是监听ScrollView滑动,在ScrollView滑动的时候获取到布局的高度,进行计算,跟进计算的结果改变悬念条目的显示;以下为代码实现:
public interface ScrollViewListener {
void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);
}
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);
}
}
}
这里是一个自定义的ScrollView主要是重写之前的滑动事件的监听,如果直接用google定义好的也可以,但是会存在一个版本兼容的问题,23(含23)和23以下的监听方法会不一样,所以做了下处理;这时在activity中获取到相应的控件,同时得到相应控件的高度;
/**
* 获取控件的宽度和高度
* @param layout
* @return
*/
private int getLayoutH(LinearLayout layout){
int w = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
layout.measure(w, h);
int height = layout.getMeasuredHeight();
return height;
}
返回的是相应控件的高度;这里还可以通过监测视图树的方式获取高度;
最后对ScrollView进行滑动监听,计算滑动值,根据值进行悬浮条目的显示即可;
//ScrollView滑动监听
ss.setOnScrollChangeListener(new OnScrollChangeListener() {
@Override
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
//根据项目的需要进行计算
if (scrollY<(nameH+dip2px(MainActivity.this, 40))) {//姓名
tv_c.setText("客户信息");
}else if(scrollY>=(nameH+dip2px(MainActivity.this, 40))&&scrollY<(nameH+houseH)){
tv_c.setText("购房意向");
}else if(scrollY>=(nameH+houseH)){
tv_c.setText("评估信息");
}
}
});
以上为实现方式,效果如下:
源码:http://download.csdn.net/detail/wangwo1991/9786858