首页
网站首页
公司简介
资讯中心
推荐内容
返回顶部
你真的理解onMeasure了吗,安卓中的常用权限总结www.64222.com
发布时间:2020-03-02 02:42
浏览次数:

1.前提

当android内置view无法实现我们的需求,此刻我们需要自定义view来实现定制需求效果。自定义view主要是通过onMeasure、onLayout、onDraw等实现的。然而很多童鞋在onMeasure中存在很多疑惑,我们已经在xml布局中指明了宽高尺寸大小,为何还要在自定义view中获取宽高并指定宽高?

联网的权限

www.64222.com 1

2.什么是item复用

在我们写布局xml文件的时候,layout_width、layout_height等不需要写具体的尺寸大小,可以是wrap_content和match_content,它们并没有指定具体的尺寸大小,但是我们绘制view的时候是需要具体的尺寸大小,所以我们需要去处理并设置尺寸大小。

<android:name="android.permission.INTERNET"/>

https://github.com/xiaohaibin/XBanner

3.为什么会错乱

onMeasure,根据谷歌翻译字面意思是测量,继承view写这个方法的时候,我们可以发现此方法有两个参数分别为widthMeasureSpec,heightMeasureSpec。这两个参数是干嘛的呢?根据谷歌翻译字面意思分别是宽度测量规格、高度测量规格。这两个参数包含了宽度和高度的信息。具体信息是什么呢?勤快地童鞋会去百度查,主要是测量模式和尺寸大小。

写SD卡权限

  • 支持一屏显示多个
  • 支持根据服务端返回的数据动态设置广告条的总页数
  • 支持大于等于1页时的无限循环自动轮播、手指按下暂停轮播、抬起手指开始轮播
  • 支持自定义状态指示点位置 左 、中 、右
  • 支持自定义状态指示点
  • 支持监听 item 点击事件
  • 支持设置图片轮播间隔
  • 支持指示器背景的修改及隐藏/显示
  • 支持显示提示性文字功能
  • 支持图片切换动画,目前支持10种切换动画,具体可看demo
  • 支持设置图片切换速度
  • 支持设置数字指示器
  • 支持设置图片框架整体占位图
  • 支持Glide/Fresco等主流图片加载框架加载图片
  • 支持自定义布局

4.解决错乱

测量模式有三种

  • UNSPECIFIED
  • 父容器没有对当前View有任何限制,当前View可以任意取尺寸
  • EXACTLY
  • 当前尺寸就是当前View应该取的尺寸
  • AT_MOST
  • 当前尺寸是当前View能取的最大尺寸

那此测量模式跟我们写的xml布局文件中wrap_content、match_parent、固定的尺寸有什么对应关系呢?

  • wrap_content
  • 对应AT_MOST,如何理解?就是我们想要将大小设置为包裹我们的view内容,那么尺寸大小就是父View给我们作为参考的尺寸,只要不超过这个尺寸就可以啦,具体尺寸就根据我们的需求去设定。
  • match_parent
  • 对应EXACTLY,如何理解?就是要利用父View给我们提供的所有剩余空间,而父View剩余空间是确定的,也就是这个测量模式的整数里面存放的尺寸。
  • 固定尺寸
  • 对应EXACTLY,如何理解?用户自己指定了尺寸大小,我们就不用再去干涉了,当然是以指定的大小为主啦。

理论终究是理论,实践才能加深我们对此理解,接下来我们就自定义一个CustomView来验证理论是否正确?此处我们需要自定义一个默认尺寸大小布局属性,该怎么做呢?首先我们需要在res/values/styles.xml文件里面声明一个我们自定义的属性:

<resources> <!--name为声明的"属性集合"名,可以随便取,但是最好是设置为跟我们的View一样的名称--> <declare-styleable name="CustomView"> <!--声明我们的属性,名称为default_size,取值类型为尺寸类型--> <attr name="default_size" format="dimension" /> </declare-styleable></resources>

然后在布局文件用我们的自定义的属性,如下:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:andro xmlns:tools="http://schemas.android.com/tools" xmlns:ctv = "http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="cn.jianke.customview.MainActivity"> <cn.jianke.customview.CustomView android:layout_width="wrap_content" android:layout_height="100dp" android:background="@color/colorAccent" ctv:default_size="50dp"/></RelativeLayout>

注意:需要在根标签(RelativeLayout )里面设定命名空间,命名空间名称可以随便取,比如ctv,命名空间后面取得值是固定的:"http://schemas.android.com/apk/res-auto"。

