Android滑动组件悬浮固定在顶部效果

要想实现的效果是如下:

场景:有些时候是内容中间的组件当滑动至顶部的时候固定显示在顶部。

实现的思路:

1.目标组件(button)有两套,放在顶部和内容中间;

2.当内容中间的组件滑动至顶部栏位置时控制显示/隐藏顶部和中间的组件(涉及到组件获取在屏幕的位置知识点);

activity代码:

public class MainActivity extends AppCompatActivity implements ObservableScrollView.ScrollViewListener {
  private ObservableScrollView scrollView;
  private Button topBtn1, topBtn2, middleBtn1, middleBtn2;
  private View topPanel, middlePanel;
  private int topHeight; 

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

  } 

  @Override
  public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus); 

    Rect frame = new Rect();
    getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
    int statusBarHeight = frame.top;//状态栏高度 

    int titleBarHeight = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();//标题栏高度
    topHeight = titleBarHeight + statusBarHeight;
  } 

  private void initViews() {
    scrollView = (ObservableScrollView) findViewById(R.id.scrollView);
    topPanel = findViewById(R.id.topPanel);
    topBtn1 = (Button) topPanel.findViewById(R.id.button1);
    topBtn2 = (Button) topPanel.findViewById(R.id.button2); 

    middlePanel = findViewById(R.id.middlePanel);
    middleBtn1 = (Button) middlePanel.findViewById(R.id.button1);
    middleBtn2 = (Button) middlePanel.findViewById(R.id.button2); 

  } 

  private void initListeners() {
    topBtn1.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        middleBtn1.setBackgroundColor(Color.WHITE);
        topBtn1.setBackgroundColor(Color.WHITE);
      }
    }); 

    middleBtn1.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        middleBtn1.setBackgroundColor(Color.BLUE);
        topBtn1.setBackgroundColor(Color.BLUE);
      }
    }); 

    scrollView.setScrollViewListener(this); 

  } 

  @Override
  public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) {
    int[] location = new int[2];
    middleBtn1.getLocationOnScreen(location);
    int locationY = location[1];
    Log.e("locationY", locationY + "  " + "topHeight的值是:" + topHeight); 

    if (locationY <= topHeight && (topPanel.getVisibility() == View.GONE || topPanel.getVisibility() == View.INVISIBLE)) {
      topPanel.setVisibility(View.VISIBLE);
    } 

    if (locationY > topHeight && topPanel.getVisibility() == View.VISIBLE) {
      topPanel.setVisibility(View.GONE);
    } 

  }
} 

要点解析:

1.在onWindowFocusChanged()方法中获取屏幕状态栏和标题栏的高度(在onCreate()方法中是获取是0);

2.因为布局中的ScrollView的onScrollChangeListener()方法低版本API不支持——>所以activity实现了自定义ScrollView中的onScrollChanged()接口方法——>在此方法中实现组件的显示/隐藏;

自定义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); 

  }
} 

然后是布局文件:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/activity_main"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="com.example.administrator.slideholdapp.MainActivity"> 

  <com.example.administrator.slideholdapp.ObservableScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/scrollView"> 

    <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_marginBottom="30dp"
        android:text="@string/content" /> 

      <include android:id="@+id/middlePanel" layout="@layout/middle_item_layout"></include> 

      <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:text="@string/content" /> 

    </LinearLayout> 

  </com.example.administrator.slideholdapp.ObservableScrollView> 

  <include android:id="@+id/topPanel" layout="@layout/middle_item_layout" android:visibility="gone"/>
