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

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

时间: 2024-10-07 22:39:04

Scrollview总结:滑动问题、监听Scrollview实现头部局改变的相关文章

Android中监听ScrollView滑动停止和滑动到底部

1.监听ScrollView滑动停止: [java] view plaincopy /********************监听ScrollView滑动停止*****************************/ scrollView.setOnTouchListener(new OnTouchListener() { private int lastY = 0; private int touchEventId = -9983761; Handler handler = new Hand

Android监听ScrollView滑动到顶端和底部

MainActivity如下: package cn.testscrollview; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ScrollView; import android.app.Activity; /** * Demo描述: * 监

Android 监听 ScrollView 滑动到最底部。

做产品时,有一个需求,需要监听ScrollView滑动到最底部.在网上找了些方法,都有这样或那样的问题,要不就是监听不精确, 要不就是重复监听,那些代码没有产品化,很不可靠. 经过自己试验,终于找到了个能够精确监听的实现方法.代码如下: 1 public class ScrollBottomScrollView extends ScrollView { 2 3 private OnScrollBottomListener _listener; 4 private int _calCount; 5

ScrollView滑动的监听

ScrollView滑动的监听 有时候我们需要监听ScrollView的滑动事件,来完成业务需求. 第一种: 可以直接实现OnTouchListener接口,在这里面写你所需要的操作 scrollView.setOnTouchListener(new OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_MO

ios监听ScrollView/TableView滚动的正确姿势

主要介绍 监测tableView垂直滚动的舒畅姿势 监测scrollView/collectionView横向滚动的正确姿势 1.监测tableView垂直滚动的舒畅姿势 通常我们用KVO或者在scrollViewDidScroll代理方法中监听ScrollView/TableView的contentOffset,比如监听TableView的contentOffset来设置导航栏的透明度或者拉伸顶部的图片. image image 常见的姿势是在scrollViewDidScroll的代理方法中

Activity中 左滑动返回监听

网易新闻中有个比较炫的效果,在QQ进入聊天界面也有这种效果,就是从界面左侧滑动到右侧时,界面退出,其实功能很容易实现: 1) Activity 去实现 implements OnTouchListener 2) 实现其中的onTouch方法: /** * 左滑动返回监听 */ @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACT

Android开发之手势滑动(滑动手势监听)

在Android应用中,经常需要手势滑动操作,比如上下滑动,或左右方向滑动,处理手势滑动通常有两种方法:一种是单独实现setOnTouchListener监听器来,另一种是构建手势探测器 第一种方法,就是在要实现滑动的View中,实现OnTouchListener监听事件,然后判断KeyDonw和KeyUp 直接的位置距离来判断滑动方向,核心实现代码如下: /** * 设置上下滑动作监听器 * @author caizhiming */ private void setGestureListen

UISwitch的方法和监听文本框的文字改变

1.UISwitch * UISwitch继承自UIControl,因此也能像UIButton一样监听一些事件,比如状态改变事件 * UISwitch可以通过拖线监听状态改变 * UISwitch可以通过addTarget:...方法监听状态改变 - (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; // 其中controlEvents参数传递的是:UICo

Android 监听ScrollView的滑动

我们需要监听ScroView的滑动情况,比如滑动了多少距离,是否滑到布局的顶部或者底部.可惜的是SDK并没有相应的方法,不过倒是提供了一个 protected void onScrollChanged(int l, int t, int oldl, int oldt) 显然这个方法是不能被外界调用的,因此就需要把它暴露出去,解决方式就是写一个接口 /** * Created by 刘楠 on 2016/8/21 0021.17:24 */ public interface ScrollViewL