来主要看一下外边距的新属性:GONE MARGIN 以图 3为例,这里的gone margin指的是B向A添加约束后,如果A的可见性变为GONE,这时候B的外边距可以改变,也就是B的外边距根据...A的可见性分为两种状态。...可见性的表现 ConstraintLayout对可见性被标记View.GONE的控件(后称“GONE控件”)有特殊的处理。...上述代码对宽度和高度都进行了约束,通过H,指定高度受约束,所以高度的尺寸会根据宽度大小按照比例得到,其效果如图所示: ?...在SPREAD CHAIN中,外边距会从已经分配好的空间中去掉。原文如下: ?
相对定位 相对定位是在ConstraintLayout中创建布局的最基本构建块,也就是一个控件相对于另一个控件进行定位,可以从横向、纵向添加约束关系,用到的边分别有: 横向:Left、Right、Start...MARGIN 以图 3为例,这里的gone margin指的是B向A添加约束后,如果A的可见性变为GONE,这时候B的外边距可以改变,也就是B的外边距根据A的可见性分为两种状态。...可见性的表现 ConstraintLayout对可见性被标记View.GONE的控件(后称“GONE控件”)有特殊的处理。...,通过H,指定高度受约束,所以高度的尺寸会根据宽度大小按照比例得到,其效果如图所示: ?...在SPREAD CHAIN中,外边距会从已经分配好的空间中去掉。
其实这是由于TextView中的文字默认是居左上角对齐的,虽然TextView的宽度充满了整个屏幕,可是由于文字内容不够长,所以从效果上完全看不出来。...1.5 ProgressBar以及控件的可见性 英文组合 中文含义 android:visibility 控制文件的可见性,有不可见占大小、不可见不占大小、可见等分类 setVisibility() 活动中控制可见性的方法...我们还可以通过代码来设置控件的可见性,使用的是setVisibility() 方法,可以传入View.VISIBLE 、View.INVISIBLE 和View.GONE 这3种值。...,然后在代码中动态地更改进度条的进度。...重新运行程序,点击按钮后,效果如下图所示。 ?
我们就可以用父View的paddingLeft+均分后的值,就是第一个控件的初始left值。然后后面的控件依次向后排列即可。...ViewGroup中的子View View child = getChildAt(childIndex++); //跳过可见性为GONE的子...ViewGroup的宽度 int widthSize = MeasureSpec.getSize(widthMeasureSpec); //获取ViewGroup的宽度mode...//判断是否需要换行 if (measuredWidth + childWidth > rowLength) { //循环后,...就可获取,最后一行中第一个子View的index tempIndex = i; //获取单行的宽度 rowWidth
引用另一个小部件ID layout_constraintCircleRadius :到其他小部件中心的距离 layout_constraintCircleAngle :小部件应该处于哪个角度(以度为单位,从0...image.png 六、Visibility behavior 可见性行为 当一个View在ConstraintLayout中被设置为gone,那么你可以把它当做一个点(这个view所有的margin都将失效...image.png 从右侧的图片可以看出,按钮2里面的内容确实是在按钮1的内容的右侧.但是按钮2整个来说,却是没有整个的在按钮1的右侧....layout_constraintHorizontal_chainStyle或layout_constraintVertical_chainStyle链的第一个元素时,链的行为将根据指定的样式(默认值CHAIN_SPREAD)更改...比如在上面的栗子中,Barrier 应该在 姓名TextView 的右侧,因此这里取值right(也可end,可随意使用.这个right和end的问题,其实在RelativeLayout中就有体现,在RelativeLayout
FrameLayout会将所有子视图堆叠在同一个位置上,后添加的子视图会覆盖先前添加的子视图。...4.在代码中操作FrameLayout和子视图: 在代码中可以通过findViewById()方法获取FrameLayout和子视图的引用,并进行相应的操作,例如设置可见性、更改位置、监听点击事件等 FrameLayout...imageView.setVisibility(View.VISIBLE); textView.setVisibility(View.GONE); // 更改子视图的LayoutParams FrameLayout.LayoutParams...removeView(View child):从FrameLayout中移除指定的子视图。 removeAllViews():从FrameLayout中移除所有子视图。...getChildAt(int index):获取指定位置的子视图。 getChildCount():获取子视图的数量。
简单控件注意的地方 使用 android:gravity来指定文字的对齐方式, 可选值有 top、 bottom、 left、 right、 center等 ,可 以 用“|” 来 同时 指 定多 个值...gone则表示控件不仅不可见,而且不再占用任何屏幕空间。...我们还可以通过代码来设置控件的可见性,使用的是setVisibility()方法,可以传入 View.VISIBLE、View.INVISIBLE和 View.GONE三种值。...一个是从里往外撑,一个是从外往里撑 ScrollView ScrollView滚动视图是指当拥有很多内容,屏幕显示不完时,需要通过滚动跳来显示的视图。ScrollView只支持垂直滚动。...然在代码中动态地更改进度条的进度。
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。...也从源码角度彻底了解了为何会有如此表现。不仅要知其然,更要知其所以然。那么本篇呢,我们依然是来自定义View。与上一番外篇不同的是本章的重点放在ViewGroup上。...的宽度测量模式 int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);//获取父View传给MyTagFlowLayout的高度...//循环得到每一个子View,这个的child指向的实际是我们上面添加TextView View child = getChildAt(i); //View 可见性如果是...View.GONE,则忽略它 if (child.getVisibility() == View.GONE) continue; //得到子View的测量宽度和高度
后来经过定位,是在设置Visiblity的时候引起的,而且获取同一个控件宽高的时候发现位置和padding还有点关系,注释掉padding就没有这个问题。...//保存当前视图状态为old int old = mViewFlags; //更新视图状态为将要更改后的属性。...mViewFlags = (mViewFlags & ~mask) | (flags & mask); //获取其更改的属性位 int changed = mViewFlags...如果从VISIBLE切换到GONE的时候是不会有什么问题的,但是从GONE切换到VISIBLE的时候,会抢占焦点 3.问题解决 setPadding导致整个view重绘,使得原本处于屏幕中间的图不再处于正中间...而且往下挪的位置正好是padding的距离 4.总结 对于那些可滑动性的控件(ListView,RecycleView,ScrollView)而言,当内部控件设置为GONE和VISIBLE的时候,一定要注意重绘的问题
这两个属性的作用就是指定当前控件的宽度或高度是父控件的百分之多少。可设置的值在 0 - 1 之间,1 就是 100%。...设置头像的宽度占父控件宽度的 80%(父控件占满全屏)例子: <ImageView android:id="@+id/img_avatar" android:layout_width="...(无需加 @id/) barrierAllowsGoneWidgets:默认为 true,即当 Barrier 引用的控件被 <em>GONE</em> 掉时,则 Barrier 默认的创建行为是在已 <em>GONE</em> 掉控件的已解析位置上进行创建...Group Group 的作用就是控制一组控件的可<em>见性</em>。其可使用到的属性为: constraint_referenced_ids:指定所引用控件的 id。...当放置好 Placeholder <em>后</em>,可以通过 setContentId() 方法将占位符变为有效的视图。如果视图已经存在于屏幕上,那么视图将会<em>从</em>原有位置消失。
可见性改变后的行为处理 ( Visibility Behavior ) III ....可见性改变后的行为处理 ( Visibility Behavior ) 约束布局 组件 可见性说明 : 1.讨论情况 : 约束布局中 , 当组件被设置成 View.GONE 可见性时 , 针对该组件的处理方式...; 2.通常处理方案 ( 其它布局 ) : 被设置成 View.GONE 属性的组件 , 一般情况下进行如下处理 : ① 取消显示 : 首先其先取消显示 ; ② 布局移除 : 然后将该组件从布局中移除...属性布局截图 : 7.组件设置 GONE 属性后的说明 : ① 可见性与宽高 : 目标组件仍然在布局中存在 , 只是变成了一个点 , 宽高变成 0 , 不可见 ; ② 约束存在 : 目标组件的约束仍然有效...0 ; ---- 被 约束到不可见组件 后 Margin 属性 表现 当 被约束组件的某位置 ( Left, Right, Top, Bottom ) 被 约束到的目标组件可见性 ( Visibility
效果图 需求分析 网格布局显示本地图片 支持图片多选 支持选中的图片预览 未选择图片时不可预览 由已选多图变为无图时可退出图片选择页面 图片已选达到上限后依然可以跳转图片选择页面 第三方框架使用 史上最强的安卓图片选择器...具体实现 导入GalleryFinal源码 从GalleryFinal的Github仓库中拷贝仓库地址,使用git指令cloneGalleryFinal源代码到本地: git clone https...private FunctionConfig mFunctionConfig; // 核心配置 private CoreConfig mCoreConfig; // ------- 实现 ------- // 获取标题栏背景颜色...初步效果图 修改源码 通过运行调试,发现框架中有些功能与需求不一致,因此我产生了修改源码的想法,总结需要更改的原功能点如下: 选择完达到上限数量的图片后,无法重新回到图片选择页面 ?...refreshSelectCount方法源码 从源码中可以看到,预览按钮的可见性判断逻辑仅仅与isEnablePreview有关,而没有和选中的图片数量进行关联,所以我们修改代码如下: public
←键: 查看上一张图片; →键: 查看下一张图片; ↑键: 放大图片; ↓键: 缩小图片; Ctrl + 0 组合键: 缩小到初始大小; Ctrl + 1 组合键: 放大到原始大小; 配置参数 如果要更改全局默认选项...在函数体内返回标题array 第一个参数表示可见性(0-4) 第二个参数就是标题 toolbar Boolean / Number / Object true 标题栏是否显示和布局 0 或者 false...URL如果是一个字符串,应该图像元素的属性之一如果是一个函数,应该返回一个有效的图像URL container Element / String body 将查看器置于modal模式的容器 只有在 inline...为 false的时候才可以使用 filter Function null 过滤图像以便查看(如果图像是可见的,应该返回true) toggleOnDblclick Boolean true 当你放大或者缩小图片时...向右旋转图片的按钮 flipHorizontal 图片左右翻转的按钮 flipVertical 图片上下翻转的按钮 {key:number|Boolean} 显示或者隐藏对应key的按钮 为Number的时候为可见性
那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在代码中动态的更改它的可见性。这样的做法的优点是逻辑简单而且控制起来比较灵活。...虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源。 ...但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。 ...按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。 2....在程序的运行期间,某个布局在Inflate后,就不会有变化,除非重新启动。
对象应包含三个属性:X(X位置,相对于文档),Y(Y位置,相对于文档),W(元素的宽度)。高度会自动根据大的图像大小来计算。...在非模态模式,相对于视口模板的位置应该从x和y中减去。看常见问题以获取更多信息。...2意味着图像可以从原始尺寸被放大2倍。尽量避免在这里巨大的价值,因为过大的图像可以在移动导致内存问题(特别是在iOS)。...当手势完成后,画廊将关闭。 closeOnScroll boolean true 在页面滚动关闭画廊。选项可只是没有硬件支持触控设备。...看看常见问题以获取更多信息。
那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在代码中动态的更改它的可见性。这样的做法的优点是逻辑简单而且控制起来比较灵活。...虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源。...但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。...按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。 2....在程序的运行期间,某个布局在Inflate后,就不会有变化,除非重新启动。
在项目中,难免会遇到这种需求,在程序运行时需要动态根据条件来决定显示哪个View或某个布局,最通常的想法就是把需要动态显示的View都先写在布局中,然后把它们的可见性设为View.GONE,最后在代码中通过控制...View.VISIABLE动态的更改它的可见性。...但是它的缺点就是,耗费资源,虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。...下面我们从ViewStub源码来看下inflate()方法的实现原理: public View inflate() { final ViewParent viewParent = getParent...3.对ViewStub的inflate操作只能进行一次,因为inflate的时候是将它指向的布局实例化并替换掉当前ViewStub本身(由此体现出了ViewStub“占位”性质),一旦替换后,此时原来的布局文件中就没有
= GONE) { // 已用的宽度 int childUsedWidth = 0; // 已用的高度 int childUsedHeight...rightMargin, bottomMargin); } } 2)思路解析 首先我们重写onMeasure方法,在OnMeasure方法里面我们调用measureChild()这个方法去获取每个孩子的宽度和高度...left值,需要换行,更改top值 3)注意事项 讲解之前,我们先来了解一下一个基本知识 ?...,记录使用的宽度 lineWidth += child.getMeasuredWidth(); } /** * 获取行的高度...userWidth += horizontalSpacing; //如果当前行加上水平距离后超出父控件宽度,则换行 if (userWidth
最近项目中需要实现一个GridView显示6*5=30项,并铺满整个界面,界面中还有自定义ActionBar等其他控件,所以需要获取剩下屏幕的高度。...GridView的高度,在这个回调之前获取的高度都是0 //处理完后remove掉,至于为什么,后面有解释 gv_test.getViewTreeObserver() .removeOnGlobalLayoutListener...,调用一次 // tv_test.setVisibility(View.GONE); //改变文字布局,没有效果 // tv_test.setGravity(Gravity.CENTER);...经过测试,app退到后台后重新进入会调用一次,屏幕锁屏后重新打开会调用两次(小米两次,努比亚1次),其中一次猜测是控件的可见性改变了。...通过按键的测试,分别修改控件的可见性和布局,都会调用一次,修改控件内部布局,不会调用,同时修改布局和可见性,只调用一次。
app:layout_constrainedWidth=”true” 会导致渲染变慢,变慢时长可忽略不计。 b、例子 产品部的美女提出了这样的一个需求,看图: ?...A, B 两控件, B 在 A 的右侧,随着 A, B 宽度的增加, B 始终在 A 的右侧,当 A , B 控件的宽度之和大于父控件的宽度时, B 要求被完全显示,同时 A 被挤压。...4、goneMargin(隐藏边距) 当约束目标的可见性为 View.GONE时,还可以通过以下属性设置不同的边距值: layout_goneMarginStart layout_goneMarginEnd...姓名,联系方式位于 A 区域(随着文本的宽度变化 A 区域的宽度也随之变化),B 区域在 A 区域的右侧。使用传统的布局方式实现嵌套过多,布局不够优雅。...7、Group Group用于控制多个控件的可见性。 e.g: ? 若 android:visibility="gone" 那么 A,B 控件都会隐藏。
领取专属 10元无门槛券
手把手带您无忧上云