一个视图(View)在屏幕上占据了一块矩形区域,它负责渲染这块矩形区域(如将这块矩形区域变成其他颜色),也可以处理这块矩形区域发生的事件(如用户单击事件),并且可以设置这块区域是否可见、是否可以获取焦点等...目前Android中主要有六种布局,分别如下: LinearLayout(线性布局): 按照水平或垂直的顺序将子元素(可以是控件或布局)依次按照顺序排列,每一个元素都位于前面一个元素之后。...且单击向下键时获得焦点的组件ID android:nextFocusLeft setNextFocusLefUd(int) 设置焦点在该组件上,且单击向左键时获得焦点的组件ID android:nextFocusRight...setNextFocusRightld(int) 设置焦点在该组件上,且单击向右键时获得焦点的组件ID androidrnextFocusUp setNexlFocusUpId(int) 设置焦点在该组件上...当混合使用XML布局文件和代码来控制UI界面时,习惯上把变化小、行为比较固定的组件放在XML布局文件中管理,而那些变化较多、行为控制比较复杂的组件则交给Java代码来管理。
最近,公司开发的APP中要实现类似上滑解锁效果的推荐页,捣腾了两天,基本实现了效果,附效果图如上。接下来和大家聊聊如何实现这样的效果。...有效上滑 如上如,锁屏状态下,定义有效滑动阈值standardH,若上滑高度差超过standardH,则判断为有效滑动,布局滑动至屏幕顶部(不可见);否则如向下滑动、向上滑动距离不够等,都作为无效滑动...流畅滚动 LinearLayout本身是没有smoothScrollTo方法的,仅有的滚动方法只有scrollTo和scrollBy,但是这种滚动方法是突变的,不是线性的,想要实现smoothScrollTo...(伪)代码实现 首先按自定义控件的套路来,new一个类,继承LinearLayout,填充写好的布局,重写onTouch方法: public class PagerLayout extends LinearLayout...float curY = event.getY(); // 获取移动的y轴距离 float deltaY = curY - mDownY; // 阻止视图在原来位置时向下滚动
其中, scroll 表示当RecyclerView向上滚动时,Toolbar会跟着一起向上滚动并实现隐藏; enterAlways 表示当RecyclerView向下滚动时...,Toolbar会跟着一起向下滚动并重新显示; snap 表示当Toolbar还没有完全隐藏或显示时,会根据当前滚动的距离,自动选择是隐藏还是显示。...当AppBarLayout接收到滚动事件的时候,它内部的子控件是可以指定如何去影响这些事件的, 通过app:layout_scrollFlags属性就能实现。...其中, scroll表示当RecyclerView向上滚动时,Toolbar会跟着一起向上滚动并实现隐藏; enterAlways表示当RecyclerView向下滚动时,Toolbar会跟着一起向下滚动并重新显示...当用户需要操作Toolbar上的功能时,只需要轻微向下滚动,Toolbar就会重新出现。
特点 a):在相对的布局中主要就进行避免覆盖的问题,就是组件1可能会覆盖在组件2上; b):在相对的布局中在线性的orientation方向和权重在相对的布局中并不适用...通过 android:maxLines指定 EditText的最大行数为两行,这样当输入的内容超过两行时,文本就会向上滚动,而 EditText则不会再继续拉伸 如何才能让进度条在数据加载完成时消失呢?...一个是从里往外撑,一个是从外往里撑 ScrollView ScrollView滚动视图是指当拥有很多内容,屏幕显示不完时,需要通过滚动跳来显示的视图。ScrollView只支持垂直滚动。...1、ScrollView和HorizontalScrollView是为控件或者布局添加滚动条 2、上述两个控件只能有一个孩子,但是它并不是传统意义上的容器,但是可以不跟布局,如LinearLayout写它里面...,LinearLayout在写布局 3、上述两个控件可以互相嵌套 4、滚动条的位置现在的实验结果是:可以由layout_width和layout_height设定 5、ScrollView用于设置垂直滚动条
线性布局 线性布局LinearLayout是最常用的布局,顾名思义,它下面的子视图像是用一根线串了起来,所以其内部视图的排列是有顺序的,要么从上到下垂直排列,要么从左到右水平排列。...故而线性布局主要有以下两种属性设置方法: 1. setOrientation: 设置内部视图的排列方向。...> 与上述布局文件对应的页面Kotlin代码如下,根据不同的按钮分别设置不同方向上的margin和padding数值: //该页面用于演示...由于线性布局的视图排列方式比较固定,既不能重叠显示也不能灵活布局,因此复杂一些的界面往往用到相对布局RelativeLayout。...在代码中指定参照物及其所处方位,调用的是布局参数对象的addRule方法,方法格式形如“addRule(方位类型, 参照物的资源ID)”。
前几天在郭霖大神的博客上看了自定义View的知识,感觉受益良多,大神毕竟大神。...,单击“返回”键的时候提示并结束当前Activity,单击“操作”按钮的时候进行提示。...那么在接下来就可以在布局文件中使用这个组合控件了: acitivity_main.xml: 一个简单的竖向线性布局,其中有一个ImageView。...单击删除按钮: ? 单击恢复按钮: ? Ok,我们继承了FrameLayout并且为这个布局加了一个左右手势识别功能。
=> android.widget.LinearLayout => android.widget.RadioGroup RadioGroup 本身扩展了线性布局,它的功能比较单一,是为了保证多个...8.3.2.使用滚动条 当屏幕上控件的内容超过屏幕本身的尺寸时,一般可以通过出现滚动条(ScrollBar)供用户拖动来显示没有显示的内容。...android.view.ViewGroup => android.widget.FrameLayout => android.widget.ScrollView ScrollView 类通常在 XML 文件中使用,当屏幕上的内容预计超过屏幕尺寸时...的句柄,在其中用循环的方式增加了若干组(2-64)文本框和按钮,这样就形成了一个在界面上的长列表。...本例子的第一组文本框和按钮是在布局文件中指定的,其他是在代码中指定的。
1.垂直滚动:Scroll 新建一个应用程序: 在MainActivity的布局文件上做个实验,现在设置了按钮1和按钮2后还剩下一些空位: ? 再设置一个按钮3让他超出屏幕之外: ?...现在去运行程序,是滑动不了, 看不到按钮3的。 ? 应该如何设置呢?...> 运行程序,现在就可以向下滚动,看到按钮3了: ?...2.水平滚动:HorizontalScrollView 在LinearLayout里新建一个HorizontalScrollView,同样他的子元素只能有一个 ?...所以在HorizontalScrollView布局中再加一个子布局LinearLayout,且LinearLayout为水平方向: ? 代码如下: <?
extends LinearLayout implements OnTouchListener { /** * 滚动显示和隐藏左侧布局时,手指滑动需要达到的速度。...,当滚动到达左边界或右边界时,跳出循环。...让我们来想象一个场景,如果右侧布局是一个LinearLayout,我可以通过监听LinearLayout上的touch事件来控制左侧布局的显示和隐藏。...好了,我们的SlidingLayout写完了,接下来就是见证奇迹的时刻,让我们一起看看如何一分钟在Activity中引入滑动菜单功能。...2.ListView上下滚动时不会轻易滑出菜单。 3.正在滑动时屏蔽掉内容布局上的事件。 4.当菜单布局展示时,点击一下右侧的内容布局,可以将菜单隐藏。
1.布局优化工具 在讲到如何去布局优化前,我们先来学习两种布局优化的工具。...当然Hierarchy Viewer还可以查看某一个View的耗时,我们可以选择某一个View,然后单击下图红色箭头标识的按钮,这里我们把他简称为Layout Time按钮。 ?...单击Layout Time按钮后,就可以查看View的耗时情况了,如下图所示。 ?...当ViewStub调用inflate方法或者设置可见时,系统会加载ViewStub指定的布局,然后将这个布局添加到ViewStub中,因此,在对ViewStub调用inflate方法或者设置可见时,它是不占布局空间和系统资源的...在使用ViewStub时需要主要以下问题: ViewStub只能加载一次,加载后ViewStub对象会被置为空,这样当ViewStub引用的布局被加载后,就不能用ViewStub来控制引用的布局了。
定义布局是否可见 android:requiresFadingEdge 定义滚动时边缘是否褪色 android:clickable 定义是否可点击 android:longClickable 定义是否可长点击...LinearLayout又称作线性布局,是一种非常常用的布局。...这个布局会将它所包含的控件在线性方向上依次排列。 既然是线性排列,肯定就不仅只有一个方向,那为什么上一节中的控件都是在垂直方向排列的呢?...同样的道理,当LinearLayout的排列方向是vertical时,只有水平方向上的对齐方式才会生效。 LinearLayout中另一个重要的属性。...注意:当一个控件去引用另一个控件的id时,该控件一定要定义在引用控件的后面,不然会出现找不到id的情况。
> 最后就剩下简单的 主布局文件了,这个布局没有什么就是改了一下背景颜色 <?...super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * 判断当单击手机返回按钮时...,从手机顶部向下移动对话 * 再次单击返回按钮,对话框将从中间向底部移动消失对话框 */ @Override public boolean onKeyDown(int...keyCode, KeyEvent event) { //判断如果单击了返回按钮 if (keyCode == KeyEvent.KEYCODE_BACK) {...,单击确定按钮退出该应用 * 单击取消按钮,对话框将移动至底部消失 */ private void initEvent() { button_determine.setOnClickListener
我不建议把这个自定义控件用在对话框类型的activity上,因为前一个activity处于可见状态,可能会占用大量算力,导致动画效果不流畅,亲测。...原理 这种效果是通过自定义控件的方式来实现的,我自定义了一个控件类型,这个自定义控件(PullDownDumperLayout)继承自线性布局(LinearLayout) 。...当用户将隐藏头部下拉或上滑到一定高度时,这个效果就会被触发,这需要依赖上面所述的onTouch方法。...这里提个醒,在接下来的代码中,我们的自定义控件因为继承自LinearLayout,里面需要重写onLayout方法,而onLayout方法顾名思义就是布局,这个方法在Activity中的onCreate...; private long mSleepTime; /** * 初始化头部布局的偏移值,数值越大,头部可见部分越多,预设值为0,即初始时头部完全不可见 */ private int mTopMarginOffset
因此,我打开并开始录制,向下滚动列表一点,然后停止录制。...这就是我所看到的:DevTools / Performance 滚动"顶部链接站点"数据网格的性能配置文件,非常低的 FPS "任务"块上的那些红耳朵表明,在滚动时,某些东西需要的时间比可接受的时间要长...第 4 步 - 检查 DOM 不幸的是,DOM 在包含许多元素时不是很出色。如果是这样,则不需要在网络上各种流行的 JS 数据网格中实现虚拟化技术。在这一点上,一个有根据的猜测是,表呈现了很多元素。...通过在 DevTools 控制台上设置 实时表达式 您可以在元素面板中点击并找出答案, Console, 切换到 Create live expression 单击按钮 (the eye) 和 类型 $0...第 5 步 - 改善情况 基于性能配置文件中的数据,我怀疑在滚动网格时,整个页面都已布局。并且指出许多要素的成本很高。要是有办法限制效果就好了 ... ...
只不过由于多数情况用不到视图对象,因此在Kotlin中把冗余的视图入参给省略了,但是为了弄清楚按钮事件的来龙去脉,还是有必要观察一下它的本来面貌,接下来依次介绍按钮事件的三种Kotlin编码方式:匿名函数...在Java中,复合按钮CompoundButton的勾选状态有两个,setChecked和isChecked,前者用于设置是否勾选,后者用于判断是否勾选,但在Kotlin中这两个方法被统一成了isChecked...1.3 单选按钮RadioButton 单选按钮要在一组按钮中选择其中一项,并且不能多选,这要求有个容器确定这组按钮的范围,这个容器便是单选组RadioGroup,单选组RadioGroup实质上是一个布局...,该属性为vertical时,单选按钮就在垂直方向上排列,并且RadioGroup下面除了RadioButton外,也可以挂载其他子控件,如TextView、ImageView等,这样看来,它就是一个特殊的线性布局...,centerInside等同于fitCenter:当图片尺寸小于视图时,centerInside等同于center 然后代码来演示一遍 布局文件 <?
当点击了scrollTo按钮时,我们调用了LinearLayout的scrollTo()方法,当点击了scrollBy按钮时,调用了LinearLayout的scrollBy()方法。...可以看到,当我们点击scrollTo按钮时,两个按钮会一起向右下方滚动,因为我们传入的参数是-60和-100,因此向右下方移动是正确的。...里的每一个子控件在水平方向上进行布局。...接着重写onInterceptTouchEvent()方法, 在这个方法中我们记录了用户手指按下时的X坐标位置,以及用户手指在屏幕上拖动时的X坐标位置,当两者之间的距离大于TouchSlop值时,就认为用户正在拖动布局...如果当前事件是ACTION_UP时,说明用户手指抬起来了,但是目前很有可能用户只是将布局拖动到了中间,我们不可能让布局就这么停留在中间的位置,因此接下来就需要借助Scroller来完成后续的滚动操作。
更可气的是,在百度上搜索我文章的标题时,竟然先找到的是那些转载我文章的网站。唉,伤心了,看来还是谷歌比较正常。...,当滚动到达左边界或右边界时,跳出循环。...注意,在整个的滑动过程中,真正的左侧布局一直都是不可见的,我们所看到的只是它的一张镜像图片。...当整个滚动操作完成之后,才会将真正的左侧布局显示出来,再把镜像图片隐藏掉,这样用户就可以点击左侧布局上按钮之类的东西了。...第二个LinearLayout是右侧布局,里面放入了一个按钮和一个ListView,都是用于显示左侧布局而准备的。第三个是Image3dView,当然是用于在滑动过程中显示左侧布局的镜像图片了。
不过这种快速滚动方式比较丑陋,到后来很多手机厂商在定制自己ROM的时候都将默认快速滚动改成了类似iPhone上A-Z字母表快速滚动的方式。这里我们怎么能落后于时代的潮流呢!...另外还需要一个TextView,用于在弹出式分组布局上显示当前的分组,默认是gone掉的,只有手指在字母表上滑动时才让它显示出来。...首先通过字母表按钮的getHeight方法获取到字母表的总高度,然后用event.getY方法获取到目前手指在字母表上的纵坐标,用纵坐标除以总高度就可以得到一个用小数表示的当前手指所在位置(0表在#端,...,用于滚动时记录标识。...* 当手指按在字母表上时,展示弹出式分组。手指离开字母表时,将弹出式分组隐藏。
在开发中常常使用到刷新分页,这里实现一个 RecyclerView 的简单的刷新分页操作,测试效果见文末,实现过程参考如下: 实现思路 加载更多数据使用到 RecyclerView 加载多种布局,根据...firstVisibleItemPosition 为了能够在数据加载中动态判断什么时候加载数据,需要知道屏幕上显示的第一个可见的 Item 的位置,当然了这里使用的是布局管理器是 LinearLayoutManager...findLastVisibleItemPosition() 获得屏幕上最后一个可见 Item 的 position,只要该 Item 有一部分可见,那么返回的 position 就是该Item 的 position...findLastCompletelyVisibleItemPosition() 获得屏幕上最后一个完整可见的 Item 的 position,只要该 Item 有一部分不可见,那么返回的 position...ITEM_FOOTER: view = LayoutInflater.from(mContext).inflate(R.layout.item_footer,null); //使用代码设置宽高(xml布局设置无效时
我们是在Activity中编写Java/Kotlin的代码,在XML中编写布局代码,这种方式是我们已经使用了很久的方式,而Jetpack Compose完全抛弃了之前的方式,新创造了一种“使用代码”编写页面的方式...我们看到文字都堆叠在一起了,我们知道在XML布局中有LinearLayout、RelativeLayout等布局组件,那么在Compose中有哪些布局呢?...在上面的图中我们看到,两个Text紧紧的贴在一起了,在XML布局中我们可以使用padding或者margin来解决这个问题,在Compose中如何处理呢?以及我们如何为文字设置颜色、大小等样式呢?...可以看到,这样当点击“add”按钮时,文本的数值会不断增加。...它描述界面在特定状况下的状态,而不是在状态发生变化时移除界面组件或更改其可见性。调用重组并更新界面后,可组合项最终可能会进入或退出组合。
领取专属 10元无门槛券
手把手带您无忧上云