android自定义view大小
‘壹’ Android中自定义View超出屏幕如何显示
在调用scrollBy之前做一下判断即可。
如果想要判断当前滚动到哪里的话,应该用getScrollX()和getScrollY
getLeft()拿到的是layout时的位置,scroll是不会改变view自身的layout的。
补充:自定义View里面显示一张图片,并且该View的尺寸大于屏幕的尺寸,要想看到被遮住的地方,只能上下左右那么滑屏来显示。如果使用ScrollView的话,不能斜着滑屏。
‘贰’ Android —— 自定义View中,你应该知道的知识点
在Android开发中,自定义View是实现特殊控件需求的关键手段。通过自定义View,开发者可以创造出满足特定功能和设计的控件,以丰富应用的用户体验。下面,我们将深入探讨自定义View的相关知识点。
首先,了解Android的控件架构。在Android中,控件可以分为ViewGroup和View两大类。ViewGroup用于包含多个View,管理它们的绘制、测量和交互,而View则负责显示内容。在Activity的控件树中,从顶层开始,负责调度事件的ViewParent对象是控件树的核心。Activity通过setContentView()方法加载布局,DecorView作为根View,位于顶层,将显示内容呈现给用户。DecorView分为TitleView和ContentView两部分,其中ContentView通过Framelayout作为根布局加载布局文件。
了解View的绘制时机。View的第一次绘制通常发生在Activity启动时,即onCreate()方法执行后,通过setContentView()方法加载布局。此外,当View树发生改变,或主动调用invalidate()方法时,也会触发View的绘制。
在Activity中调用setContentView()方法开始加载顶级View,即DecorView,这个过程通过PhoneWindow中的installDecor()方法实现。在DecorView初始化后,开始执行View的工作流程。当Activity进入Resume状态时,ViewRootImpl实例开始工作,执行measure、layout和draw方法,完成View的绘制。
View的测量大小发生在measure()方法中,用于决定View的实际尺寸。measure方法分为View和ViewGroup两种实现,其中View只测量自身大小,而ViewGroup还需测量子View的大小。MeasureSpec用于封装View的测量规格,包括宽度、高度和测量模式。在测量过程中,MeasureSpec通过makeMeasureSpec()方法生成,获取模式和尺寸信息。
对于自定义FlowLayout,需要解决尺寸设置、子View布局和绘制UI元素的问题。通常,这在onMeasure()、onLayout()和onDraw()方法中完成。在onMeasure()方法中,FlowLayout需要递归测量子View,并计算最终高度。而在onLayout()方法中,定义子View的显示位置。
在一道滴滴面试题中,分析了Activity内根布局LinearLayout和包含View的尺寸属性。通过理解LinearLayout的onMeasure()方法和子View的测量过程,最终确定了界面颜色为蓝色。这个问题展示了对自定义View测量过程的理解和应用。
自定义View的学习资源可以通过阅读相关书籍、参考官方文档和探索开源项目获取。掌握自定义View的知识,将为Android开发者提供更广阔的创作空间和更丰富的应用体验。
‘叁’ Android 自定义View:为什么你设置的wrap_content不起作用
在使用自定义View时,View宽 / 高的 wrap_content 属性不起自身应有的作用,而且是起到与 match_parent 相同作用。
其实这里有两个问题:
请分析 & 解决问题之前,请先看自定义View原理中 (2)自定义View Measure过程 - 最易懂的自定义View原理系列
问题出现在View的宽 / 高设置,那我们直接来看自定义View绘制中第一步对View宽 / 高设置的过程:measure过程中的 onMeasure() 方法
继续往下看 getDefaultSize()
从上面发现:
那么有人会问:wrap_content和match_parent具有相同的效果,为什么是填充父容器的效果呢?
我们知道,子View的MeasureSpec值是根据子View的布局参数(LayoutParams)和父容器的MeasureSpec值计算得来,具体计算逻辑封装在getChildMeasureSpec()里。
接下来,我们看生成子View MeasureSpec的方法: getChildMeasureSpec() 的源码分析:
getChildMeasureSpec()
从上面可以看出,当子View的布局参数使用 match_parent 或 wrap_content 时:
所以: wrap_content 起到了和 match_parent 相同的作用:等于父容器当前剩余空间大小
当自定义View的布局参数设置成wrap_content时时,指定一个默认大小(宽 / 高)。
这样,当你的自定义View的宽 / 高设置成wrap_content属性时就会生效了。
网上流传着这么一个解决方案:
答: 是,当父View为 AT_MOST 、View为 match_parent 时,该View的 match_parent 的效果就等于 wrap_content 。上述方法存在逻辑错误,但由于这种情况非常特殊的,所以导致最终的结果没有错误。具体分析请看下面例子:
从上面的效果可以看出,View大小 = 默认值
我再将子View的属性改为 wrap_content :
从上面的效果可以看出,View大小还是等于默认值。
相信看到这里你已经看懂了:
为了更好的表示判断逻辑,我建议你们用本文提供的解决方案,即根据布局参数判断默认值的设置
不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度 。
‘肆’ android 自定义view 怎么设置其宽度和高度
自定义View 可以设置iji的布局,
1.在布局中设置宽高
2.在ondraw方法中绘制的view设置宽高
3.LayoutInflater设置宽高
‘伍’ Android自定义ViewGroup内的View布局奇怪问题
您好,问题不奇怪,TextView的尺寸是会变小。这样解释:
控件有两类非常重要的属性,坐标:x,y; 尺寸:width,height.
控件其实是一些矩形框,这两类属性确定了后,就可以在Canvas上画出这个矩形了。清楚这一点后,
就要知道android 怎么确定X,Y和宽,高。
X,Y:是控件在父控件中的坐标
宽高没什么好讲的,就是矩形的宽和高,
android通过View 的onLayout()确定控件在父控件中XY;通过onMeasure()确定控件宽高,想象一下一个控件树(xml 布局文件),从根节点开始,根节点XY和宽高通过窗口屏幕大小确定,它确定了后,依次调用其子节点的onLayout(),onMeasure()来确定子节点在父节点中的坐标和尺寸。就是android LayoutInflater整个过程了。(其他窗口系统的这个过程基本一样)
理解这个后,就应该知道,控件的坐标和父控件有关;子控件尺寸,如果子控件有fill_parent这样的属性,那么它的尺寸也和父控件有关了。