android 浮动的View不会跟随ScrollView消失而消失

转载请注明出处王亟亟的大牛之路

标题比较抽象,先上下效果图以及项目结构

向上滑(没到底)

滑到头

反过来就是这个流程再反一反。

如何实现?看下示意图你就懂了

黑色的线是我们的屏幕

蓝色的线模拟的是我们上部的一个布局,我们现在使这个死库水的妹子

红色的线模拟的是我们的那一个打麦麦屁股的一个LinearLayout

那么绿色呢?

绿色其实跟红色的内容是一模一样只是在初始化的时候受否可见为gone,说到这里大家理解了吗?

我们监听ScrollView的滑动当向上滑动的距离大于妹子时,我们的绿色部分就显现出来,反之则隐藏。就是这么简单,那我们来看下代码

自定义的滚动布局CustomScrollView

public class CustomScrollView extends ScrollView {

    View mTopView;
    View mFlowView;
    public CustomScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {

        super.onScrollChanged(l, t, oldl, oldt);
        if(mTopView != null && mFlowView != null) {
            if(t >= mTopView.getHeight()) {
                mFlowView.setVisibility(View.VISIBLE);
            } else {
                mFlowView.setVisibility(View.GONE);
            }
        }
    }
    /**
     * 监听浮动view的滚动状态
     * @param topView 顶部区域view,即当ScrollView滑动的高度要大于等于哪个view的时候隐藏floatview
     * @param flowView 浮动view,即要哪个view停留在顶部
     */
    public void listenerFlowViewScrollState(View topView, View flowView) {
        mTopView = topView;
        mFlowView = flowView;
    }
}

主视图MainActivity

public class MainActivity extends Activity {

    private CustomScrollView mScrollView;
    private ImageView mImageView;
    private LinearLayout mFlowLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        mScrollView = (CustomScrollView) findViewById(R.id.scroll_view);
        mImageView = (ImageView) findViewById(R.id.image_view);
        mFlowLayout = (LinearLayout) findViewById(R.id.flow_llay);
        ListView listview = (ListView) findViewById(R.id.list_view);
        listview.setAdapter(new ListViewDataAdapter(getData(), this));
        listview.setFocusable(false);
        listview.setOnItemClickListener(onItemClickListener);

        setListViewHeightBasedOnChildren(listview);
        //监听浮动view的滚动状态
        mScrollView.listenerFlowViewScrollState(mImageView, mFlowLayout);
        //将ScrollView滚动到起始位置
        mScrollView.scrollTo(0, 0);
    }

    OnItemClickListener onItemClickListener = new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            Toast.makeText(MainActivity.this, "菜单"+(arg2+1), Toast.LENGTH_SHORT).show();
        }
    };
    private ArrayList<String> getData() {
        ArrayList<String> data = new ArrayList<String>();
        for(int i=1; i<30; i++) {
            data.add("菜单"+i);
        }
        return data;
    }

    /**
     * 用于解决ScrollView嵌套listview时,出现listview只能显示一行的问题
     * @param listView
     */
     public void setListViewHeightBasedOnChildren(ListView listView) {
         // 获取ListView对应的Adapter
         ListAdapter listAdapter = listView.getAdapter();
         if (listAdapter == null) {
            return;
         }   

         int totalHeight = 0;
         for (int i = 0, len = listAdapter.getCount(); i < len; i++) {
             // listAdapter.getCount()返回数据项的数目
             View listItem = listAdapter.getView(i, null, listView);
            // 计算子项View 的宽高
             listItem.measure(0, 0);
             // 统计所有子项的总高度
                 totalHeight += listItem.getMeasuredHeight();
        }   

         ViewGroup.LayoutParams params = listView.getLayoutParams();
         params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
         // listView.getDividerHeight()获取子项间分隔符占用的高度
         // params.height最后得到整个ListView完整显示需要的高度
         listView.setLayoutParams(params);
    }
}

主布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <com.jimstin.topfloatdemo.view.CustomScrollView
        android:id="@+id/scroll_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <ImageView
                android:id="@+id/image_view"
                android:layout_width="match_parent"
                android:layout_height="120dp"
                android:background="@drawable/pic01"/>
           <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:background="#4169E1">
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:textSize="10pt"
                    android:text="打屁股麦麦"
                    android:textColor="#ffffff"/>
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="打他屁股"
                    android:textColor="#ffffff"/>
            </LinearLayout>
            <ListView
                android:id="@+id/list_view"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1">
            </ListView>

        </LinearLayout>
    </com.jimstin.topfloatdemo.view.CustomScrollView>

    <LinearLayout
         android:id="@+id/flow_llay"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
         android:background="#4169E1"
         android:visibility="gone">
         <TextView
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:layout_weight="1"
              android:textSize="10pt"
              android:text="打屁股麦麦"
              android:textColor="#ffffff"/>
          <Button
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="打他屁股"
              android:textColor="#ffffff"/>
     </LinearLayout>
</RelativeLayout>

适配器ListViewDataAdapter

public class ListViewDataAdapter extends BaseAdapter {

    private ArrayList<String> mData = new ArrayList<String>();
    private Context mContext;