</FrameLayout> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android view滑动悬浮固定效果实现代码示例

    1.背景 在项目开发过程中,有时候会碰到这样的需求:在滑动的过程中,在某时要将子view固定在顶部(常见的是将界面中的tab在滑动到顶部的时候进行固定). 之前写过一篇滑动组件悬浮固定在顶部的文章,但感觉还是有些复杂,因此就有了这次的实现.效果图: 2.思路 (CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout)+TabLayout+ViewPager 3.代码实现 a.主布局代码 <?xml version="1.0"

  • 模仿美团点评的Android应用中价格和购买栏悬浮固定的效果

    随着移动互联网的快速发展,它已经和我们的生活息息相关了,在公交地铁里面都能看到很多人的人低头看着自己的手机屏幕,从此"低头族"一词就产生了,作为一名移动行业的开发人员,我自己也是一名"低头族",上下班时间在公交地铁上看看新闻来打发下时间,有时候也会看看那些受欢迎的App的一些界面效果,为什么人家的app那么受欢迎?跟用户体验跟UI设计也有直接的关系,最近在美团和大众点评的App看到如下效果,我感觉用户好,很人性化,所以自己也尝试着实现了下,接下来就讲解下实现思路!

  • Android滑动组件悬浮固定在顶部效果

    要想实现的效果是如下: 场景:有些时候是内容中间的组件当滑动至顶部的时候固定显示在顶部. 实现的思路: 1.目标组件(button)有两套,放在顶部和内容中间: 2.当内容中间的组件滑动至顶部栏位置时控制显示/隐藏顶部和中间的组件(涉及到组件获取在屏幕的位置知识点): activity代码: public class MainActivity extends AppCompatActivity implements ObservableScrollView.ScrollViewListener

  • vue+jquery+lodash实现滑动时顶部悬浮固定效果

    本文实例为大家分享了vue实现滑动时顶部悬浮固定效果的具体代码,供大家参考,具体内容如下 这个效果是一个项目中抽出来的一个demo效果. 前期准备: 1. 引入jQ <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js"></script> 引入lodash.js npm install lodash -D fixTop.vue组件的 <template> <div class=

  • Android RecyclerView打造悬浮效果的实现代码

    本文介绍了Android RecyclerView悬浮效果,分享给大家,具体如下: 先看个效果 这是一个City列表,每个City都有所属的Province,需要在滑动的时候,将对应的Province悬浮在顶部.悬浮顶部的Province需要根据列表的滑动而适当改变位置,实现"顶上去"的效果. 实现思路: 利用RecyclerView.ItemDecoration绘制Province(就像绘制分割线一样) 同一组的City,只绘制一个Province 计算偏移,将当前Province固

  • android之listview悬浮topBar效果

    虽然listview是过去式,但由于项目中还是有用listview,百度一番都是scrollview中的悬浮bar,没有看到有listview的悬浮bar,所以自己写一个悬浮bar:参照夏大神的scrollview的悬浮demo 效果如下: 自定义的Listview和scrollView没什么区别都是重写onScrollChange()然后在里边调用自己实现的接口,是对外提供的接口吧,这里没有封装,需要的可以自己将其封装,然后在自己项目中使用. 重点的方法: onScrollChanged()方

  • Android实现listview滑动时渐隐渐现顶部栏实例代码

    我在开发的时候遇到了这样的需求,就是在listview的滑动中,需要对顶部的栏目由透明慢慢的变为不透明的状态,就是以下的效果 最先开始的时候想的很简单,无非就是监听listview的滑动距离,然后根据距离算出透明度的比值,就可以了,但是事实上呢也的确是这样做的 只是在获取listview的滑动距离上可能没法直接获取,需要动态的去计算 下面贴出全部代码吧,不想码字了,最近感冒了,脑袋晕乎乎的,还疼,代码更直观一些 private void initListener() { lvList.setOn

  • Android RecyclerView实现悬浮吸顶、分隔线、到底提示效果

    本文中所有效果通过ItemDecoration实现,通过此实现的可以与业务解耦,让RecyclerView的模板更加简洁,不关心任何辅助性ui,github地址 一.顶部吸附效果图 二.顶部不吸附效果图 三.不满一屏效果 四.核心实现点 1.为什么通过ItemDecoration能够实现,原理? ①通过getItemOffsets()方法获取当前模板view的left.top.right.bottom边距,这些留出的间距用于绘制这些辅助性ui. // RecyclerView的measure c

  • CSS javascript 结合实现悬浮固定菜单效果

    效果展示图如下,兼容chrome,firefox,windows,360,搜狗等主流浏览器 点击这里下载源码 米扑代理,是由百度,小米出来的工程师创建,做得非常棒,功能很全很贴心. JS + CSS 经典实现 <!DOCTYPE HTML> <html lang="en-US"> <head> <title>悬浮固定菜单</title> <style type="text/css"> .wrap

  • Android实现手势滑动多点触摸缩放平移图片效果(二)

    上一篇已经带大家实现了自由的放大缩小图片,简单介绍了下Matrix:具体请参考:Android实现手势滑动多点触摸缩放平移图片效果,本篇继续完善我们的ImageView. 首先加入放大后的移动. 1.自由的进行移动 我们在onTouchEvent里面,加上移动的代码,当然了,必须长或宽大于屏幕才可以移动~~~ @Override public boolean onTouch(View v, MotionEvent event) { mScaleGestureDetector.onTouchEve

  • Android滑动到顶部和底部时出现的阴影如何去掉

    android去掉滑动到顶部和底部的阴影 <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content" android:cacheColorHint="#00000000" android:divider="@color/line_color"

随机推荐