代码与资源分离原则:便于维护与修改
shape:定义图形 selector:按照不同的情况加载不同的color或drawable layer-list:从下往上图形层叠加载
资源文件有:/res/drawable(图形资源及帧动画.xml)、/res/layout(界面布局资源)、/res/values(各种数据资源,eg:strings、colors、dimens etc.)
/res/menu(菜单布局资源)、/res/anim(动画资源‘补间动画’)、/res/raw(原始资源 eg:*.txt、*.mp3 etc)
/res/animator(属性动画资源)、/res/xml(xml资源文件)
values文件夹下常用文件有:
strings.xml arrays.xml(数组) colors.xml dimens.xml(尺寸) drawables.xml styles.xml(样式) themes.xml(主题)
这些资源文件在Java中的引用方式有:
getResources().getString(R.string.xx); 其他资源引用类似
对于colors:#000000、三原色(RGB)、ARGB
#RGB 三位16进制,例如#00F
#RRGGBB 六位16进制,例如#7700FF
#ARGB 四位含透明度的颜色值,例如#F00F
#AARRGGBB 八位含透明度的颜色值,例如#7700FF00
尺寸:像素 px、 点 pt、 密度独立像素(dpi) dp、比例独立像素 sp
官方推荐:控件尺寸 dp、字体尺寸 sp
尺寸转换:px to dp(dip): dp = pxValue / scale + 0.5f
常用图像资源类型: 便携式网络图像.png 其他:9格拉伸图像.9.png *.jpg *.jpeg .gif
动画分三类:anim(视图动画)、animator(属性动画)、AnimatorDrawable(帧动画) animation-list
anim: alpha(渐变透明度)、scale(渐变尺寸拉伸)、translate(画面转换位置移动)、rotate(画面转移旋转)
javaCode中:AlphaAnimation etc. tweened animation(渐变动画) frame by frame(画面转换)
不受Android平台约束的文件夹:/assets
AssetManager assets = getAssets(); assets.open(fileName);
***************
android shape使用:
shape的属性:rectangle、oval、line、ring(矩形、椭圆形、线性形状、环形)
如下属性只有当shape=ring时可用:
innerRadius 内环半径 innerRadiusRatio 浮点型,以环的宽度比率来表示内环半径
thickness 环的厚度 thicknessRatio 浮点型,以环的宽度比率来表示环的厚度
useLevel 如果当做是LevelListDrawable使用时值为true,否则为false
当shape=ring时:必须 useLevel=false;
shape 6种标签:corners、gradient、padding、size、solid、stroke
solid与gradient 不能同时用?会相互影响吗?
corners(圆角):radius(全部圆角的半径)与其他属性不能共用
gradient(渐变色):
属性:type=[linear|radial|sweep]渐变类型:线性渐变(默认)|放射渐变|扫描式渐变
angle=45 渐变角度,为45的倍数 0从左到右 90从上到下,仅对线性渐变有效
centerX centerY 渐变中心点的相对位置,范围:0~1,仅当放射渐变时有效
startColor centerColor endColor
gradientRadius=5 渐变的半径,只当type=radial时才能使用
useLevel=true|false 用于指定是否将该shape当成一个LevelListDrawable来使用,默认值为false
solid(内部填充色):只有一个属性 color
stroke(描边属性):width、color、dashWidth、dashGap 后两个属性设置虚线:宽度(值为0时实线)与间隔(值为尺寸)
size、padding: 图形大小、内部边距(基本不用)
****************
android selector使用:
selector分两种:color-selector、drawable-selector
作drawable资源使用时,放于drawable下,item 指定为drawable属性;作color资源使用时,放于/res/color下,且item指定属性为:color
item android:drawable属性除了引用@drawable资源,也可以引用@color颜色值;但android:color只能引用@color;
item是从上往下匹配的,如果匹配到一个item那它就将采用这个item,而不是采用最佳匹配的规则
设置默认的状态,一定要写在最后,如果写在前面,则后面所有的item都不会起作用了
<!-- 默认时 -->
<item android:color="@android:color/white" />
selector标签下:
android:enterFadeDuration 状态改变时,新状态展示时的淡入时间,以毫秒为单位
android:exitFadeDuration 状态改变时,旧状态消失时的淡出时间,以毫秒为单位
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及以上才支持
关于ListView的ListItem样式,有两种设置方式,一种是在ListView标签里设置android:listSelector属性,另一种是在ListItem的布局layout里设置android:background。但是,这两种设置的结果却有着不同。同时,使用ListView时也有些其他需要注意的地方,总结如下:
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的使用:
paddingMode=nest|stack
item是按照从下往上的顺序叠加的,即先定义的item在下面,后面的依次往上面叠放
android:top 顶部的偏移量
android:bottom 底部的偏移量
android:left 左边的偏移量
android:right 右边的偏移量