ScrollView滑动悬停效果

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值