1.ScrollView使用介绍


首先来看google官方对他的介绍,翻译过来就是可以滚动的用户布局容器,如果手机显示不下子布局,那么可以使用scrollView,当然谷歌也说NestedscrollView已经提供了更好的用户体验,这个我们以后再详细总结下。

谷歌官方已经提示,不要在scrollView中添加RecyclerView或者是ListView布局,这样会引起不好的体验因为会有滑动冲突的问题出现。
另外,ScrollView的直接子View只能有一个。也就是说如果你的视图结构比较复杂,你需要一个标准的容器,如LinearLayoutRelativeLayout等。ScrollView只支持竖直滑动,水平滑动使HorizontalScrollView

先看布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"><ScrollView
android:id="@+id/vertical_scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
><include layout="@layout/scollview_item" /><include layout="@layout/scollview_item" /><include layout="@layout/scollview_item" /><include layout="@layout/scollview_item" /><include layout="@layout/scollview_item" /><include layout="@layout/scollview_item" /><include layout="@layout/scollview_item" /><include layout="@layout/scollview_item" /><include layout="@layout/scollview_item" /><include layout="@layout/scollview_item" /><include layout="@layout/scollview_item" /><include layout="@layout/scollview_item" /><include layout="@layout/scollview_item" /><include layout="@layout/scollview_item" /><include layout="@layout/scollview_item" /><include layout="@layout/scollview_item" /><include layout="@layout/scollview_item" /></LinearLayout>
</ScrollView></androidx.constraintlayout.widget.ConstraintLayout>

scrollviewItem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginBottom="10dp"
><ImageView
android:layout_height="64dp"
android:layout_width="64dp"
android:src="@drawable/vector_drawable_right"
/><TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="ScollViewItem"
android:textSize="21dp"
android:gravity="left|center_vertical"
android:layout_gravity="center"
/></LinearLayout>

效果图:


我是在scrollView中添加了一个LinearLayout,默认是垂直。
scrollView的大小是撑满了父布局。
在这里说一下,ScrollView是一种特殊的布局。当ScrollView的内容大于他本身的size的时候,ScrollView会自动添加滚动条,并可以竖直滑动。如果想要在子View高度小于ScrollView高度时占满,必需在xml里为ScrollView加上Android:fillViewport="true",这样子View小于ScrollView高度时就会占满父View.

在说下面之前,再介绍下scollview的其他特点:
scollview在滑动的时候默认是有滑动条的

android:scrollbars="vertical"//垂直滚动条
android:fadeScrollbars="false"//不隐藏
  • 如果只添加
android:scrollbars="vertical"

则只有在上下滑动页面的时候才会有垂直滚动条,停止滑动则滚动条消失。

如果不想显示滚动条:

android:scrollbars="none"

不想显示ScrollView拉到尽头(顶部、底部)出现的阴影效果,适用于2.3及以上的 否则不用设置.

android:overScrollMode="never"

2.Android ScrollView监听滑动到顶部和底部:

有需求才会有市场!

需求:典型的就是滚动到底部触发自动加载操作

整体思路:

1.自定义View

2.bottom_position - (getHeight() + getScrollY()) -getPaddingBottom

3.添加滑动到底部条件的回调监听

在这里简单说一下这几个方法:
getHeight():获得当前view的高度
getScrollX():Return the scrolled left position of this view
意思是返回当前滑动View左边界的位置,其实获取的值就是这块幕布在窗口左边界时的x坐标,而幕布上面哪个点是原点(0,0)呢?就是初始化时内容显示的位置。具体的可以看下面的这张图。
getScrollY()与这个类似,是获取窗口上边界时的y坐标,当然这两个值会随着滑动而变化。
这里如果在实践的时候log一下就会更清楚!

1.CustomScrollView.java

package com.example.myscollview;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.ScrollView;
public class CustomScrollView extends ScrollView {OnBottomReachedListener mListener;
public CustomScrollView(Context context) {super(context);
}
public CustomScrollView(Context context, AttributeSet attrs) {super(context, attrs);
}
public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);
}
//重点:
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {View view = getChildAt(getChildCount() - 1);
int diff = (view.getBottom() - (getHeight() + getScrollY())) -  view.getPaddingBottom();
Log.e("Bottom", String.valueOf(view.getBottom()));
Log.e("Height", String.valueOf(getHeight()));
Log.e("ScrollY", String.valueOf(getScrollY()));
Log.e("PaddingBottom", String.valueOf(view.getPaddingBottom()));
if (diff <= 0 && mListener != null) {mListener.onBottomReached();
}
super.onScrollChanged(l, t, oldl, oldt);
}
// Getters & Setters
public OnBottomReachedListener getOnBottomReachedListener() {return mListener;
}
public void setOnBottomReachedListener(
OnBottomReachedListener onBottomReachedListener) {mListener = onBottomReachedListener;
}
//Event listener.
public interface OnBottomReachedListener {public void onBottomReached();
}
}

2.MainActivity.java