    public ListViewDataAdapter(ArrayList<String> mData, Context mContext) {
        super();
        this.mData = mData;
        this.mContext = mContext;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mData.size();
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return mData.get(arg0);
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int arg0, View convertView, ViewGroup arg2) {
        // TODO Auto-generated method stub
        Holder holder = null;
        if(convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(mContext);
            convertView = inflater.inflate(R.layout.layout_list_view_item, null);
            holder = new Holder();
            holder.avator_iv = (ImageView) convertView.findViewById(R.id.avator);
            holder.name_tv = (TextView) convertView.findViewById(R.id.item_tv);
            convertView.setTag(holder);
        }
        holder = (Holder) convertView.getTag();
        holder.avator_iv.setImageResource(R.drawable.pic02);
        holder.name_tv.setText(mData.get(arg0));
        return convertView;
    }

    class Holder {
        ImageView avator_iv;
        TextView name_tv;
    }
}

东西就这么点,只要想到怎么做的话实现其实并不复杂,源码今天就不传了,因为并没有什么资源文件什么的,这几个类 复制黏贴就能用了,周末愉快

部分内容参考互联网,如有重复请见谅

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 23:56:57

android 浮动的View不会跟随ScrollView消失而消失的相关文章

Android自定View组件方法

一.开发自定义View组件 View组件只是一个矩形的空白区域,并没有任何内容.对于Android应用的其他UI组件来说,它们都继承于View组件,然后在View组件提供的空白区域上绘制外观.当Android系统提供的UI组件不足以满足项目需要时,我们可以通过继承View来派生一个自定义组件. 举一个实例:实现一个跟随手指的小球.当用户通过手指在屏幕上拖动时,程序监听到这个手机动作,并把手指动作的位置传入自定义UI组件,并通知该组件重绘即可.开发步骤如下: 1.实现一个继承于View的子类 pa

Android 深入了解View(二)

相信每个Android程序员都知道,我们每天的开发工作当中都在不停地跟View打交道,Android中的任何一个布局.任何一个控件其实都是直接或间接继承自View的,如TextView.Button.ImageView.ListView等.这些控件虽然是Android系统本身就提供好的,我们只需要拿过来使用就可以了,但你知道它们是怎样被绘制到屏幕上的吗?多知道一些总是没有坏处的,那么我们赶快进入到本篇文章的正题内容吧. 要知道,任何一个视图都不可能凭空突然出现在屏幕上,它们都是要经过非常科学的绘

用Xamarin 实现园友的 :Android浮动小球与开机自启动

原文:用Xamarin 实现园友的 :Android浮动小球与开机自启动 前两天看园子里有筒子写了个 Android浮动小球与开机自启动  , 感觉这种被 360 玩烂的功能原来是如此的简单啊... 我不会 Java, 当然也不懂如何 用 ADT 开发 Android App. 但是我看过几天 Xamarin 啊,C# 我还是会的.. 用 Xamarin 做Android , 只要对着 java 源码, 我还是能翻译一份出来的. 我第一时间安装了 VS2015 , 挺好的,自带的 Android

android浮动搜索框

android浮动搜索框的配置比较繁琐,需要配置好xml文件才能实现onSearchRequest()方法. 1.配置搜索的XML配置文件?,新建文件searchable.xml,保存在res/xml文件夹中. 1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <searchable android:label="@string/search_label" 4 android:search

Android -- 浮动组建

在开发Android应用时,加新功能是必不可少的,我们加入了新的功能,有的一看界面就可以看出来,但是有的新功能就比较隐蔽,也就是用户很难知道你添加了这个新功能,这个时候就需要用户在打开我们的应用时给出一些提示,说明我们在哪里添加了新功能,点击哪里可以看到这个新功能.这时我们第一时间想到的可能是Toast,因为它用法简单,又不影响用户操作,但是它有个缺点,就是不能明确的指示是哪里添加了新功能,除非你用文字描述出来. 基本思路                                     

Android 深入了解View(一)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/12921889 有段时间没写博客了,感觉都有些生疏了呢.最近繁忙的工作终于告一段落,又有时间写文章了,接下来还会继续坚持每一周篇的节奏. 有不少朋友跟我反应,都希望我可以写一篇关于View的文章,讲一讲View的工作原理以及自定义View的方法.没错,承诺过的文章我是一定要兑现的,而且在View这个话题上我还准备多写几篇,尽量能将这个知识点讲得透彻一些.那么今天就从LayoutIn

android知识回顾--view的事件体系

1.view的滑动,六种滑动方式:    一:通过layout来实现滑动效果      package com.example.testdragview; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; public class DragView

Android浮动窗口的实现

1.浮动窗口的实现原理 看到上图的那个小Android图标了吧,它不会被其他组建遮挡,也可以响应用户的点击和拖动事件,它的显示和消失由WindowManager直接管理,它就是Android浮动窗口.Android浮动窗口的实现主要是靠WindowManager这个类.通过WindowManager类的addView(),updateViewLayout(),removeView()这几个方法,我们可以直接在Window中添加,更新,移除View. 2.浮动窗口实现的具体步骤 1)既然浮动窗口的

android 浮动窗口学习笔记及个人理解(仿360手机助手)

非常感谢原文作者 http://blog.csdn.net/guolin_blog/article/details/8689140 经自己理解 程序运行界面如下图: 1.程序入口界面 2.小浮动窗口 3.大浮动窗口 由上图可看出,可以看出我们基本需要: 1.一个主Activity 2.小浮动窗口view界面 3.大浮动窗口view界面 对于浮动窗口的管理我们还需要 4.一个Service(在后台监控管理浮动窗口的状态) 5.窗口管理类(创建/消除浮动窗口) 代码: package com.ww.