rectangle
solid: 设置形状填充的颜色,只有android:color一个属性
padding: 设置内容与形状边界的内间距,可分别设置左右上下的距离
gradient: 设置形状的渐变颜色,可以是线性渐变、辐射渐变、扫描性渐变
corners: 设置圆角,只适用于rectangle类型,可分别设置四个角不同半径的圆角,当设置的圆角半径很大时,比如200dp,就可变成弧形边了
stroke: 设置描边,可描成实线或虚线。
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
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
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" />
ring
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" />
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" />
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" />
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" />
当ListItem里有Button或CheckBox之类的控件时,会抢占ListItem本身的焦点,导致ListItem本身的触摸点击事件会无效。那么,要解决此问题,有三种解决方案:
第三种是最方便,也是推荐的方式,它会将ListItem根布局下的所有子控件都设置为不能获取焦点。android:descendantFocusability属性的值有三种,其中,ViewGroup是指设置该属性的View,本例中就是ListItem的根布局:
layer-list篇
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" />
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" />
密度分类 | 密度值范围 | 代表分辨率 | 图标尺寸 | 图片比例 |
---|---|---|---|---|
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 |
android:gravity 设置图片的对齐方式,比如在layer-list中,默认会尽量填满整个视图,导致图片可能会被拉伸,为了避免被拉伸,就可以设置对齐方式,可取值为下面的值,多个取值可以用 | 分隔:
android:antialias 设置是否开启抗锯齿
android:dither 设置是否抖动,图片与屏幕的像素配置不同时会用到,比如图片是ARGB 8888的,而屏幕是RGB565
android:filter 设置是否允许对图片进行滤波,对图片进行收缩或者延展使用滤波可以获得平滑的外观效果
android:tint 给图片着色,比如图片本来是黑色的,着色后可以变成白色
android:tileMode 设置图片平铺的方式,取值为下面四种之一:
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)才添加的属性
xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#FFFFFF" />
name="white">#FFFFFF
android:clipOrientation 设置裁剪的方向,取值为以下两个值之一:
android:gravity 设置裁剪的位置,可取值如下,多个取值用 | 分隔:
定义clip.xml:
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.xml:
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
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);
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" />
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切换回第一个
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" />
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" />
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/img_daisy"
android:pivotX="50%"
android:pivotY="50%"
android:visible="false" />
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:toYScale 动画结束时Y坐标上的缩放尺寸
PS:以上四个属性,0.0表示缩放到没有,1.0表示正常无缩放,小于1.0表示收缩,大于1.0表示放大
android:pivotX 缩放时的固定不变的X坐标,一般用百分比表示,0%表示左边缘,100%表示右边缘
android:pivotY 缩放时的固定不变的Y坐标,一般用百分比表示,0%表示顶部边缘,100%表示底部边缘
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);
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);
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);
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:repeatMode 设置动画重复执行的模式,可设为以下两个值其中之一:
android:startOffset 设置动画执行之前的等待时长,毫秒为单位;重复执行时,每次执行前同样也会等待一段时间
android:zAdjustment 表示被设置动画的内容在动画运行时在Z轴上的位置,取值为以下三个值之一:
android:interpolator 设置动画速率的变化,比如加速、减速、匀速等,需要指定Interpolator资源,后面再详细讲解
PS:
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 | 动画向前抛,会抛超过最后值,然后再返回 |
xmlns:android="http://schemas.android.com/apk/res/android"
android:tension="3"
android:extraTension="2" />
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:repeatMode 设置动画重复执行的模式,可设为以下两个值其中之一:
android:valueFrom 动画开始的值,可以为int值、float值或color值
android:valueTo 动画结束的值,可以为int值、float值或color值
android:valueType 动画值类型,若为color值,则无需设置该属性
android:interpolator 设置动画速率的变化,比如加速、减速、匀速等,需要指定Interpolator资源。具体用法在View Animation篇已经讲过,这里不再重复
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(); }
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(); }
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(); }
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.xml
styles_device_defaults.xml
styles_holo.xml
styles_leanback.xml
styles_material.xml
styles_micro.xml
themes.xml
themes_device_defaults.xml
themes_holo.xml
themes_leanback.xml
themes_material.xml
themes_micro.xml
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">