Android(安卓)样式的开发
- rectangle: 矩形,默认的形状,可以画出直角矩形、圆角矩形、弧形等
- oval: 椭圆形,用得比较多的是画正圆
- line: 线形,可以画实线和虚线
- ring: 环形,可以画环形进度条
rectangle
-
solid: 设置形状填充的颜色,只有android:color一个属性
- android:color 填充的颜色
-
padding: 设置内容与形状边界的内间距,可分别设置左右上下的距离
- android:left 左内间距
- android:right 右内间距
- android:top 上内间距
- android:bottom 下内间距
-
gradient: 设置形状的渐变颜色,可以是线性渐变、辐射渐变、扫描性渐变
- android:type 渐变的类型
- linear 线性渐变,默认的渐变类型
- radial 放射渐变,设置该项时,android:gradientRadius也必须设置
- sweep 扫描性渐变
- android:startColor 渐变开始的颜色
- android:endColor 渐变结束的颜色
- android:centerColor 渐变中间的颜色
- android:angle 渐变的角度,线性渐变时才有效,必须是45的倍数,0表示从左到右,90表示从下到上
- android:centerX 渐变中心的相对X坐标,放射渐变时才有效,在0.0到1.0之间,默认为0.5,表示在正中间
- android:centerY 渐变中心的相对X坐标,放射渐变时才有效,在0.0到1.0之间,默认为0.5,表示在正中间
- android:gradientRadius 渐变的半径,只有渐变类型为radial时才使用
- android:useLevel 如果为true,则可在LevelListDrawable中使用
- android:type 渐变的类型
-
corners: 设置圆角,只适用于rectangle类型,可分别设置四个角不同半径的圆角,当设置的圆角半径很大时,比如200dp,就可变成弧形边了
- android:radius 圆角半径,会被下面每个特定的圆角属性重写
- android:topLeftRadius 左上角的半径
- android:topRightRadius 右上角的半径
- android:bottomLeftRadius 左下角的半径
- android:bottomRightRadius 右下角的半径
-
stroke: 设置描边,可描成实线或虚线。
- android:color 描边的颜色
- android:width 描边的宽度
- android:dashWidth 设置虚线时的横线长度
- android:dashGap 设置虚线时的横线之间的距离
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> android:color="#2F90BD" /> android:bottom="12dp" android:left="12dp" android:right="12dp" android:top="12dp" /> android:radius="200dp" /> android:width="2dp" android:color="@android:color/darker_gray" android:dashGap="4dp" android:dashWidth="4dp" />
android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="8dp" android:text="加了虚线描边的矩形" android:textSize="16sp" android:textColor="@android:color/white" android:background="@drawable/bg_rectangle_with_stroke_dash" />
oval
- size: 设置形状默认的大小,可设置宽度和高度
- android:width 宽度
- android:height 高度
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> android:bottom="4dp" android:left="4dp" android:right="4dp" android:top="4dp" /> android:width="40dp" android:height="40dp" /> android:endColor="#000000" android:gradientRadius="40dp" android:startColor="#FFFFFF" android:type="radial" />
android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:layout_margin="8dp" android:text="6" android:textSize="20sp" android:textColor="@android:color/black" android:background="@drawable/bg_oval_with_gradient" />
line
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line"> android:width="1dp" android:color="#2F90BD" android:dashGap="2dp" android:dashWidth="4dp" /> android:height="4dp" />
- 只能画水平线,画不了竖线;
- 线的高度是通过stroke的android:width属性设置的;
- size的android:height属性定义的是整个形状区域的高度;
- size的height必须大于stroke的width,否则,线无法显示;
- 线在整个形状区域中是居中显示的;
- 线左右两边会留有空白间距,线越粗,空白越大;
- 引用虚线的view需要添加属性android:layerType,值设为"software",否则显示不了虚线。
ring
- android:innerRadius 内环的半径
- android:innerRadiusRatio 浮点型,以环的宽度比率来表示内环的半径,默认为3,表示内环半径为环的宽度除以3,该值会被android:innerRadius覆盖
- android:thickness 环的厚度
- android:thicknessRatio 浮点型,以环的宽度比率来表示环的厚度,默认为9,表示环的厚度为环的宽度除以9,该值会被android:thickness覆盖
- android:useLevel 一般为false,否则可能环形无法显示,只有作为LevelListDrawable使用时才设为true
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" android:innerRadiusRatio="3" android:shape="ring" android:thicknessRatio="9" android:useLevel="false"> android:endColor="#2F90BD" android:startColor="#FFFFFF" android:type="sweep" /> android:width="1dp" android:color="@android:color/black" />
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:toDegrees="1080.0"> android:innerRadiusRatio="3" android:shape="ring" android:thicknessRatio="8" android:useLevel="false"> android:endColor="#2F90BD" android:startColor="#FFFFFF" android:type="sweep" />
- android:state_enabled: 设置触摸或点击事件是否可用状态,一般只在false时设置该属性,表示不可用状态
- android:state_pressed: 设置是否按压状态,一般在true时设置该属性,表示已按压状态,默认为false
- android:state_selected: 设置是否选中状态,true表示已选中,false表示未选中
- android:state_checked: 设置是否勾选状态,主要用于CheckBox和RadioButton,true表示已被勾选,false表示未被勾选
- android:state_checkable: 设置勾选是否可用状态,类似state_enabled,只是state_enabled会影响触摸或点击事件,而state_checkable影响勾选事件
- android:state_focused: 设置是否获得焦点状态,true表示获得焦点,默认为false,表示未获得焦点
- android:state_window_focused: 设置当前窗口是否获得焦点状态,true表示获得焦点,false表示未获得焦点,例如拉下通知栏或弹出对话框时,当前界面就会失去焦点;另外,ListView的ListItem获得焦点时也会触发true状态,可以理解为当前窗口就是ListItem本身
- android:state_activated: 设置是否被激活状态,true表示被激活,false表示未激活,API Level 11及以上才支持,可通过代码调用控件的setActivated(boolean)方法设置是否激活该控件
- android:state_hovered: 设置是否鼠标在上面滑动的状态,true表示鼠标在上面滑动,默认为false,API Level 14及以上才支持
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android"> - android:drawable="@drawable/bg_btn_lost_window_focused" android:state_window_focused="false" />
- android:drawable="@drawable/bg_btn_disable" android:state_enabled="false" />
- android:drawable="@drawable/bg_btn_pressed" android:state_pressed="true" />
- android:drawable="@drawable/bg_btn_selected" android:state_selected="true" />
- android:drawable="@drawable/bg_btn_activated" android:state_activated="true" />
- android:drawable="@drawable/bg_btn_normal" />
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android"> - android:color="@android:color/black" android:state_window_focused="false" />
- android:color="@android:color/background_light" android:state_enabled="false" />
- android:color="@android:color/holo_blue_light" android:state_pressed="true" />
- android:color="@android:color/holo_green_dark" android:state_selected="true" />
- android:color="@android:color/holo_green_light" android:state_activated="true" />
- android:color="@android:color/white" />
- selector作为drawable资源时,item指定android:drawable属性,并放于drawable目录下;
- selector作为color资源时,item指定android:color属性,并放于color目录下;
- color资源也可以放于drawable目录,引用时则用@drawable来引用,但不推荐这么做,drawable资源和color资源最好还是分开;
- android:drawable属性除了引用@drawable资源,也可以引用@color颜色值;但android:color只能引用@color;
- item是从上往下匹配的,如果匹配到一个item那它就将采用这个item,而不是采用最佳匹配的规则;所以设置默认的状态,一定要写在最后,如果写在前面,则后面所有的item都不会起作用了。
- android:enterFadeDuration 状态改变时,新状态展示时的淡入时间,以毫秒为单位
- android:exitFadeDuration 状态改变时,旧状态消失时的淡出时间,以毫秒为单位
- android:listSelector设置的ListItem默认背景是透明的,不管你在selector里怎么设置都无法改变它的背景。所以,如果想改ListItem的默认背景,只能通过第二种方式,在ListItem的布局layout里设置android:background。
- 当触摸点击ListItem时,第一种设置方式下,state_pressed、state_focused和state_window_focused设为true时都会触发,而第二种设置方式下,只有state_pressed会触发。
-
当ListItem里有Button或CheckBox之类的控件时,会抢占ListItem本身的焦点,导致ListItem本身的触摸点击事件会无效。那么,要解决此问题,有三种解决方案:
- 将Button或CheckBox换成TextView或ImageView之类的控件
- 设置Button或CheckBox之类的控件设置focusable属性为false
- 设置ListItem的根布局属性android:descendantFocusability="blocksDescendants"
第三种是最方便,也是推荐的方式,它会将ListItem根布局下的所有子控件都设置为不能获取焦点。android:descendantFocusability属性的值有三种,其中,ViewGroup是指设置该属性的View,本例中就是ListItem的根布局:
- beforeDescendants:ViewGroup会优先其子类控件而获取到焦点
- afterDescendants:ViewGroup只有当其子类控件不需要获取焦点时才获取焦点
- blocksDescendants:ViewGroup会覆盖子类控件而直接获得焦点
layer-list篇
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android"> - android:state_checked="true">
android:color="#E4007F" /> - android:bottom="4dp" android:drawable="@android:color/white" />
android:color="#E4007F" /> - android:bottom="1dp" android:drawable="@android:color/white" />
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android"> - android:left="2dp" android:top="4dp">
android:color="@android:color/darker_gray" /> android:radius="10dp" /> - android:bottom="4dp" android:right="2dp">
android:color="#FFFFFF" /> android:radius="10dp" />
- android:top 顶部的偏移量
- android:bottom 底部的偏移量
- android:left 左边的偏移量
- android:right 右边的偏移量
- 根节点不同时,可设置的属性是会不同的,比如selector下,可以设置一些状态属性,而在layer-list下,可以设置偏移量;
- 就算父节点同样是selector,放在drawable目录和放在color目录下可用的属性也会不同,比如drawable目录下可用的属性为android:drawable,在color目录下可用的属性为android:color;
- item的子节点可以为任何类型的drawable类标签,除了上面例子中的shape、color、layer-list,也可以是selector,还有其他没讲过的bitmap、clip、scale、inset、transition、rotate、animated-rotate、lever-list等等。
普通图片
密度分类 | 密度值范围 | 代表分辨率 | 图标尺寸 | 图片比例 |
---|---|---|---|---|
mdpi | 120~160dpi | 320x480px | 48x48px | 1 |
hdpi | 160~240dpi | 480x800px | 72x72px | 1.5 |
xhdpi | 240~320dpi | 720x1280px | 96x96px | 2 |
xxhdpi | 320~480dpi | 1080x1920px | 144x144px | 3 |
xxxhdpi | 480~640dpi | 1440x2560px | 192x192px | 4 |
bitmap标签
- android:src 必填项,指定图片资源,只能是图片,不能是xml定义的drawable资源
-
android:gravity 设置图片的对齐方式,比如在layer-list中,默认会尽量填满整个视图,导致图片可能会被拉伸,为了避免被拉伸,就可以设置对齐方式,可取值为下面的值,多个取值可以用 | 分隔:
- top 图片放于容器顶部,不改变图片大小
- bottom 图片放于容器底部,不改变图片大小
- left 图片放于容器左边,不改变图片大小
- right 图片放于容器右边,不改变图片大小
- center 图片放于容器中心位置,包括水平和垂直方向,不改变图片大小
- fill 拉伸整张图片以填满容器的整个高度和宽度,默认值
- center_vertical 图片放于容器垂直方向的中心位置,不改变图片大小
- center_horizontal 图片放于容器水平方向的中心位置,不改变图片大小
- fill_vertical 在垂直方向上拉伸图片以填满容器的整个高度
- fill_horizontal 在水平方向上拉伸图片以填满容器的整个宽度
- clip_vertical 附加选项,裁剪基于垂直方向的gravity设置,设置top时会裁剪底部,设置bottom时会裁剪顶部,其他情况会同时裁剪顶部和底部
- clip_horizontal 附加选项,裁剪基于水平方向的gravity设置,设置left时会裁剪右侧,设置right时会裁剪左侧,其他情况会同时裁剪左右两侧
-
android:antialias 设置是否开启抗锯齿
-
android:dither 设置是否抖动,图片与屏幕的像素配置不同时会用到,比如图片是ARGB 8888的,而屏幕是RGB565
-
android:filter 设置是否允许对图片进行滤波,对图片进行收缩或者延展使用滤波可以获得平滑的外观效果
-
android:tint 给图片着色,比如图片本来是黑色的,着色后可以变成白色
-
android:tileMode 设置图片平铺的方式,取值为下面四种之一:
- disable 不做任何平铺,默认设置
- repeat 图片重复铺满
- mirror 使用交替镜像的方式重复图片的绘制
- clamp 复制图片边缘的颜色来填充容器剩下的空白部分,比如引入的图片如果是白色的边缘,那么图片所在的容器里除了图片,剩下的空间都会被填充成白色
-
android:alpha 设置图片的透明度,取值范围为0.0~1.0之间,0.0为全透明,1.0为全不透明,API Level最低要求是11,即Android 3.0
-
android:mipMap 设置是否可以使用mipmap,但API Level最低要求是17,即Android 4.2
-
android:autoMirrored 设置图片是否需要镜像反转,当布局方向是RTL,即从右到左布局时才有用,API Level 19(Android 4.4)才添加的属性
-
android:tileModeX 和tileMode一样设置图片的平铺方式,只是这个属性只设置水平方向的平铺方式,这是API Level 21(Android 5.0)才添加的属性
-
android:tileModeY 和tileMode一样设置图片的平铺方式,只是这个属性只设置垂直方向的平铺方式,这是API Level 21(Android 5.0)才添加的属性
-
android:tintMode 着色模式,也是API Level 21(Android 5.0)才添加的属性
点九图片
nine-patch标签
- android:src 必填项,必须指定点九类型的图片
- android:dither 设置是否抖动,图片与屏幕的像素配置不同时会用到,比如图片是ARGB 8888的,而屏幕是RGB565
- android:tint 给图片着色,比如图片本来是黑色的,着色后可以变成白色
- android:tintMode 着色模式,API Level 21(Android 5.0)才添加的属性
- android:alpha 设置图片的透明度,取值范围为0.0~1.0之间,0.0为全透明,1.0为全不透明,API Level最低要求是11
- android:autoMirrored 设置图片是否需要镜像反转,当布局方向是RTL,即从右到左布局时才有用,API Level 19(Android 4.4)才添加的属性
color标签
xmlns:android="http://schemas.android.com/apk/res/android" android:color="#FFFFFF" />
name="white">#FFFFFF
inset标签
- android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
- android:visible 设置初始的可见性状态,默认为false
- android:insetLeft 左边距
- android:insetRight 右边距
- android:insetTop 顶部边距
- android:insetBottom 底部边距
- android:inset 设置统一边距,会覆盖上面四个属性,但API Level要求为21,即Android 5.0
clip标签
- android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
-
android:clipOrientation 设置裁剪的方向,取值为以下两个值之一:
- horizontal 在水平方向上进行裁剪,条状的进度条就是水平方向的裁剪
- vertical 在垂直方向上进行裁剪
-
android:gravity 设置裁剪的位置,可取值如下,多个取值用 | 分隔:
- top 图片放于容器顶部,不改变图片大小。当裁剪方向为vertical时,会裁掉图片底部
- bottom 图片放于容器底部,不改变图片大小。当裁剪方向为vertical时,会裁掉图片顶部
- left 图片放于容器左边,不改变图片大小,默认值。当裁剪方向为horizontal,会裁掉图片右边部分
- right 图片放于容器右边,不改变图片大小。当裁剪方向为horizontal,会裁掉图片左边部分
- center 图片放于容器中心位置,包括水平和垂直方向,不改变图片大小。当裁剪方向为horizontal时,会裁掉图片左右部分;当裁剪方向为vertical时,会裁掉图片上下部分
- fill 拉伸整张图片以填满容器的整个高度和宽度。这时候图片不会被裁剪,除非level设为了0,此时图片不可见
- center_vertical 图片放于容器垂直方向的中心位置,不改变图片大小。裁剪和center时一样
- center_horizontal 图片放于容器水平方向的中心位置,不改变图片大小。裁剪和center时一样
- fill_vertical 在垂直方向上拉伸图片以填满容器的整个高度。当裁剪方向为vertical时,图片不会被裁剪,除非level设为了0,此时图片不可见
- fill_horizontal 在水平方向上拉伸图片以填满容器的整个宽度。当裁剪方向为horizontal时,图片不会被裁剪,除非level设为了0,此时图片不可见
- clip_vertical 附加选项,裁剪基于垂直方向的gravity设置,设置top时会裁剪底部,设置bottom时会裁剪顶部,其他情况会同时裁剪顶部和底部
- clip_horizontal 附加选项,裁剪基于水平方向的gravity设置,设置left时会裁剪右侧,设置right时会裁剪左侧,其他情况会同时裁剪左右两侧
-
定义clip.xml:
<?xml version="1.0" encoding="utf-8"?>
xmlns:android="http://schemas.android.com/apk/res/android" android:clipOrientation="horizontal" android:drawable="@drawable/img4clip" android:gravity="left" /> -
在ImageView中引用:
android:id="@+id/img" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bg_img" android:src="@drawable/clip" /> -
在代码中设置level:
ImageView img = (ImageView) findViewById(R.id.img);img.getDrawable().setLevel(5000); //level范围值0~10000
scale标签
- android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
- android:scaleHeight 设置可缩放的高度,用百分比表示,格式为XX%,0%表示不做任何缩放,50%表示只能缩放一半
- android:scaleWidth 设置可缩放的宽度,用百分比表示,格式为XX%,0%表示不做任何缩放,50%表示只能缩放一半
- android:scaleGravity 设置drawable缩放后的位置,取值和bitmap标签的一样,就不一一列举说明了,不过默认值是left
- android:useIntrinsicSizeAsMinimum 设置drawable原有尺寸作为最小尺寸,设为true时,缩放基本无效,API Level最低要求为11
-
定义scale.xml:
<?xml version="1.0" encoding="utf-8"?>
xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/img4scale" android:scaleGravity="left" android:scaleHeight="50%" android:scaleWidth="50%" android:useIntrinsicSizeAsMinimum="false" /> -
在ImageView中引用:
android:id="@+id/img" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bg_img" android:src="@drawable/scale" /> -
在代码中设置level:
ImageView img = (ImageView) findViewById(R.id.img);img.getDrawable().setLevel(5000); //level范围值0~10000
level-list标签
- android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
- android:minLevel 该item的最小level值
- android:maxLevel 该item的最大level值
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android"> - android:drawable="@drawable/battery_low" android:maxLevel="10" android:minLevel="0" />
- android:drawable="@drawable/battery_below_half" android:maxLevel="50" android:minLevel="10" />
- android:drawable="@drawable/battery_over_half" android:maxLevel="99" android:minLevel="50" />
- android:drawable="@drawable/battery_full" android:maxLevel="100" android:minLevel="100" />
img.getDrawable().setLevel(10);
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android"> - android:drawable="@drawable/battery_low" android:maxLevel="10" />
- android:drawable="@drawable/battery_below_half" android:maxLevel="50" />
- android:drawable="@drawable/battery_over_half" android:maxLevel="99" />
- android:drawable="@drawable/battery_full" android:maxLevel="100" />
transition标签
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android"> - android:drawable="@drawable/on" />
- android:drawable="@drawable/off" />
((TransitionDrawable)drawable).startTransition(500); //正向切换,即从第一个drawable切换到第二个((TransitionDrawable)drawable).reverseTransition(500); //逆向切换,即从第二个drawable切换回第一个
rotate标签
- android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
- android:fromDegrees 起始的角度度数
- android:toDegrees 结束的角度度数,正数表示顺时针,负数表示逆时针
- android:pivotX 旋转中心的X坐标,浮点数或是百分比。浮点数表示相对于drawable的左边缘距离单位为px,如5; 百分比表示相对于drawable的左边缘距离按百分比计算,如5%; 另一种百分比表示相对于父容器的左边缘,如5%p; 一般设置为50%表示在drawable中心
- android:pivotY 旋转中心的Y坐标
- android:visible 设置初始的可见性状态,默认为false
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/ic_arrow" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:toDegrees="180" />
animation-list标签
<?xml version="1.0" encoding="utf-8"?> xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">- android:drawable="@drawable/anim1" android:duration="1000" />
- android:drawable="@mipmap/anim2" android:duration="1000" />
- android:drawable="@mipmap/anim3" android:duration="1000" />
animated-rotate
- android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
- android:pivotX 旋转中心的X坐标
- android:pivotY 旋转中心的Y坐标
- android:visible 设置初始的可见性状态,默认为false
<?xml version="1.0" encoding="utf-8"?> xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/img_daisy" android:pivotX="50%" android:pivotY="50%" android:visible="false" />
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:fromAlpha 动画开始时的透明度,0.0为全透明,1.0为不透明,默认为1.0
- android:toAlpha 动画结束时的透明度,0.0为全透明,1.0为不透明,默认为1.0
<?xml version="1.0" encoding="utf-8"?> xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fromAlpha="0.0" android:toAlpha="1.0" />
view.startAnimation(AnimationUtils.loadAnimation(this, R.anim.fade_in));
AlphaAnimation fadeInAnimation = (AlphaAnimation) AnimationUtils.loadAnimation(this, R.anim.fade_in);view.startAnimation(fadeInAnimation);
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:fromXScale 动画开始时X坐标上的缩放尺寸
- android:toXScale 动画结束时X坐标上的缩放尺寸
- android:fromYScale 动画开始时Y坐标上的缩放尺寸
-
android:toYScale 动画结束时Y坐标上的缩放尺寸
PS:以上四个属性,0.0表示缩放到没有,1.0表示正常无缩放,小于1.0表示收缩,大于1.0表示放大 -
android:pivotX 缩放时的固定不变的X坐标,一般用百分比表示,0%表示左边缘,100%表示右边缘
-
android:pivotY 缩放时的固定不变的Y坐标,一般用百分比表示,0%表示顶部边缘,100%表示底部边缘
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fromXScale="1.0" android:fromYScale="1.0" android:pivotX="0%" android:pivotY="100%" android:toXScale="1.5" android:toYScale="1.5" />
ScaleAnimation zoomOutAnimation = (ScaleAnimation) AnimationUtils.loadAnimation(this, R.anim.zoom_out);view.startAnimation(zoomOutAnimation);
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:fromXDelta 起始位置的X坐标的偏移量
- android:toXDelta 结束位置的X坐标的偏移量
- android:fromYDelta 起始位置的Y坐标的偏移量
- android:toYDelta 结束位置的Y坐标的偏移量
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000" android:fromXDelta="-100%" android:fromYDelta="0" android:toXDelta="100%p" android:toYDelta="0" />
TranslateAnimation moveAnimation = (TranslateAnimation) AnimationUtils.loadAnimation(this, R.anim.move_left_to_right);view.startAnimation(moveAnimation);
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:fromDegrees 旋转开始的角度
- android:toDegrees 旋转结束的角度
- android:pivotX 旋转中心点的X坐标,纯数字表示相对于View本身左边缘的像素偏移量;带"%"后缀时表示相对于View本身左边缘的百分比偏移量;带"%p"后缀时表示相对于父View左边缘的百分比偏移量
- android:pivotY 旋转中心点的Y坐标,纯数字表示相对于View本身顶部边缘的像素偏移量;带"%"后缀时表示相对于View本身顶部边缘的百分比偏移量;带"%p"后缀时表示相对于父View顶部边缘的百分比偏移量
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000" android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" />
RotateAnimation rotateAnimation = (RotateAnimation) AnimationUtils.loadAnimation(this, R.anim.rotate_one);view.startAnimation(rotateAnimation);
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000"> android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="200%" android:toYDelta="0" /> android:fromXScale="1.0" android:fromYScale="1.0" android:pivotX="0%" android:pivotY="100%" android:toXScale="1.5" android:toYScale="1.5" />
通用属性
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:detachWallpaper 设置是否在壁纸上运行,只对设置了壁纸背景的窗口动画(window animation)有效。设为true,则动画只在窗口运行,壁纸背景保持不变
- android:fillAfter 设置为true时,动画执行完后,View会停留在动画的最后一帧;默认为false;如果是动画集,需在
标签中设置该属性才有效 - android:fillBefore 设置为true时,动画执行完后,View回到动画执行前的状态,默认即为true
- android:fillEnabled 设置为true时,android:fillBefore的值才有效,否则android:fillBefore会被忽略
- android:repeatCount 设置动画重复执行的次数,默认为0,即不重复;可设为-1或infinite,表示无限重复
-
android:repeatMode 设置动画重复执行的模式,可设为以下两个值其中之一:
- restart 动画重复执行时从起点开始,默认为该值
- reverse 动画会反方向执行
-
android:startOffset 设置动画执行之前的等待时长,毫秒为单位;重复执行时,每次执行前同样也会等待一段时间
-
android:zAdjustment 表示被设置动画的内容在动画运行时在Z轴上的位置,取值为以下三个值之一:
- normal 默认值,保持内容在Z轴上的位置不变
- top 保持在Z周最上层
- bottom 保持在Z轴最下层
-
android:interpolator 设置动画速率的变化,比如加速、减速、匀速等,需要指定Interpolator资源,后面再详细讲解
PS:标签还有个android:shareInterpolator属性,设置为true时则可将interpolator应用到所有子元素中
Interpolator
Interpolator class | Resource ID | Description |
---|---|---|
AccelerateDecelerateInterpolator | @android:anim/accelerate_decelerate_interpolator | 在动画开始与结束时速率改变比较慢,在中间的时候加速 |
AccelerateInterpolator | @android:anim/accelerate_interpolator | 在动画开始时速率改变比较慢,然后开始加速 |
AnticipateInterpolator | @android:anim/anticipate_interpolator | 动画开始的时候向后然后往前抛 |
AnticipateOvershootInterpolator | @android:anim/anticipate_overshoot_interpolator | 动画开始的时候向后然后向前抛,会抛超过目标值后再返回到最后的值 |
BounceInterpolator | @android:anim/bounce_interpolator | 动画结束的时候会弹跳 |
CycleInterpolator | @android:anim/bounce_interpolator | 动画循环做周期运动,速率改变沿着正弦曲线 |
DecelerateInterpolator | @android:anim/decelerate_interpolator | 在动画开始时速率改变比较快,然后开始减速 |
LinearInterpolator | @android:anim/decelerate_interpolator | 动画匀速播放 |
OvershootInterpolator | @android:anim/overshoot_interpolator | 动画向前抛,会抛超过最后值,然后再返回 |
- 在动画开始与结束时速率改变比较慢,在中间的时候加速。没有可更改设置的属性,所以设置的效果和系统提供的一样
-
在动画开始时速率改变比较慢,然后开始加速。有一个属性可以设置加速的速率
- android:factor 浮点值,加速的速率,默认为1
-
动画开始的时候向后然后往前抛。有一个属性设置向后拉的值
- android:tension 浮点值,向后的拉力,默认为2,当设为0时,则不会有向后的动画了
-
动画开始的时候向后然后向前抛,会抛超过目标值后再返回到最后的值。可设置两个属性
- android:tension 浮点值,向后的拉力,默认为2,当设为0时,则不会有向后的动画了
- android:extraTension 浮点值,拉力的倍数,默认为1.5(2*1.5),当设为0时,则不会有拉力了
-
动画结束的时候会弹跳。没有可更改设置的属性 -
动画循环做周期运动,速率改变沿着正弦曲线。有一个属性设置循环次数 - android:cycles 整数值,循环的次数,默认为1
-
在动画开始时速率改变比较快,然后开始减速。有一个属性设置减速的速率 - android:factor 浮点值,减速的速率,默认为1
-
动画匀速播放。没有可更改设置的属性 -
动画向前抛,会抛超过最后值,然后再返回。有一个属性 - android:tension 浮点值,超出终点后的拉力,默认为2
<?xml version="1.0" encoding="utf-8"?> xmlns:android="http://schemas.android.com/apk/res/android" android:tension="3" android:extraTension="2" />
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000" android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" android:interpolator="@anim/my_interpolator" />
- 计算动画值
- 将动画值应用到对象和属性上
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:startOffset 设置动画执行之前的等待时长,单位为毫秒
- android:repeatCount 设置动画重复执行的次数,默认为0,即不重复;可设为-1或infinite,表示无限重复
-
android:repeatMode 设置动画重复执行的模式,可设为以下两个值其中之一:
- restart 动画重复执行时从起点开始,默认为该值
- reverse 动画会反方向执行
-
android:valueFrom 动画开始的值,可以为int值、float值或color值
-
android:valueTo 动画结束的值,可以为int值、float值或color值
-
android:valueType 动画值类型,若为color值,则无需设置该属性
- intType 指定动画值,即以上两个value属性的值为整型
- floatType 指定动画值,即以上两个value属性的值为浮点型,默认值
-
android:interpolator 设置动画速率的变化,比如加速、减速、匀速等,需要指定Interpolator资源。具体用法在View Animation篇已经讲过,这里不再重复
<?xml version="1.0" encoding="utf-8"?> xmlns:android="http://schemas.android.com/apk/res/android" android:duration="3000" android:valueFrom="100" android:valueTo="20" android:valueType="intType" />
public void onScaleWidth(final View view) { // 获取屏幕宽度 final int maxWidth = getWindowManager().getDefaultDisplay().getWidth(); ValueAnimator valueAnimator = (ValueAnimator) AnimatorInflater.loadAnimator(this, R.animator.value_animator); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animator) { // 当前动画值,即为当前宽度比例值 int currentValue = (Integer) animator.getAnimatedValue(); // 根据比例更改目标view的宽度 view.getLayoutParams().width = maxWidth * currentValue / 100; view.requestLayout(); } }); valueAnimator.start();}
- android:propertyName 目标对象的属性名,要求目标对象必须提供该属性的setter方法,如果动画的时候没有初始值,还需要提供getter方法
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" android:duration="3000" android:propertyName="width" android:valueFrom="100" android:valueTo="20" android:valueType="intType" />
private static class ViewWrapper { private View target; //目标对象 private int maxWidth; //最长宽度值 public ViewWrapper(View target, int maxWidth) { this.target = target; this.maxWidth = maxWidth; } public int getWidth() { return target.getLayoutParams().width; } public void setWidth(int widthValue) { //widthValue的值从100到20变化 target.getLayoutParams().width = maxWidth * widthValue / 100; target.requestLayout(); }}
public void onScaleWidth(View view) { // 获取屏幕宽度 int maxWidth = getWindowManager().getDefaultDisplay().getWidth(); // 将目标view进行包装 ViewWrapper wrapper = new ViewWrapper(view, maxWidth); // 将xml转化为ObjectAnimator对象 ObjectAnimator objectAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.object_animator); // 设置动画的目标对象为包装后的view objectAnimator.setTarget(wrapper); // 启动动画 objectAnimator.start();}
- alpha:透明度,默认为1,表示不透明,0表示完全透明
- pivotX 和 pivotY:旋转的轴点和缩放的基准点,默认是View的中心点
- scaleX 和 scaleY:基于pivotX和pivotY的缩放,1表示无缩放,小于1表示收缩,大于1则放大
- rotation、rotationX 和 rotationY:基于轴点(pivotX和pivotY)的旋转,rotation为平面的旋转,rotationX和rotationY为立体的旋转
- translationX 和 translationY:View的屏幕位置坐标变化量,以layout容器的左上角为坐标原点
- x 和 y:View在父容器内的最终位置,是左上角坐标和偏移量(translationX,translationY)的和
- android:ordering 设置动画的时序关系,取值可为以下两个值之一:
- together 动画同时执行,默认值
- sequentially 动画按顺序执行
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="together"> android:duration="3000" android:propertyName="width" android:valueFrom="100" android:valueTo="20" android:valueType="intType" /> android:duration="3000" android:propertyName="marginTop" android:valueFrom="0" android:valueTo="100" android:valueType="intType" />
private static class ViewWrapper { private View target; private int maxWidth; public ViewWrapper(View target, int maxWidth) { this.target = target; this.maxWidth = maxWidth; } public int getWidth() { return target.getLayoutParams().width; } public void setWidth(int widthValue) { target.getLayoutParams().width = maxWidth * widthValue / 100; target.requestLayout(); } public void setMarginTop(int margin) { LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) target.getLayoutParams(); layoutParams.setMargins(0, margin, 0, 0); target.setLayoutParams(layoutParams); }}
public void onScaleWidth(View view) { // 获取屏幕宽度 int maxWidth = getWindowManager().getDefaultDisplay().getWidth(); // 将目标view进行包装 ViewWrapper wrapper = new ViewWrapper(view, maxWidth); // 将xml转化为ObjectAnimator对象 AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.animator_set); // 设置动画的目标对象为包装后的view animatorSet.setTarget(wrapper); // 启动动画 animatorSet.start();}
- 每个页面标题栏的标题基本会有一样的字体大小、颜色、对齐方式、内间距、外间距等,这就可以定义成样式;
- 很多按钮也都使用一致的背景、内间距、文字颜色、文字大小、文字的对齐方式等,这也可以定义成样式;
- 网络加载的进度条基本也都是一样的,同样可以定义成样式;
- 不喜欢系统的弹出框样式,那也可以自定义样式。
样式的定义
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android"> - android:state_pressed="true" android:state_enabled="true">
android:propertyName="translationZ" android:duration="@integer/button_pressed_animation_duration" android:valueTo="@dimen/button_pressed_z_material" android:valueType="floatType" /> android:propertyName="elevation" android:duration="0" android:valueTo="@dimen/button_elevation_material" android:valueType="floatType" /> - android:state_enabled="true">
android:propertyName="translationZ" android:duration="@integer/button_pressed_animation_duration" android:valueTo="0" android:startDelay="@integer/button_pressed_animation_delay" android:valueType="floatType"/> android:propertyName="elevation" android:duration="0" android:valueTo="@dimen/button_elevation_material" android:valueType="floatType" /> android:propertyName="translationZ" android:duration="0" android:valueTo="0" android:valueType="floatType"/> android:propertyName="elevation" android:duration="0" android:valueTo="0" android:valueType="floatType"/>
styles.xmlstyles_device_defaults.xmlstyles_holo.xmlstyles_leanback.xmlstyles_material.xmlstyles_micro.xmlthemes.xmlthemes_device_defaults.xmlthemes_holo.xmlthemes_leanback.xmlthemes_material.xmlthemes_micro.xml
主题
- themes.xml:低版本的主题,目标API level一般为10或以下
- themes_holo.xml:从API level 11添加的主题
- themes_device_defaults.xml:从API level 14添加的主题
- themes_material.xml:从API level 21添加的主题
- themes_micro.xml:应该是用于Android Wear的主题
- themes_leanback.xml: 还不清楚什么用
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" android:zAdjustment="top"> android:fromAlpha="0.0" android:toAlpha="1.0" android:interpolator="@interpolator/decelerate_quart" android:fillEnabled="true" android:fillBefore="false" android:fillAfter="true" android:duration="200" /> android:fromYDelta="8%" android:toYDelta="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quint" android:duration="350" />
android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme">
处处:http://keeganlee.me/post/android/20151031
更多相关文章
- Android(安卓)使用ViewPager实现左右循环滑动图片
- Android软键盘弹出将底部栏顶上去并不会挤压界面
- android .9图讲解
- Android闪屏效果实现方法
- Android虚拟导航栏遮挡底部的输入框的解决方法
- [置顶] Android(安卓)中轴时光轴
- android 阻尼效果(图片下拉变大)
- Android(安卓)shape属性详细整理
- Android中TextView控件的singleLine废弃解决