package com.example.myscollview;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.View;
import android.widget.ScrollView;
import android.widget.Toast;public class MainActivity extends AppCompatActivity {private CustomScrollView scrollView;@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
scrollView = findViewById(R.id.vertical_scroll_view);scrollView.setOnBottomReachedListener(new CustomScrollView.OnBottomReachedListener() {@Override
public void onBottomReached() {Toast.makeText(MainActivity.this, "Has reached the bottom!", Toast.LENGTH_SHORT).show();
}
});
}
}

3.activity_main.xml

 <com.example.myscollview.CustomScrollViewandroid:id="@+id/vertical_scroll_view"android:layout_width="match_parent"android:layout_height="match_parent"android:scrollbars="none"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><include layout="@layout/scollview_item" />此处省略。。。。。。。。。。。</LinearLayout></com.example.myscollview.CustomScrollView>

肯定要结果图呀!!

上面说了怎么监听,下面再来说说怎么在某条件下滑动到顶部和底部

3.ScrollView滑动到顶部和底部

需求比如说点击某个btn自动滑动到顶部/底部

Android ScrollView滑动到顶部和底部:

  • Scrollview禁止滑动:
  scrollView.setOnTouchListener(new View.OnTouchListener() {@Override
public boolean onTouch(View view, MotionEvent motionEvent) {return true;
}});
  • 可滑动
scrollView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {return false;}});

滑动到底部

scrollView.post(new Runnable() {@Overridepublic void run() {//滑动底部scrollView.fullScroll(ScrollView.FOCUS_DOWN);}});

滑动到顶部

scrollView.post(new Runnable() {@Overridepublic void run() {//滑动顶部scrollView.fullScroll(ScrollView.FOCUS_UP);}});

滑动到某个位置

 scrollView.post(new Runnable() {@Overridepublic void run() {int offset = 100;//偏移值scrollView.smoothScrollTo(0, offset);}});

scrollview 遇到的坑:

android scrollview 滑不到最下面 ,在scrollview子view里面设置layout_margin之后就滑不到最下面,目前有效的解决办法不要在子view里面设置,在子view的子view里面设置。

参考:

ScrollView监听滑动到底部
Scrollview控制滑动到底部

最后还没完,来加个需求吧:ScrollView阻尼回弹效果!!下回再总结完善

Android之ScrollView详解相关推荐

  1. Android 动画框架详解,第 1 部分

    2019独角兽企业重金招聘Python工程师标准>>> Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果,本文将向读者阐述 Android 的动画框 ...

  2. Android 动画框架详解

    Android 动画框架详解 基本原理 朱 韦伟, 软件工程师, IBM 李 浩, 软件工程师, 爱格码 简介: Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果.A ...

  3. 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...

    本节书摘来自异步社区<Android游戏开发详解>一书中的第1章,第1.6节函数(在Java中称为"方法"更好),作者 [美]Jonathan S. Harbour,更 ...

  4. JMessage Android 端开发详解

    JMessage Android 端开发详解 目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 ...

  5. 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...

  6. Android事件流程详解

    Android事件流程详解 网络上有不少博客讲述了android的事件分发机制和处理流程机制,但是看过千遍,总还是觉得有些迷迷糊糊,因此特地抽出一天事件来亲测下,向像我一样的广大入门程序员详细讲述an ...

  7. Android Studio 插件开发详解二:工具类

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112856 本文出自[赵彦军的博客] 在插件开发过程中,我们按照开发一个正式的项 ...

  8. 《Android游戏开发详解》一2.16 区分类和对象

    本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.16节,作者: [美]Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社 ...

  9. Android Framework系统服务详解

    Android Framework系统服务详解 操作环境 系统:Linux (Ubuntu 12.04) 平台:高通 Android版本:5.1 PS: 符号...为省略N条代码 一.大致原理分析 A ...

最新文章

  1. 智能待办,让老师真正的快乐
  2. 关于对锐捷光交换机的使用
  3. Application与线程同步
  4. android电话api,Android电话信息相关API
  5. 什么是功能性需求和非功能性需求
  6. ParseFloat有超长的小数位数的解决
  7. Flex与.NET互操作(三):基于WebService的数据访问(下)
  8. Angular bootstrap的一个例子
  9. 数据结构——模式匹配kmp算法
  10. html中引入js柱状图,Echarts.js 图表在layui中的引用
  11. 重学TCP协议(7) Timestamps 选项
  12. 1245C. Constanze‘s Machine
  13. php 变量 可用拼音表示,php汉字转拼音的示例
  14. 计算机仿真电路实验感想,电路计算机仿真 实验报告.doc
  15. IIS——MIME介绍与添加MIME类型
  16. 工具的使用——vs2013
  17. java实现一个简单的打字游戏
  18. 词法分析器【编译原理】
  19. [汇编语言例题]计算地址连续的ffff:0~ffff:b单元中的数据的和(详解)
  20. 光辉岁月--beyond 献给麦德拉

热门文章

  1. Android 网络性能优化(2)DNS优化,安卓插件化开发
  2. ES6 Promise的理解
  3. SQL server热门资料汇总
  4. pdf怎么转成word?手机电脑均可一步转换
  5. 移动web中的常用技术选型
  6. 打开网页出现错误提示out of memory
  7. 将16进制数转换为8进制数输出——算法
  8. 第32章 开山收徒:成为尤达一样的大师
  9. 10. Windows窗体
  10. Ignite能替代mysql吗_IGNITE应用实践