ScrollView 实现子视图滑动到顶部时固定不动

这个,个人建议使用自己写的布局使用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)

这种方法如果是要固定下拉列表等等比较复杂的布局,就会很是尴尬

时间: 2024-11-02 00:26:46

ScrollView 实现子视图滑动到顶部时固定不动的相关文章

tablevView实现惯性滑动到顶部时不反弹

用力下拉tableView,tableView靠惯性滑动,滑动到顶部时不让其有反弹效果.主要原理是在tableView自己靠惯性滑动过程中不断判断tableView的contentOffset,为0(或-64,状态栏+导航栏)的时候就不再减小.代码如下: - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ //限制下拉的距离 if(scrollView.contentOffset.y<-70 && scrollView.is

表视图展开收起 头视图滑动到顶部不动 直到该组单元格全部推上去

类似qq的分组  头视图展开后推到屏幕顶端不动直到该组的单元格全部推上去 实现方法 1.在下面创建表视图的方法里style 设置成UITableViewStylePlain [[ UITableView alloc] initWithFrame:CGRectMake(0, 100, kScreenWide, kScreenHeight - 164) style:UITableViewStylePlain]; 2.表视图的代理方法 要添加设置组的代理方法 - (NSInteger)numberOf

Android 解决ScrollView与父视图滑动冲突问题

最近在解决一个比较棘手的问题,就是ScrollView与父视图之间滑动冲突的问题. 这里所说的滑动冲突,是指包裹ScrollView的父视图本身就是一个可以滑动的组件,比如说ScrollView嵌套ScrollView的情况(当然,这在实际应用中是没有意义的,因为ScrollView只能包含一个子组件,这里只是举一个栗子). 问题定义 说要解决这样一个问题,肯定会有点摸不到头脑,但我们可以用分解法,来"大事化小". 遇到这种滑动事件冲突的嵌套首先要明白一个孰先孰后的问题,就是先让父组件

高仿美团app,浮动layout滑动到顶部悬停效果

做了个类似美团app的一个效果 当一个浮动layout的滑动到顶部时,这个浮动layout就悬停下来,当屏幕往下滑动时,浮动layout也跟着往下移动. 因此,我特意也写了一个:浮动layuot滑动到顶部悬停demo,下图: (妈蛋上传图片不能超过200k,只能把图片阉割成这样,凑合着看吧) 原理        好,看完效果图之后,我们来看一下这个效果的设计原理.        首先,我们来看一张整体的设计图: 设计效果图是分为三个部分:顶部区域.浮动区域A.列表区域.1.当屏幕往上面滑动的时候

UIView如何管理它的子视图

UIView提供了很多建立和管理视图的方法. 1.添加视图 insertSubview:atIndex:   //放在子视图数组的具体索引位置 insertSubview:aboveSubview:   //某个子视图前面 insertSubview:aboveSubview:   //某个子视图前面 2.重新排序和删除子视图 [parentView exchangeSubviewAtIndex:i withSubviewAtIndex:j]//交换两个视图的位置 bringSubviewToF

【转】 UIView如何管理它的子视图

原文:http://my.oschina.net/u/1984662/blog/293690 目录[-] Core Animation基础 改变视图的层 动画支持 视图坐标系统 边框.边界.和中心的关系 坐标系统变换 内容模式与比例缩放 自动尺寸调整行为 创建和管理视图层次 创建一个视图对象 添加和移除子视图 视图层次中的坐标转换 标识视图 在运行时修改视图 实现视图动画 配置动画的参数 配置动画的委托 响应布局的变化 重画视图的内容 隐藏视图 创建一个定制视图 初始化您的定制视图 描画您的视图

[iOS]在NavigationController中的ScrollView中的子视图都会下移64个像素

情况是这样的: 我有一个UINavigationController,设置为self.window的root视图, 然后有一个UIVIewController是UINavigtionController的根视图. 然后在UIViewController中加入一个ScrollView 在ScrollView中加入一个view. 此时发现. scrollView并没有自动下移64像素,而 ScrollView中的子视图VIew自动下移了64个像素. 上图: // 解决方法 self.automati

iOS UITableViewCell点击时子视图背景透明的解决方法

在做iOS项目的开发中,UITableView控件的应用十分广泛.在进行自定义UITableViewCell时,经常遇到这样的问题:在UITableViewCell上面添加了一个有背景颜色的子视图,当用户点击UITableViewCell或者选中UITableViewCell时,Cell上的子视图发生了奇怪的变化,其背景色变透明了,如果添加在Cell上的子视图只是一个色块,那么我们看起来,这个子视图好像莫名其妙的消失了一样.    如果设置  self.selectionStyle = UITa

关于 Android 中ScrollView中带有ListView 或者是Gridview的子视图的问题解决方案

问题如下描述: 关于 Android 中ScrollView中带有ListView 或者是Gridview的子视图的问题,在第一次加载的时候,会使得ScrollView 不在顶端.会往下移动,这个是因为其子视图抢占了焦点. 解决这样的问题,只要重写两个方法 : pasting 这样的话,第一次加载的时候就将ScrollView牢牢的锁在了第一.当用户交互的时候,就可以恢复正常.