-
2021-06-02 22:30:01
Android中使用FloatingActionButton实现一个点击按钮返回顶部功能
发布时间:2020-11-24 15:49:29
来源:亿速云
阅读:148
作者:Leah
这期内容当中小编将会给大家带来有关Android中使用FloatingActionButton实现一个点击按钮返回顶部功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
FloatingActionButton是Design Support库中提供的一个控件,这个控件可以轻松实现悬浮按钮的效果
首先,要在项目中使用这个悬浮按钮就要先把design这个包导入项目
gradle中加入依赖
compile 'com.android.support:design:25.0.0'
接下来就是在xml中使用:
我这里是放置一个listView模拟返回顶部
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
android:id="@+id/listview_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:id="@+id/floating_btn_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:src="@mipmap/top"
app:elevation="10dp"
android:layout_margin="15dp"/>
其中 app:elevation=”10dp”是给FloatingActionButton指定一个高度,高度越高,投影的范围越大,但是投影效果越淡,反之则反
接下来是MainActivity中的使用:
package com.duanlian.floatingbtn;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ListView mListView;
private FloatingActionButton mFloatBtn;
private MyListViewAdapter mAdapter;
private List mList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mListView = (ListView) findViewById(R.id.listview_main);
mFloatBtn = (FloatingActionButton) findViewById(R.id.floating_btn_main);
mList = new ArrayList<>();
for (int i = 0; i < 30; i++) {
mList.add(i + "");
}
mAdapter = new MyListViewAdapter(this, mList);
mListView.setAdapter(mAdapter);
//悬浮按钮的点击事件的监听
mFloatBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//listView返回到顶部
mListView.smoothScrollToPosition(0);
}
});
}
}
上述就是小编为大家分享的Android中使用FloatingActionButton实现一个点击按钮返回顶部功能了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
更多相关内容 -
Android scrollToTop实现点击回到顶部(兼容PullTorefreshScrollview)
2021-06-03 17:47:06前言最近因为项目组需求,特研究了一下“回到顶部”效果,即:页面里有scrollview,内容很多,当滑动到页面下面或者更深时,需要回到顶部,即可点击出现的按钮,省得回滑N久。我没有搜,或许网上有很多这样的例子,...前言
最近因为项目组需求,特研究了一下“回到顶部”效果,即:页面里有scrollview,内容很多,当滑动到页面下面或者更深时,需要回到顶部,即可点击出现的按钮,省得回滑N久。我没有搜,或许网上有很多这样的例子,此文写的不好的地方,望指点。
效果图如下
实现方法
初一看是不是觉得很简答?没错,当时我也是这样想的页面内容很长,就弄个scrollview,回到顶部按钮需要固定在右下角,故大概的布局代码:
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.znke.pulltorefresh_top.MainActivity">
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_top"
android:scrollbars="none">
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="111111111111"
android:textSize="20sp" />
...........
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="#AAAAAA" />
android:layout_width="match_parent"
android:layout_height="80dp"
android:gravity="center"
android:text="12000000000000"
android:textSize="20sp" />
android:id="@+id/imageView_to_top"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="5dp"
android:layout_marginRight="5dp"
android:background="@drawable/to_top" />
然后在activity中设置下面事件不就完了嘛!!!
mScrollView.setOnScrollChangeListener();
很遗憾,报错。alt+enter搞定错误不就完了嘛!很遗憾,运行继续报错,报空指针,神奇吧,找不出来。翻阅资料后发现,scrollview的onScrollChanged方法是受保护的。故按照网上的资料,自定义ScrollView类,暴露出onScrollChanged方法:
public class ToTopScrollView extends ScrollView {
private OnMyScrollListener onMyScrollListener;
public void setOnMyScrollListener(OnMyScrollListener onMyScrollListener) {
this.onMyScrollListener = onMyScrollListener;
}
...
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if(onMyScrollListener != null)
onMyScrollListener.onScrollChanged(l,t,oldl,oldt);
}
public interface OnMyScrollListener{
void onScrollChanged(int x, int y, int oldx, int oldy);
}
}
然后在activity中设置setOnMyScrollListener()方法,就可以监控scrollview的状态了。剩下的就是自定义imageview的逻辑了。
可是,自定义ToTopImageView里面怎么弄呢?它需要有一个高度临界值,与activity传递scrollview的scrollY值比较,来判定ToTopImageView是否显示。代码简单,搞定。
只是这样有个小问题,onScrollChanged方法是监控滚动状态的,没有说停止。如果在里面判断超过临界值就显示与隐藏imageview,那么会一直设置imageview。这样肯定不是最佳的方法。如果能在滚动停止时再判定是否需要显示与隐藏imageview就好了。此时我还没有想太多,动手简单实现了刚才的分析。
实现后,感觉挺爽。然而在准备加到项目中时发现,我们项目用了PullToRefresh刷新代码库,也简单,把自定义的Scrollview替换就可以了。运行,糟糕,没有效果,然后调试,事件没有处罚,可能是PullToRefresh库把事件屏蔽了,咋办?找onTouchListener监听方法呗。
于是改用了测试:
mScrollView.setOnTouchListener()
我去,没有调佣,把pullToRefreshScrollView里面各种监听方法都试遍了,没用。他只提供了顶部和底部的上拉、下拉刷新监听,毛用。
于是查看其源码,发现把事件拦截了。而且pullToRefreshScrollView根本就不是scrollview,看源码:
@Override
protected ScrollView createRefreshableView(Context context, AttributeSet attrs) {
ScrollView scrollView;
if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) {
scrollView = new InternalScrollViewSDK9(context, attrs);
} else {
scrollView = new ScrollView(context, attrs);
}
scrollView.setId(R.id.scrollview);
return scrollView;
}
他里面提供了一个方法可以或得到Scrollview:
final ScrollView scrollView = mScrollView.getRefreshableView();
回想起了以前项目也这么用过,只是当时不明白这句话干啥的,白写。
然后就用上面这种方法得到scrollview,再设置onscrollchanged方法监听滑动。运行报错,同样无效。于是只能换onTouchListener监听了。
但是这样问题来了,我们只能监听到手势,即何时按下、移动和弹起。当快速滑动手指弹起后,scrollview还在滚动的,什么时候去拿到它的scrollY值呢?犯愁了。
此时不得不用最开始分析的方法,在自定义imageview里面定义线程,扫描当前scrollY和上一次保存的对比,不一样即说明仍在滚动,一样即表明scrollview滚动停止了。
什么时候开启线程呢?在onTouch回调中down、move或者up时调用。
试想下:
如果在down中调用时,用户只在scrollview上点击或短距离滑动,imageview里面要不停地开启线程?浪费资源。
如果在up中调用时,当用户按着屏幕一口气滑过临界值,还不松手呢?还不显示imageview吗?也行,个人觉得不太好。
于是,我选择在move中调用imageview地线程。有人会想,这样会不会启动N多个线程呢?move一直在移动呢。“在iamgeview判断下线程的状态即可,如果已经启动了,就不启动呗”。或许这么写不太好,但我认为是实时的,用户体验好。
看代码:
/**
* 获取待监控的view对象
* 实时调起线程,监控是否scroll停止,来判断是否需要显示imageView
* @param targetView 需要监控的对象
*/
public void tellMe(View targetView) {
if (targetView == null)
throw new IllegalArgumentException("please set targetView who to scrollTo");
if (this.targetView == null)
this.targetView = targetView;
if (!isStarting) {
new Thread(scanThread).start();
}
}
此处注意,我偷懒了,没有单独设置方法传递需要滚动的scrollview,在此处引进来了。线程加了判断。此处不要传递scrollview的scrollY值进来。比喻当你手指离开屏幕后,之前传递进来的scrollY就已经过时了,scrollview仍在滑动。在消息回调里面实时获取再判断
private class MyCallback implements Runnable {
@Override
public void run() {
/**
* 获取实时的卷动值,不要传递scroll值给我
*/
endScrollX = targetView.getScrollX();
int scrollY = targetView.getScrollY();
if (endScrollY != scrollY) {
endScrollY = scrollY;
} else {
if (endScrollY >= limitHeight) {
if (!thisStateVisible)
visible();
} else {
if (thisStateVisible)
gone();
}
/**
* 已判定,卷动停止,显示或隐藏当前view已完成
* 退出监控scroll线程
*/
clearCallBacks();
}
}
}
由于是用线程来检测scrollview的滚动状态,我用了延时消息。此时又有另外一个潜在bug。在自定义imageview中创建了handler属于主线程,子线程中需要发延时消息。如果延时消息发出后,activity退出了呢?反复这么弄呢?有人会说没谁会这么无聊的。但这毕竟还是潜在的OOM。于是我简单的做了线程控制和消息清除的代码,过于简单。感谢评论。
主要思路和逻辑都分析完了,使用起来很简答,你不用关心自定义imageview里面的逻辑(除非你想改进)。
在activity中
private PullToRefreshScrollView mScrollView;
private ToTopImageView imageView_to_top;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pull_to_refresh_scroll_view);
imageView_to_top = (ToTopImageView) findViewById(R.id.imageView_to_top);
imageView_to_top.setLimitHeight(800);
mScrollView = (PullToRefreshScrollView) findViewById(R.id.scrollView);
final ScrollView scrollView = mScrollView.getRefreshableView();
//mScrollView.setOnTouchListener(); 无效
scrollView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_MOVE:
imageView_to_top.tellMe(scrollView);
break;
}
return false;
}
});
}
@Override
protected void onDestroy() {
imageView_to_top.clearCallBacks();
super.onDestroy();
}
页面上,在你觉得合适的位置:
android:id="@+id/imageView_to_top"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="5dp"
android:layout_marginRight="5dp"
android:background="@drawable/to_top" />
完事。
总结
以上就是这篇文章的全部内容了,希望本文的内容对各位Android开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
-
Android悬浮按钮点击返回顶部FloatingActionButton
2021-01-04 22:43:21先看一下Android悬浮按钮点击回到顶部的效果: FloatingActionButton是Design ...我这里是放置一个listView模拟返回顶部 <?xml version=1.0 encoding=utf-8?> <RelativeLayout xmlns:android=http://sc -
android中LinearLayoutManager一键返回顶部示例
2020-08-31 10:08:04本篇文章主要介绍了android中LinearLayoutManager一键返回顶部,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。 -
Android点击按钮返回顶部实现代码
2021-01-04 13:18:52点击按钮返回顶部,直接上代码吧 布局文件 <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android xmlns:app=http://schemas.android.com/apk/res-auto android:layout_width=match_parent ... -
Android之双击回到顶部
2021-06-07 04:06:07双击回到顶部在Android应用中用的很多,众所周知的微信消息列表,朋友圈都提供这样的效果,下面我将自己自项目中的实践记录下来,分享给大家首先:获取双击事件网上有很多的获取双击事件的方法,这里我讲它稍加封装...双击回到顶部在Android应用中用的很多,众所周知的微信消息列表,朋友圈都提供这样的效果,下面我将自己自项目中的实践记录下来,分享给大家
首先:获取双击事件
网上有很多的获取双击事件的方法,这里我讲它稍加封装,整个工程也可以使用
首先我们来定义双击事件的接口
packagecom.....activity.info;
importandroid.view.View;
/**
* @author wfy
* 单击双击事件接口
*/
publicinterfaceOnDoubleClickListener {
publicvoidOnSingleClick(View v);
publicvoidOnDoubleClick(View v);
}
下来定义一个DoubleClick类,它提供一个静态方法给一个view注册双击事件,注释我已经写的及其详细了,不再多说
packagecom.....activity.info;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.view.View;
/**
* @author wfy
* 消息列表+好友动态的双击回到顶部
*/
publicclassDoubleClick {
publicstaticvoidregisterDoubleClickListener(View view,finalOnDoubleClickListener listener){
if(listener==null)return;
view.setOnClickListener(newView.OnClickListener() {
//双击间隔时间350毫秒
privatestaticfinalintDOUBLE_CLICK_TIME =350;
privatebooleanflag =true;
privateHandler handler =newHandler(){
@Override
publicvoidhandleMessage(Message msg) {
listener.OnSingleClick((View)msg.obj);
}
};
//等待双击
publicvoidonClick(finalView v) {
if(flag){
flag = false;//与执行双击事件
newThread(){
publicvoidrun() {
try{
Thread.sleep(DOUBLE_CLICK_TIME);
//此时线程沉睡 而flag被修改为false 在DOUBLE_CLICK_TIME内点击则 进入else
} catch(InterruptedException e) {
e.printStackTrace();
} //等待双击时间,否则执行单击事件
if(!flag){
//睡醒了看一看flag被人动过没,没有人动,则认作单击事件
//因此不建议用此方法执行单击事件 因为会等待睡醒,有点击延迟的存在
//没有人动,自己把它改成true,以接受下次点击
flag = true;
Message msg = handler.obtainMessage();
msg.obj = v;
//发个消息,让执行单击
handler.sendMessage(msg);
}
}
}.start();
}else{
flag = true;
listener.OnDoubleClick(v); //执行双击
}
}
});
}
}
其次:给你要双击的组件注册双击事件,此处用button演示一下
Button button=newButton(this);
DoubleClick.registerDoubleClickListener(button, newOnDoubleClickListener() {
@Override
publicvoidOnSingleClick(View v) {
// TODO Auto-generated method stub
}
@Override
publicvoidOnDoubleClick(View v) {
// TODO Auto-generated method stub
GoTopTask task=newGoTopTask();
task.execute(firstposition);
}
});
最后:细心的会发现,在上面的OnDoubleClick方法中我启动了一个异步任务,下面贴出代码,这是一个内部类
privateclassGoTopTaskextendsAsyncTask{
@Override
protectedvoidonPreExecute() {
//回到顶部时间置0 此处的时间不是侠义上的时间
time=0;
super.onPreExecute();
}
@Override
protectedString doInBackground(Integer... params) {
// TODO Auto-generated method stub
for(inti=params[0];i>=0;i--){
publishProgress(i);
//返回顶部时间耗费15个item还没回去,则直接去顶部
//目的:要产生滚动的假象,但也不能耗时过多
time++;
if(time>15){
publishProgress(0);
returnnull;
}
try{
Thread.sleep(5);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
returnnull;
}
@Override
protectedvoidonProgressUpdate(Integer... values) {
lv.setSelection(values[0]);
super.onProgressUpdate(values);
}
@Override
protectedvoidonPostExecute(String result) {
super.onPostExecute(result);
}
@Override
protectedvoidonCancelled() {
// TODO Auto-generated method stub
super.onCancelled();
}
}
写到这里相信大家都明白思路了,就是用lv.setSelection(0)让list回到顶部,可是这里存在三个问题:1、直接闪回到顶部用户体验不是很好,很突兀 2、如1所说,那一个个往会显示,可是你有1000个item,我看到好几百个时,往回一个一个滚吗?相信没有人有那个耐心等 3、不能每次都从最后往会滚,从当前可见的第一个item滚,那么如何获取当前可见的第一个item?
对于第一个问题和第二个问题:我在异步任务里已经做了判断,先一个一个滚,滚到第十五个(也就是异步任务里的time)还没回去则直接回顶部,这样既有了滚动的动作,也不会因为有好多item让用户等待太久
对于第三个问题:首先在当前的activity里定义一个静态的变量,用来持续追踪当前可见的第一个item,然后通过监听lv滚动事件实时修改firstposition,这里贴出代码
lv.setOnScrollListener(newOnScrollListener() {
@Override
publicvoidonScrollStateChanged(AbsListView view,intscrollState) {
// TODO Auto-generated method stub
}
@Override
publicvoidonScroll(AbsListView view,intfirstVisibleItem,
intvisibleItemCount,inttotalItemCount) {
// TODO Auto-generated method stub
firstposition=firstVisibleItem;
}
});
好了,到这里就大功告成了,是不是很简单,之所以写的很详细,是想让看的人理解,而不是仅仅copy我的code,理解了就是自己的,方法很重要。
-
Android RecycleView悬浮按钮点击返回顶部
2021-06-02 22:30:16//获取到第一个item的显示的下标 不等于0表示第一个item处于不可见状态 说明列表没有滑动到顶部 显示回到顶部按钮 int firstVisibleItemPosition = manager.findFirstVisibleItemPosition(); // 当不滚动时 if (new...1、添加悬浮按钮
2、实例化
returnTop = view.findViewById(R.id.fab);
3、recycleView添加滑动事件
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull final RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//获得recyclerView的线性布局管理器
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
//获取到第一个item的显示的下标 不等于0表示第一个item处于不可见状态 说明列表没有滑动到顶部 显示回到顶部按钮
int firstVisibleItemPosition = manager.findFirstVisibleItemPosition();
// 当不滚动时
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
// 判断是否滚动超过一屏
if (firstVisibleItemPosition == 0) {
returnTop.hide();
} else {
//显示回到顶部按钮
returnTop.show();
returnTop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
recyclerView.scrollToPosition(0);
}
});
}//获取RecyclerView滑动时候的状态
}
// else if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {//拖动中
// returnTop.hide();
// }
}
});
RecyclerView有三个滑动状态:
当前的recycleView不滑动(滑动已经停止时) public static final int SCROLL_STATE_IDLE = 0;
当前的recycleView被拖动滑动 public static final int SCROLL_STATE_DRAGGING = 1;
当前的recycleView在滚动到某个位置的动画过程,但没有被触摸滚动.调用 scrollToPosition(int) 应该会触发这个状态 public static final int SCROLL_STATE_SETTLING = 2;
-
Node.js-AndroidListview返回顶部快速返回顶部的功能实现详解代码
2019-08-12 09:03:27【Android】Listview返回顶部,快速返回顶部的功能实现,详解代码 -
vue开发中遇到的坑之返回顶部,在Android端居然不能用的问题。
2020-05-15 16:03:14自己按照element-ui的思路写了一个返回顶部的公共居中,使用在移动端。在PC上的模拟器和IOS手机正常,在安卓上跑,居然没有效果。气死人了。 原因分析 document.documentElement.scrollTop在值,在安卓端,始终是0。... -
Android返回顶部实现
2017-02-17 09:36:50点击按钮返回顶部 -
Material Design系列之Behavior上滑显示返回顶部按钮
2020-09-01 16:01:46主要为大家详细介绍了Material Design系列之Behavior上滑显示返回顶部按钮的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
Android实现CoordinatorLayout、RecyclerView返回顶部效果
2018-11-14 16:43:25一、CoordinatorLayout返回顶部: CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) indexAppBar.getLayoutParams()).getBehavior(); if (behavior instanceof AppBarLa... -
Android 回到顶部
2021-07-23 20:20:30思路 这里以 RecyclerView为例,添加监听... 调用 public void updateUp(boolean flag) { if (flag) { //显示回到顶部按钮 test.setText("回顶部"); } else { //正常显示 test.setText("首页"); } } -
返回顶部按钮
2019-10-28 15:51:45在浏览多条数据时,如果浏览到数据的顶部,想返回到数据的顶部,只需要单击返回顶部按钮。 本代码将实现在页面中添加“返回顶部”按钮。 -
移动端H5页面返回顶部按钮无效问题的解决
2021-06-17 00:47:01一直都是在PC端写返回顶部的按钮,今天的项目是移动端,页面内容比较多,也有滚动顶部的功能,于是一开始用了原生的的写法,没有用,经过调试,滚动时获取不到滚动的高度。接着又换了一个gototop.js插件,还是无效,... -
【Android】Listview返回顶部,快速返回顶部的功能实现,详解代码。
2016-09-13 11:11:06首先给大家看一下我们今天这个最终实现的效果图...我这里只是单纯的实现了ListView返回顶部的功能。具体效果大家可以适当地美化 在实际项目中可以换图标,去掉右侧滚动条等。具体ui美化不做解释。 好了,首先我们是当 -
【Android】Scrollview返回顶部,快速返回顶部的功能实现,详解代码。
2016-09-12 10:25:25首先给大家看一下我们今天这个最终实现的效果...我这里只是单纯的实现了scrollview返回顶部的功能。具体效果大家可以适当地美化 在实际项目中可以换图标,去掉右侧滚动条等。具体ui美化不做解释。 好了,首先我们是当 -
安卓开发(6)-添加向上导航功能(顶部返回箭头)
2020-02-21 09:07:53也即是在每个逻辑子屏幕的顶部添加返回到逻辑父屏幕的箭头: 这个按钮叫做:向上导航按钮 我们一起来看看官网是怎么说的: 要添加向上按钮,您需要在 AndroidManifest.xml 文件中声明哪个 Activity 是逻辑父级。打开... -
js 返回顶部按钮
2021-01-12 10:59:26要求:当鼠标从顶部滚动后,显示返回顶部按钮,点击按钮,页面平滑滚动到顶部,按钮隐藏。1.css#scrollTop{position:fixed;bottom:20px;right:20px;height:0px;width:45px;line-height:45px;text-align:center;... -
Android之解决NestedScrollView嵌套RecyclerView部分手机返回到这个页面Recyclerview顶部,而不是页面...
2021-07-21 20:49:33NestedScrollView嵌套Recyclerview部分手机返回到这个页面Recyclerview顶部,而不是页面NestedScrollView顶部 部分布局大致如下 <androidx.core.widget.NestedScrollView android:layout_width="match_...