我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何在Android应用中实现一个列表悬浮效果

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何在Android应用中实现一个列表悬浮效果

这期内容当中小编将会给大家带来有关如何在Android应用中实现一个列表悬浮效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

具体方法如下:

package com.xiaos.view;import android.content.Context;import android.graphics.Canvas;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.ExpandableListAdapter;import android.widget.ExpandableListView;import android.widget.ExpandableListView.OnGroupClickListener;public class PinnedHeaderExpandableListView extends ExpandableListView implements OnScrollListener,OnGroupClickListener { public PinnedHeaderExpandableListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); registerListener(); } public PinnedHeaderExpandableListView(Context context, AttributeSet attrs) { super(context, attrs); registerListener(); } public PinnedHeaderExpandableListView(Context context) { super(context); registerListener(); }  public interface HeaderAdapter { public static final int PINNED_HEADER_GONE = 0; public static final int PINNED_HEADER_VISIBLE = 1; public static final int PINNED_HEADER_PUSHED_UP = 2;   int getHeaderState(int groupPosition, int childPosition);  void configureHeader(View header, int groupPosition,int childPosition, int alpha);  void setGroupClickStatus(int groupPosition, int status);  int getGroupClickStatus(int groupPosition); } private static final int MAX_ALPHA = 255; private HeaderAdapter mAdapter;  private View mHeaderView;  private boolean mHeaderViewVisible; private int mHeaderViewWidth; private int mHeaderViewHeight; public void setHeaderView(View view) { mHeaderView = view; AbsListView.LayoutParams lp = new AbsListView.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); view.setLayoutParams(lp); if (mHeaderView != null) {  setFadingEdgeLength(0); } requestLayout(); } private void registerListener() { setOnScrollListener(this); setOnGroupClickListener(this); }  private void headerViewClick() { long packedPosition = getExpandableListPosition(this.getFirstVisiblePosition());  int groupPosition = ExpandableListView.getPackedPositionGroup(packedPosition);  if (mAdapter.getGroupClickStatus(groupPosition) == 1) {  this.collapseGroup(groupPosition);  mAdapter.setGroupClickStatus(groupPosition, 0); } else{  this.expandGroup(groupPosition);  mAdapter.setGroupClickStatus(groupPosition, 1); }  this.setSelectedGroup(groupPosition); } private float mDownX; private float mDownY;  @Override public boolean onTouchEvent(MotionEvent ev) { if (mHeaderViewVisible) {  switch (ev.getAction()) {  case MotionEvent.ACTION_DOWN:  mDownX = ev.getX();  mDownY = ev.getY();  if (mDownX <= mHeaderViewWidth && mDownY <= mHeaderViewHeight) {   return true;  }  break;  case MotionEvent.ACTION_UP:  float x = ev.getX();  float y = ev.getY();  float offsetX = Math.abs(x - mDownX);  float offsetY = Math.abs(y - mDownY);  // 假设 HeaderView 是可见的 , 点击在 HeaderView 内 , 那么触发 headerClick()  if (x <= mHeaderViewWidth && y <= mHeaderViewHeight  && offsetX <= mHeaderViewWidth && offsetY <= mHeaderViewHeight) {   if (mHeaderView != null) {   headerViewClick();   }   return true;  }  break;  default:  break;  } } return super.onTouchEvent(ev); } @Override public void setAdapter(ExpandableListAdapter adapter) { super.setAdapter(adapter); mAdapter = (HeaderAdapter) adapter; }  @Override public boolean onGroupClick(ExpandableListView parent,View v,int groupPosition,long id) { if (mAdapter.getGroupClickStatus(groupPosition) == 0) {  mAdapter.setGroupClickStatus(groupPosition, 1);  parent.expandGroup(groupPosition);  //Header自己主动置顶  //parent.setSelectedGroup(groupPosition);   } else if (mAdapter.getGroupClickStatus(groupPosition) == 1) {  mAdapter.setGroupClickStatus(groupPosition, 0);  parent.collapseGroup(groupPosition); } // 返回 true 才干够弹回第一行 , 不知道为什么 return true; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (mHeaderView != null) {  measureChild(mHeaderView, widthMeasureSpec, heightMeasureSpec);  mHeaderViewWidth = mHeaderView.getMeasuredWidth();  mHeaderViewHeight = mHeaderView.getMeasuredHeight(); } } private int mOldState = -1; @Override protected void onLayout(boolean changed, int left, int top, int right,int bottom) { super.onLayout(changed, left, top, right, bottom); final long flatPostion = getExpandableListPosition(getFirstVisiblePosition()); final int groupPos = ExpandableListView.getPackedPositionGroup(flatPostion); final int childPos = ExpandableListView.getPackedPositionChild(flatPostion); int state = mAdapter.getHeaderState(groupPos, childPos); if (mHeaderView != null && mAdapter != null && state != mOldState) {  mOldState = state;  mHeaderView.layout(0, 0, mHeaderViewWidth, mHeaderViewHeight); } configureHeaderView(groupPos, childPos); } public void configureHeaderView(int groupPosition, int childPosition) { if (mHeaderView == null || mAdapter == null || ((ExpandableListAdapter) mAdapter).getGroupCount() == 0) {  return; } int state = mAdapter.getHeaderState(groupPosition, childPosition); switch (state) {  case HeaderAdapter.PINNED_HEADER_GONE: {  mHeaderViewVisible = false;  break;  }   case HeaderAdapter.PINNED_HEADER_VISIBLE: {  mAdapter.configureHeader(mHeaderView, groupPosition,childPosition, MAX_ALPHA);   if (mHeaderView.getTop() != 0){   mHeaderView.layout(0, 0, mHeaderViewWidth, mHeaderViewHeight);  }   mHeaderViewVisible = true;   break;  }   case HeaderAdapter.PINNED_HEADER_PUSHED_UP: {  View firstView = getChildAt(0);  int bottom = firstView.getBottom();   // intitemHeight = firstView.getHeight();  int headerHeight = mHeaderView.getHeight();   int y;   int alpha;   if (bottom < headerHeight) {   y = (bottom - headerHeight);   alpha = MAX_ALPHA * (headerHeight + y) / headerHeight;  } else {   y = 0;   alpha = MAX_ALPHA;  }    mAdapter.configureHeader(mHeaderView, groupPosition,childPosition, alpha);   if (mHeaderView.getTop() != y) {   mHeaderView.layout(0, y, mHeaderViewWidth, mHeaderViewHeight + y);  }   mHeaderViewVisible = true;  break;  } } } @Override  protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); if (mHeaderViewVisible) {  //分组栏是直接绘制到界面中。而不是增加到ViewGroup中  drawChild(canvas, mHeaderView, getDrawingTime()); } } @Override public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) { final long flatPos = getExpandableListPosition(firstVisibleItem); int groupPosition = ExpandableListView.getPackedPositionGroup(flatPos); int childPosition = ExpandableListView.getPackedPositionChild(flatPos);  configureHeaderView(groupPosition, childPosition); } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { }}

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何在Android应用中实现一个列表悬浮效果

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何在Android应用中实现一个列表悬浮效果

这期内容当中小编将会给大家带来有关如何在Android应用中实现一个列表悬浮效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。具体方法如下:package com.xiaos.view;import an
2023-05-31

如何在Android应用中使用ScrollView实现悬浮效果

如何在Android应用中使用ScrollView实现悬浮效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。新建一个Android项目,
2023-05-31

怎么在android应用中实现一个RecyclerView悬浮吸顶效果

本篇文章为大家展示了怎么在android应用中实现一个RecyclerView悬浮吸顶效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。MultiType-Adapter打造悬浮吸顶效果注:当前版本
2023-05-31

android开发中如何利用listview实现一个悬浮topBar效果

android开发中如何利用listview实现一个悬浮topBar效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。虽然listview是过去式,但由于项目中还是有用list
2023-05-31

怎么在Android中利用FloatingActionButton实现一个悬浮按钮效果

今天就跟大家聊聊有关怎么在Android中利用FloatingActionButton实现一个悬浮按钮效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先是这个最小的Tag:这个T
2023-05-31

Android项目中项目实现一个控件悬浮效果

今天就跟大家聊聊有关Android项目中项目实现一个控件悬浮效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。效果图:新建一个Android项目,取名MeiTuanDemo,先看立即
2023-05-31

如何在android中利用listview实现一个列表展示效果

今天就跟大家聊聊有关如何在android中利用listview实现一个列表展示效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.设置条目点击事件package com.ithei
2023-05-31

如何在Android中利用ScrollView实现一个顶部悬停效果

这期内容当中小编将会给大家带来有关如何在Android中利用ScrollView实现一个顶部悬停效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。原理:原理其实很简单就是对view的gone和visibl
2023-05-31

如何在Android应用中实现一个Gallery画廊效果

这期内容当中小编将会给大家带来有关如何在Android应用中实现一个Gallery画廊效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。画廊 使用Gallery表示,按水平方向显示内容,并且可以用手指直接
2023-05-31

在Android开发中使用WindowManager实现一个悬浮按钮

这篇文章将为大家详细讲解有关在Android开发中使用WindowManager实现一个悬浮按钮,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。效果:整体思路360手机卫士的内存球其实就是一个
2023-05-31

如何在Android应用中利用Dialog实现一个动画效果

今天就跟大家聊聊有关如何在Android应用中利用Dialog实现一个动画效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. 创建两个动画文件window_in.xml:
2023-05-31

Android应用怎么实现一个浮动状态栏效果

这期内容当中小编将会给大家带来有关Android应用怎么实现一个浮动状态栏效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先:要实现的是浮动状态栏效果,通过在Activity的onCreate方法中调
2023-05-31

如何使用Android实现一个悬浮在软键盘上的输入栏

这篇文章主要介绍“如何使用Android实现一个悬浮在软键盘上的输入栏”,在日常操作中,相信很多人在如何使用Android实现一个悬浮在软键盘上的输入栏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用A
2023-06-29

如何在Android应用中利用Spinner实现一个下拉列表功能

这期内容当中小编将会给大家带来有关如何在Android应用中利用Spinner实现一个下拉列表功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Spinner  Spinner是一个列表选择框,会在用户选
2023-05-31

如何在Android应用中实现一个沉浸式状态栏效果

这篇文章将为大家详细讲解有关如何在Android应用中实现一个沉浸式状态栏效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。实现方法如下: @Ta
2023-05-31

怎么在Android应用中实现一个动画效果

本篇文章给大家分享的是有关怎么在Android应用中实现一个动画效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Android 三种动画详解帧动画一张张图片不断的切换,形成动
2023-05-31

如何在Android应用中实现一个动态searchview搜索栏效果

本篇文章为大家展示了如何在Android应用中实现一个动态searchview搜索栏效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。实现这个效果, 只要关注几个点1.搜索栏伸展和收缩动画效果实现2
2023-05-31

怎么在Android应用中实现一个抽屉效果

怎么在Android应用中实现一个抽屉效果?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现原理其实单就一个SwipeLayout的实现原理来讲的话,还是很简单
2023-05-31

如何在Android中利用ConstraintLayout实现一个动画效果

这篇文章将为大家详细讲解有关如何在Android中利用ConstraintLayout实现一个动画效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。xml布局: