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

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


向上滑(没到底)

滑到头

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

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

黑色的线是我们的屏幕
蓝色的线模拟的是我们上部的一个布局,我们现在使这个死库水的妹子
红色的线模拟的是我们的那一个打麦麦屁股的一个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}@Overrideprotected 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;@Overrideprotected 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() {@Overridepublic 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;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mData.size();}@Overridepublic Object getItem(int arg0) {// TODO Auto-generated method stubreturn mData.get(arg0);}@Overridepublic long getItemId(int arg0) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(int arg0, View convertView, ViewGroup arg2) {// TODO Auto-generated method stubHolder 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;}
}

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

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

android 浮动的View不会跟随ScrollView消失而消失相关推荐

  1. android小球移动代码,Android自定义圆形View实现小球跟随手指移动效果

    本文实例为大家分享了Android实现小球跟随手指移动效果的具体代码,供大家参考,具体内容如下 一. 需求功能 手指在屏幕上滑动,红色的小球始终跟随手指移动. 实现的思路: 1)自定义View,在on ...

  2. android浮动标题栏,GitHub - DARTTTTT/LBehavior: 跟随手势滑动,显示隐藏标题栏、底部导航栏及悬浮按钮的Android Behavior Library...

    LBehavior 简单实现标题栏.导航栏滑动动画 效果图 博客介绍 Download allprojects { repositories { ... maven { url 'https://ji ...

  3. html5跟随手指的小球,Android自定义圆形View实现小球跟随手指移动效果(详细介绍)...

    一. 需求功能 手指在屏幕上滑动,红色的小球始终跟随手指移动. 实现的思路: 1)自定义View,在onDraw中画圆作为小球: 2)重写自定义View的onTouchEvent方法,记录触屏坐标,用 ...

  4. android 跟随动画,Android实现View拖拽跟随手指移动效果

    今天想实现这个功能,但是网上搜索代码,都是利用setPadding,setMargin 等方法去实现的,这在Android 4.0 以前是没问题的,但是,android 4.0 后系统已经提供了更简单 ...

  5. Android刷新机制-View绘制原理

    Android刷新机制-View绘制原理 Android刷新机制-SurfaceFlinger原理 Android刷新机制-Choreographer原理 一.概述 本文将从startActivity ...

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

    原文:用Xamarin 实现园友的 :Android浮动小球与开机自启动 前两天看园子里有筒子写了个 Android浮动小球与开机自启动  , 感觉这种被 360 玩烂的功能原来是如此的简单啊... ...

  7. android 截图 listview,Android屏幕及view的截图实例详解

    Android屏幕及view的截图实例详解 屏幕可见区域的截图 整个屏幕截图的话可以用View view = getWindow().getDecorView(); public static Bit ...

  8. cocos bubbles_像Messenger Bubbles这样的Android浮动小部件

    cocos bubbles If you've used the Facebook Messenger Application anytime, you must have come across t ...

  9. android浮动按钮_Android浮动操作按钮示例教程

    android浮动按钮 Today we will learn about Android Floating Action Button. We'll discuss the FloatingActi ...

最新文章

  1. “西南偏南” 三十年首次 “聚焦中国”
  2. C++ with STL(一)
  3. 搜索引擎lucene
  4. 最长递增子序列Python解法
  5. 前端学习(682):switch和if else if
  6. 服务器购买和远程连接
  7. PyCharm LicenseServer 破解
  8. centos安装软件【google浏览器,QQ】【拷贝旧的文件源作为备份】【软件源更换为清华源】
  9. linux buffer cache 过高_你真的理解Linux的内存监控吗?
  10. VCS带UPF的RTL低功耗仿真介绍
  11. 用Python解读房贷利率,有没有套路?这是我见过最透彻的Python版解读!
  12. 开源电子书项目FBReader初探(二)
  13. 异地驾驶证转入(+到期换证)——赞深圳交警!
  14. Java端实现JSHOP2的调用
  15. DCloud之APP离线SDK升级步骤(3.5.3升至最新版3.6.7.81556_20221018)
  16. 《Head First 设计模式》例子的C++实现(4 单件模式)
  17. SATA电源线的作用
  18. 每日文献:2018-01-29
  19. Sql Server 存储过程 循环处理字符串的每个字符
  20. LeetCode ---Fizz和Buzz

热门文章

  1. 福州计算机专业初级职称考试,目前有哪些专业技术资格即职称实行“以考代评”?...
  2. 松下(Panasonic)伺服EtherCAT(IGH EtehrCAT Master)通信注意事项
  3. 5G 核心网用户面功能(一)UE IP地址分配和管理
  4. Java设计模式之状态模式
  5. 计算机毕业设计ssm特殊教育学校学生管理系统002k1系统+程序+源码+lw+远程部署
  6. 从马云退休说起,财富开启的超级公式
  7. .net基础汇总逆天
  8. OSPF的接口网络类型
  9. PyCharm 升级pip或者其他软件包的方法(简单版)
  10. html 模板 pug