最后在我们自定义View里面将我们自定义的属性值取出来,在构造函数中,有个AttributeSet属性,通过它我们可以把布局里面属性取出来,代码如下:

 public CustomView(Context context, AttributeSet attrs) { super(context, attrs); //第二个参数就是我们在styles.xml文件中的<declare-styleable>标签 //即属性集合的标签,在R文件中名称为R.styleable+name TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomView); //第一个参数为属性集合里面的属性,R文件名称:R.styleable+属性集合名称+下划线+属性名称 //第二个参数为,如果没有设置这个属性,则设置的默认的值 defaultSize = a.getDimensionPixelSize(R.styleable.CustomView_default_size, 100); //最后记得将TypedArray对象回收 a.recycle(); }

接下来我们就可以在onMeasure计算该view的大小,并在特定的测量模式下设置特定的尺寸大小值。onMeasure代码如下:

 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 获取合适的宽度值 int width = getProperSize(defaultSize, widthMeasureSpec); // 获取合适的高度值 int height = getProperSize(defaultSize, heightMeasureSpec); // 设置宽高尺寸大小值,此方法决定view最终的尺寸大小 setMeasuredDimension(width, height); } /** * 获取合适的大小 * @author leibing * @createTime 2016/09/19 * @lastModify 2016/09/19 * @param defaultSize 默认大小 * @param measureSpec 测量规格 * @return */ private int getProperSize(int defaultSize, int measureSpec){ int properSize = defaultSize; int mode = MeasureSpec.getMode(measureSpec); int size = MeasureSpec.getSize(measureSpec); switch { case MeasureSpec.UNSPECIFIED: // 没有指定大小,设置为默认大小 properSize = defaultSize; break; case MeasureSpec.EXACTLY: // 固定大小,无需更改其大小 properSize = size; break; case MeasureSpec.AT_MOST: // 此处该值可以取小于等于最大值的任意值,此处取最大值的1/4 properSize = size / 4; } return properSize; }

效果图如下(宽为wrap_content(宽度最大值的1/4),高度100dp):

www.64222.com 2CustomView.gif

大家理解onMeasure了吗?是不是很简单?大家动动手,一切会变得简单。

demo地址:CustomView Demo

  • qq:872721111
  • github:leibing@github
  • email:leibing1989@126.com

<android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

模式 效果图
指示器模式
数字模式 screenshot6.png
数字加标题模式 screenshot5.png
指示器加标题模式
标题模式
一屏多个模式

最近几日一直在忙于面试,各种奇奇怪怪的问题也让我明白了自己的一些不足。没办法,不懂就要学习,这也算是提高自己的一种方式吧。

读取电话状态的权限

dependencies { compile 'com.xhb:xbanner:latestVersion'//将latestVersion替换成上面 download 后面的版本号}

昨天面试一家直播app公司的时候面试官问了我这样一个问题:

<android:name="android.permission.READ_PHONE_STATE"/>

Add it in your root build.gradle at the end of repositories:

在一个listview里每个item中都有一个动画播放的view,当我点击item中的button时动画播放。当有动画播放时滑动listview,偶尔会发生item错位的事件。

问:原因是什么,如何解决?

手机重启的权限

allprojects { repositories { ... maven { url 'https://jitpack.io' } }}

当我听完这个问题后随口便说道“这是item复用的问题,由于异步加载导致图片错位”

<android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

Step 2. Add the dependency

对于接触Android一段时间的同学可能都应该知道listview优化时会用到item复用,但是原理可能不太清楚,接下来我们就来先说一下究竟什么是“item复用”

发送短信

dependencies { implementation 'com.github.xiaohaibin:XBanner:latestVersion'//将latestVersion替换成上面 jitpack 后面的版本号}

<uses-permission android:name="android.permission.INTERNET" />

 <com.stx.xhb.xbanner.XBanner xmlns:app="http://schemas.android.com/apk/res-auto" android: android:layout_width="match_parent" android:layout_height="180dp" app:AutoPlayTime="3000" app:pointsContainerBackground="#44aaaaaa" app:pointNormal="@drawable/shape_noraml" app:pointSelect="@drawable/shape_selected" app:pointsPosition="RIGHT" app:tipTextSize="12sp" app:isShowNumberIndicator="true" app:isShowIndicatorOnlyOne="true" app:pageChangeDuration="800"/>
友情链接: 网站地图
Copyright © 2015-2019 http://www.nflfreepicks.net. 新葡萄京娱乐场网址有限公司 版权所有