文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

安卓(android)仿电商app商品详情页按钮浮动效果

2022-06-06 07:50

关注

1、效果图如下:

这效果用户体验还是很酷炫,今天我们就来讲解如何实现这个效果。

2、分析

为了方便理解,作图分析


如图所示,整个页面分为四个部分:

     1、悬浮内容,

floatView

     2、顶部内容,

headView

     3、中间内容,与悬浮内容相同,

middleView

     4、商品详情展示页面,

detailView

因为页面内容高度会超出屏幕,所以用

Scrollview
实现滚动,悬浮
view
scrollview
同级,都在一个帧布局或者相对布局中。

当y方向的滚动距离小于中间的内容

middleView
到顶部的距离时,
middleView
理所当然的会随这页面向上滑动而消失,我们显示悬浮
view
,从而实现
middleView
一直卡在顶部的效果。

当y方向滚动距离大于中间的内容

middleView
容到顶部的距离时,悬浮
view
隐藏即可。

通过分析,我们发现只要知道

scrollview
的滚动距离和
middleView
到顶部的高度即可。至此将复杂的交互特效变成了俩个简单的api。

3、第一种方法实现

3.1 获取middleView的到父容器顶部的距离


 tv_title.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
    {
      @Override
      public void onGlobalLayout()
      {
        mTitleTopAndHeight = tv_title.getTop();
        tv_title.getViewTreeObserver().removeGlobalOnLayoutListener(this);
      }
    });

在activity的

oncreate()
中直接通过view的
getTop()
方法获取到view的高度会返回0,这是因为此时view还没有绘制到界面,所以我们采用上面的方法给view设置监听获取,由于可能发生多次绘制,所以最后记得移除监听事件。

以下代码同样可以获取:


   tv_title.post(new Runnable()
    {
      @Override
      public void run()
      {
        mTitleTopAndHeight = tv_title.getTop();
      }
    });

利用

post
方法将操作放到队列中,等系统布局完成后执行队列中的事件,同样可以获取到正确的
view
top
值。

3.2 获取垂直方向滚动距离

Scrollview
的父类
View
中有个内容变化的方法
onScrollChanged(),
虽然该方法是
protect
的外部不可调用,但是在内部,当
scrollview
滚动时就会执行该方法,所以我们自定义一个
MyScrollView
onScrollChanged()
通过回调将滚动的距离传递给外部。

自定义scrollview完整代码如下:


public class MyScrollView extends ScrollView
{
  private OnScrollListener mOnScrollListener;
  
  private boolean mIsTouch = false;
  public MyScrollView(Context context)
  {
    this(context, null);
  }
  public MyScrollView(Context context, AttributeSet attrs)
  {
    this(context, attrs, 0);
  }
  public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr)
  {
    super(context, attrs, defStyleAttr);
  }
  @Override
  protected void onScrollChanged(int l, int t, int oldl, int oldt)
  {
    super.onScrollChanged(l, t, oldl, oldt);
    if (mOnScrollListener != null)
    {
      mOnScrollListener.onScroll(t, mIsTouch ? OnScrollListener.SCROLL_STATE_TOUCH_SCROLL : OnScrollListener.SCROLL_STATE_FLING);
    }
  }
  @Override
  public boolean onTouchEvent(MotionEvent ev)
  {
    switch (ev.getAction())
    {
      case MotionEvent.ACTION_MOVE:
        mIsTouch = true;
        break;
      case MotionEvent.ACTION_UP:
      case MotionEvent.ACTION_CANCEL:
        mIsTouch = false;
        break;
    }
    return super.onTouchEvent(ev);
  }
  public void setOnScrollListener(OnScrollListener onScrollListener)
  {
    mOnScrollListener = onScrollListener;
  }
  public interface OnScrollListener
  {
    
    int SCROLL_STATE_TOUCH_SCROLL = 0x0;
    
    int SCROLL_STATE_FLING = 0x1;
    
    void onScroll(int scrollY, int scroll_state);
  }
}

3.3 使用

acitivity
中给
scrollview
设置自定义滚动监听事件即可


  mScrollView.setOnScrollListener(new MyScrollView.OnScrollListener()
    {
      @Override
      public void onScroll(int scrollY, int state)
      {
        Log.d("onScroll: ", scrollY + "" + "----------- state:" + state);
        if (scrollY <= mTitleTopAndHeight)
        {
          tv_float.setVisibility(View.INVISIBLE);
        } else
        {
          tv_float.setVisibility(View.VISIBLE);
        }
      }
    });

这样,通过垂直方法的滚动值来控制

floatView
的显示隐藏,


    tv_float.setOnTouchListener(new View.OnTouchListener()
    {
      @Override
      public boolean onTouch(View v, MotionEvent event)
      {
        mScrollView.onTouchEvent(event);
        return false;
      }
    });

给悬浮

view
设置触摸监听,将用户手势传递给
scrollView
,这样用户滑动悬浮
view
时,内容区域也可以跟随滚动。

下面是布局代码


<?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"
  >
  <com.example.qike.scrolltitle.MyScrollView
    android:id="@+id/sv_main"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:orientation="vertical">
      <TextView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:gravity="center"
        android:text="商品图片"/>
      <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="#a3c"
        android:gravity="center"
        android:text="view"/>
      <TextView
        android:layout_width="match_parent"
        android:layout_height="600dp"
        android:background="#a2bb"
        android:gravity="center"
        android:text="详情页面"/>
    </LinearLayout>
  </com.example.qike.scrolltitle.MyScrollView>
  <TextView
    android:id="@+id/tv_float"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:background="#a3c"
    android:gravity="center"
    android:text="view"
    android:visibility="invisible"/>
</RelativeLayout>

4、第二种方式

本方法与第一种方式的区别就是获取滚动位置的方法不同,该方法更简单一些:


 mScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener()
    {
      @Override
      public void onScrollChanged()
      {
        int scrollY = mScrollView.getScrollY();
        if (scrollY <= mTitleTopAndHeight)
        {
          tv_float.setVisibility(View.INVISIBLE);
        } else
        {
          tv_float.setVisibility(View.VISIBLE);
        }
      }
    });

可能有读者要问,既然有这种简单的方法直接设置监听,为什么还介绍第一种方法。细心的你可能已经发现,在第一种方法中,我在自定义的监听事件中,还回调了代表当前回调状态的参数

statue
,因为很多app,在用户手动拖动滚动跟惯性滚动的处理是不能的。比如淘宝商品详情页面,当达到边界值中间
view
top
值时,只有用户手动拖动一段距离后才会拉出底部的详情类容,而惯性滑动的话只会停在那里。

5、总结

以上就是关于安卓实现按钮随着上下滚动而悬浮顶在固定位置的方法,希望本文的内容对大家开发Android能有所帮助。

您可能感兴趣的文章:Android实现图片浮动随意拖拽效果Android 浮动编辑框的具体实现代码Android利用浮动窗口提示用户操作Android自定义ViewGroup实现标签浮动效果Android应用中制作选中后图标变大浮动效果的代码分享Android实现支付宝蚂蚁森林水滴浮动效果


阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