Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android开发笔记(一百三十二)矢量图形与矢量动画

Android开发笔记(一百三十二)矢量图形与矢量动画

作者头像
aqi00
发布于 2019-01-18 06:52:15
发布于 2019-01-18 06:52:15
2.1K00
代码可运行
举报
文章被收录于专栏:老欧说安卓老欧说安卓
运行总次数:0
代码可运行

矢量图形VectorDrawable

与水波图形RippleDrawable一样,矢量图形VectorDrawable也是Android5.0之后新增的图形类。矢量图不同于一般的图形,它是由一系列几何曲线构成的图像,这些曲线以数学上定义的坐标点连接而成。具体到实现上,则需开发者提供一个xml格式的矢量图形定义,然后系统根据矢量定义自动计算该图形的绘制区域。因为绘图结果是动态计算得到,所以不管缩放到多少比例,矢量图形都会一样的清晰,不像位图那样拉大后会变模糊。 矢量图形的xml定义有点复杂,其结构可分为三个层次:根标签、组标签、路径标签。

根标签vector

首先是vector标签,它表示当前定义的是一个完整的矢量图形。该标签支持的主要属性说明如下: android:name:指定矢量图形的名称。 android:width:指定矢量图形的默认宽度,一般使用dp数值。如果在layout布局文件中将ImageView的layout_width设置为wrap_content,同时src设置为该矢量图形,则ImageView控件的宽度就是此处的android:width。 android:height:指定矢量图形的默认高度,一般使用dp数值。 android:viewportWidth:指定视图空间的宽度,即虚拟坐标系的宽度,后续路径的坐标信息都位于该视图空间之内。 android:viewportHeight:指定视图空间的高度,即虚拟坐标系的高度。 android:alpha:指定矢量图形的的透明度,取值为0.0到1.0。 这里要注意width/height与viewportWidth/viewportHeight两组宽高的区别,前者指的是矢量图形被外部世界观察到的尺寸大小,故而采用了带dp单位的绝对数值;而后者指的是矢量图形为内部几何路径所参照的空间范围,故而采用了不带单位的相对数值,正因为矢量图形中的几何路径以相对坐标来标记,所以不管矢量图形缩放到多少比例,其内部的几何形状也会按同样比例缩放。

组标签group

然后是group标签,它定义了一组路径的共同行为(如一起旋转、一起缩放、一起平移等等)。该标签支持的主要属性说明如下: android:name:指定分组对象的名称。 android:pivotX:指定旋转中心点的横轴坐标。 android:pivotY:指定旋转中心点的纵轴坐标。 android:rotation:指定分组对象的旋转角度。 android:scaleX:指定分组对象在横轴上的缩放比例。取值0.5表示缩小一半,取值2.0表示放大一倍。 android:scaleY:指定分组对象在纵轴上的缩放比例。 android:translateX:指定分组对象在横轴上的平移距离。 android:translateY:指定分组对象在纵轴上的平移距离。

路径标签path

最后是path标签,它定义了一个路径的几何描述,既可以表示一根曲线,也可以表示一块平面区域。该标签支持的主要属性说明如下: android:name:指定几何路径的名称。 android:pathData:指定几何路径的数据定义。数据格式需符合SVG标准。 android:fillColor:指定平面区域的颜色。若不指定,则不绘制平面区域。 android:fillAlpha:指定平面区域的透明度。 android:strokeColor:指定曲线的颜色。若不指定,则不绘制曲线颜色。 android:strokeWidth:指定曲线的宽度。 android:strokeAlpha:指定曲线的透明度。 android:strokeLineCap:指定曲线的首尾外观。取值说明有三个:butt(默认值,直线边缘)、round(圆形边缘)、square(方形边缘)。 android:strokeLineJoin:指定两条曲线相交的边角外观。取值说明有三个:miter(默认值,锐角)、round(圆角)、bevel(钝角)。 android:trimPathStart:指定几何路径从哪里开始绘制。取值为0.0到1.0,比如取值0.4表示只绘制后面十分之六的内容,前面十分之四不予绘制。 android:trimPathEnd:指定几何路径到哪里结束绘制。取值为0.0到1.0,比如取值0.4表示只绘制前面十分之四的内容,后面十分之六不予绘制。 android:trimPathOffset:指定几何路径的绘制偏移。取值为0.0到1.0,表示线条从trimPathOffset+trimPathStart处一直绘制到trimPathOffset+trimPathEnd处。 路径信息有几个地方容易混淆,下面把相关细节详细说明一下: 1、关于butt和square的区别,乍看起来直线边缘与方形边缘没什么差别,但矢量图形的方形边缘其实是套上一个方形的帽子,既然是套上去,就会比没戴帽子的时候高一点,所以使用square的线条会比使用butt的线条要长一点。 2、关于butt和square的区别,miter保留了原样的尖角,而bevel会把尖角部分切掉一小块,看起来就变钝了。 3、trimPathOffset+trimPathEnd的和如果超过1,也会画出来。只是没有全部画出来,而是绘制从起点到trimPathOffset+trimPathEnd-1所处的位置。

可缩放矢量图形SVG标记

前面说到,path标签的android:pathData属性,取值需符合SVG标准。SVG全称为“Scalable Vector Graphics”,意即可缩放的矢量图形,它是一种图形格式,专门用于描述矢量图形的定义。 SVG标记比较抽象,下面先举个简单的例子,有了直观的概念更方便理解,如下所示:         android:pathData="             M 30,50             L 75 35" 这个标记定义不难,首先“M 30,50”指的是把画笔移动到坐标点(30,50)的位置,后面的“L 75 35”指的是从当前位置画一根线段到坐标点(75,35)。说白了,就是在(30,50)和(75,35)两点之间画一根线段。 好了,每行定义一个动作,每行的第一个字符表示动作的类型,后面的数字表示动作经过的坐标点。这便是SVG标记的大概格式,万变不离其宗,掌握了规律学得更好更快。详细的SVG标记定义说明如下: 移动画笔 “M x0,y0”把画笔移动到坐标点(x0,y0)。 画线段 “L x1 y1” 从当前位置(x0,y0)画一根线段到坐标点(x1,y1)。 画水平线段 “H x1” 从当前位置(x0,y0)画一根水平线到坐标点(x1,y0)。 画垂直线段 “V y1” 从当前位置(x0,y0)画一根垂直线到坐标点(x0,y1)。 画二次贝塞尔曲线 “Q xa ya x1 y1”二次贝塞尔曲线的起点是当前位置,终点是(x1,y1),曲线中部向控制点(xa,ya)凸出。 画三次贝塞尔曲线 “C xa ya xb yb x1 y1”三次贝塞尔曲线的起点是当前位置,终点是(x1,y1),曲线中部有两个控制点,分别向(xa,ya)和(xb,yb)两方向凸出。 画椭圆的圆弧 “A radius-x radius-y x-axis-rotation large-arc-flag sweep-flag x1 y1”从当前位置拉出一段圆弧,圆弧的参数比较多,分别说明如下: -- radius-x表示椭圆的横轴半径。 -- radius-y表示椭圆的纵轴半径。横轴半径等于纵轴半径时,表示这是个圆圈的圆弧。 -- x-axis-rotation表示圆弧的旋转角度。 -- large-arc-flag表示大弧标志,为0时表示取小弧度,1时取大弧度。 -- sweep-flag表示轨迹标志,为0表示逆时针方向,为1表示顺时针方向。 -- 圆弧经过某点,该点的横坐标为x1 -- 圆弧经过某点,该点的纵坐标为y1 闭合路径 “Z” 连接起点跟终点,即在起点(x0,y0)与终点之间画一根线段。 再来补充一下SVG标记的若干说明,如下所示: 1、每个命令都有大小写形式,大写代表后面的参数是绝对坐标,小写表示相对坐标。 2、参数之间用空格或逗号隔开,两种分隔符的效果是一样的。 3、关于圆弧的large-arc-flag和sweep-flag两个标志,光看文字说明其实不易理解,还是上个图观察观察:

下面使用SVG标记定义一个心形,先上个心形的效果图:

心形对应的矢量图形定义示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="256dp"
    android:height="256dp"
    android:viewportHeight="32"
    android:viewportWidth="32">

    <path
        android:fillColor= "#ffaaaa"
        android:pathData= "M20.5,9.5
                        c-1.955,0,-3.83,1.268,-4.5,3
                        c-0.67,-1.732,-2.547,-3,-4.5,-3
                        C8.957,9.5,7,11.432,7,14
                        c0,3.53,3.793,6.257,9,11.5
                        c5.207,-5.242,9,-7.97,9,-11.5
                        C25,11.432,23.043,9.5,20.5,9.5z" />
</vector>

矢量动画AnimatedVectorDrawable

费了老大的劲搞清楚SVG标记,如果仅仅画个静态的矢量图形,未免大材小用了。其实矢量图形真正的意义在于矢量动画,通过动态计算几何路径的坐标,从而实现局部或整体的动画效果,这才是矢量图形的杀手锏呀。 Android提供了AnimatedVectorDrawable这么一个矢量动画类,但开发者还得通过属性动画及其xml标签方可实现动画定义。先看看AnimatedVectorDrawable的几个常用方法: registerAnimationCallback : 注册动画监听器,需实现Animatable2.AnimationCallback接口的两个方法:onAnimationStart和onAnimationEnd。 start : 开始播放动画。 stop : 停止播放。 reverse : 倒过来播放。 再看看如何通过属性动画实现矢量动画效果。理论上,矢量图形的三个标签(vector、group、path)都有可以用来播放动画的属性;不过实际开发的时候,常用的只有三类属性可用作动画,说明如下:

变换类属性

这类属性包括vector标签的android:alpha,以及group标签的android:rotation、android:scaleX、android:scaleY、android:translateX、android:translateY等等,这几个属性分别对应于补间动画的灰度动画、旋转动画、缩放动画、平移动画。 因为该类属性实现的是大家熟悉的补间动画效果,所以这里就不再做演示了。

路径类属性

这类属性主要指path标签的android:pathData,通过设置几何路径的起始状态与终止状态,可实现两个几何形状之间的渐变效果,如一个圆圈从小变大,又如一条曲线变成直线等等。 下面是个从哭丧脸变为笑脸的动画截图:

下面是人脸的矢量图形定义文件vector_face_eye.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="200dp"
    android:width="200dp"
    android:viewportHeight="100"
    android:viewportWidth="100" >
  <path
      android:fillColor="@color/yellow"
      android:pathData="@string/path_circle"/>
  <path
      android:name="eye_left"
      android:strokeColor="@android:color/black"
      android:strokeWidth="4"
      android:strokeLineCap="round"
      android:pathData="@string/path_eye_left_sad"/>
  <path
      android:name="eye_right"
      android:strokeColor="@android:color/black"
      android:strokeWidth="4"
      android:strokeLineCap="round"
      android:pathData="@string/path_eye_right_sad"/>
  <path
      android:name="mouth"
      android:strokeColor="@android:color/black"
      android:strokeWidth="4"
      android:strokeLineCap="round"
      android:pathData="@string/path_face_mouth_sad"/>
</vector>

接着是脸部三处器官变化的属性动画定义文件。 下面是左眼的属性动画定义文件anim_smile_eye_left.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
  android:duration="3000"
  android:propertyName="pathData"
  android:valueFrom="@string/path_eye_left_sad"
  android:valueTo="@string/path_eye_left_happy"
  android:valueType="pathType"
  android:interpolator="@android:anim/accelerate_interpolator"/>

下面是右眼的属性动画定义文件anim_smile_eye_right.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
  android:duration="3000"
  android:propertyName="pathData"
  android:valueFrom="@string/path_eye_right_sad"
  android:valueTo="@string/path_eye_right_happy"
  android:valueType="pathType"
  android:interpolator="@android:anim/accelerate_interpolator"/>

下面是嘴巴的属性动画定义文件anim_smile_mouth.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
  android:duration="3000"
  android:propertyName="pathData"
  android:valueFrom="@string/path_face_mouth_sad"
  android:valueTo="@string/path_face_mouth_happy"
  android:valueType="pathType"
  android:interpolator="@android:anim/accelerate_interpolator"/>

最后是笑脸的矢量动画定义例子animated_vector_smile_eye.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/vector_face_eye" >

    <target
        android:name="mouth"
        android:animation="@anim/anim_smile_mouth" />

    <target
        android:name="eye_left"
        android:animation="@anim/anim_smile_eye_left" />
    
    <target
        android:name="eye_right"
        android:animation="@anim/anim_smile_eye_right" />
    
</animated-vector>

不要忘了在代码中进行矢量动画的播放操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	private void startVectorSmile() {
		iv_vector_smile.setImageResource(R.drawable.animated_vector_smile_eye);
		Drawable drawable = iv_vector_smile.getDrawable();
		if (drawable instanceof AnimatedVectorDrawable) {
			((AnimatedVectorDrawable) drawable).start();
		}
	}

修剪类属性

这类属性包括path标签的android:trimPathStart和android:trimPathEnd,可实现矢量图形逐步展开或者逐步消失的动画效果。 下面是个支付宝支付成功的动画截图:

支付成功动画包含两个形状,首先在外面画个圆圈,然后在圆圈里面画个打勾符号。因为圆圈和打勾并不相连,如果按照一般的处理,就会一边画圆圈一边画打勾,这不是我们所希望的画完圆圈再画打勾的效果。所以要想让圆圈动画和打勾动画按顺序播放,得分别定义圆圈的矢量图形和打勾的矢量图形,然后等圆圈动画播放完毕,再开始播放打勾动画。 下面是圆圈的矢量图形定义文件vector_pay_circle.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="100dp"
    android:viewportHeight="100"
    android:viewportWidth="100"
    android:width="100dp" >

    <path
        android:name="circle"
        android:pathData="
            M 10,50
            A 40 40 0 1 0 10 49"
        android:strokeAlpha="1"
        android:strokeColor="@color/blue_sky"
        android:strokeLineCap="round"
        android:strokeWidth="3" />

</vector>

下面是打勾的矢量图形(含圆圈图形)定义文件vector_pay_success.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="100dp"
    android:viewportHeight="100"
    android:viewportWidth="100"
    android:width="100dp" >

    <path
        android:name="circle"
        android:pathData="
            M 10,50
            A 40 40 0 1 0 10 49"
        android:strokeAlpha="1"
        android:strokeColor="@color/blue_sky"
        android:strokeLineCap="round"
        android:strokeWidth="3" />
    <path
        android:name="hook"
        android:pathData="
            M 30,50
            L 45 65
            L 75 35"
        android:strokeAlpha="1"
        android:strokeColor="@color/blue_sky"
        android:strokeLineCap="butt"
        android:strokeWidth="3" />

</vector>

接着是支付成功的属性动画的xml定义文件anim_pay.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:interpolator="@android:interpolator/linear"
    android:propertyName="trimPathEnd"
    android:valueFrom="0"
    android:valueTo="1"
    android:valueType="floatType" />

最后是矢量动画的定义文件,下面这个用来播放圆圈动画:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/vector_pay_circle">

    <target
        android:name="circle"
        android:animation="@anim/anim_pay" />

</animated-vector>

下面这个用来播放圆圈动画后继的打勾动画:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/vector_pay_success">

    <target
        android:name="hook"
        android:animation="@anim/anim_pay" />

</animated-vector>

圆圈动画播放完毕,接着播放打勾动画,这要在代码中控制,具体的是调用AnimatedVectorDrawable对象的registerAnimationCallback方法,一旦监听到原动画播放结束,然后开始播放新动画。 点击下载本文用到的矢量图形与矢量动画的工程代码 点此查看Android开发笔记的完整目录

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年02月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android开发笔记(一百四十五)仿应用宝的垃圾清理动画
除了动画监听器,动画组合也是各类动画常见的用法,比如把几个补间动画组合起来,就形成了集合动画AnimationSet;把几个属性动画组合起来,就形成了属性动画组合AnimatorSet。那么能否把几个矢量动画在时间上并行组合起来,也形成一种矢量动画组合呢? 比如应用宝的垃圾清理动画,它的初始画面由三个深红色的月牙环绕组成,效果如下图所示:
aqi00
2019/01/18
8610
Android高级动画(2)
前面一篇文章已经讲了Android中大部分的动画框架,回顾一下有:Tween动画,属性动画,帧动画,CircularReveal,Activity转场动画,5.0新转场动画,Interpolator插值器,5.0转场动画分为Explode、Slide、Fade、Share四种模式。合理且充分利用这些动画,我们已经可以做出很多优美的效果了。
大公爵
2018/09/05
1.7K0
Android高级动画(2)
[译] 了解 Android 的矢量图片格式:`VectorDrawable`
因为 Android 设备通常具有不同的尺寸、形状和屏幕像素密度,所以我更喜欢用与分辨率无关的矢量资源(vector assets)。但它们究竟是什么?有什么益处?需要什么成本?什么时候应该使用它们?怎么创建和使用它们?在这一系列文章中,我将会探讨这些问题并解释为什么在你的应用中应该大量地使用矢量资源(vector assets)以及怎样最大限度地使用它们。
Android 开发者
2019/04/19
2.6K0
[译] 了解 Android 的矢量图片格式:`VectorDrawable`
Android Vector曲折的兼容之路
Android Vector曲折的兼容之路 两年前写书的时候,就在研究Android L提出的Vector,可研究下来发现,完全不具备兼容性,相信这也是它没有被广泛使用的一个原因,经过Google的不
用户1907613
2018/07/20
1.8K0
[译] 绘制路径:Android 中矢量图渲染
在上一篇文章中,我们研究了 Android 的 VectorDrawable 格式,了解了它的优点和功能。
Android 开发者
2019/05/05
3.1K0
[译] 绘制路径:Android 中矢量图渲染
你都知道么?Android中21种drawable标签大全
我们在drawable目录下可以创建很多自定义的资源,其中用的最多的应该就是selector和shape。目前在Android中有21种drawable标签,了解和利用这些标签对我们的开发有很大的帮助。这个文章我们对这21种标签做一个介绍,让大家有一个印象。
BennuCTech
2021/12/24
2.6K0
Android自定义View-SVG动画
SVG是可缩放矢量图形,全称Scalable Vector Graphics。经过数学计算利用直线和曲线绘制而成,无论怎么放大,都不会出现马赛克现象。可以使用Illustrator矢量图绘图软件来进行绘图。
音视频开发进阶
2020/08/27
2.9K0
Android自定义View-SVG动画
Android--SVG在安卓系统中的应用
通过使用它的Path标签,几乎可以实现SVG中的其它所有标签,虽然可能会复杂一点,但这些东西都是可以通过工具来完成的,所以,不用担心写起来会很复杂。
aruba
2020/07/03
3K0
Android高级动画(3)
上一篇文章我们讲了Android中的矢量动画,虽然文中展示的Demo并不多,但是相信大家还是体会到了矢量动画的强大。这里再做一个温故总结:
大公爵
2018/09/05
9060
Android高级动画(3)
Android动画Animator家族使用指南
零、前言:本文知识点 ValueAnimator的认识与使用 估值器TypeEvaluator的自定义与使用 插值器TimeInterpolator的自定义与使用 Path于Animator的结合使用 ObjectAnimator的自定义与使用 TimeAnimator的使用 AnimatorSet动画集合的使用 Animator家族的监听器介绍与使用 Animator家族在xml中的使用 ---- 一直用动画,貌似还没有好好地总结一下,趁有空,总结一波 所谓动画,就是不停变化,在视觉上达到连续的效果
张风捷特烈
2019/01/02
1.3K0
Android开发(10) 动画(Animation)
1.准备一个animation对象,改对象可以看作是个动画对象,它描述(封装)了什么样式的动画。 我们可以在代码里手动创建这些对象,对应的4个animaiton对象类:
张云飞Vir
2020/03/16
6030
Android中的动画
在Android程序设计过程中,除了使用简单的按钮、文本框等简单控件来构建基本界面,我们还可以通过为界面添加动画效果,使得界面更加变得更加绚丽,更加吸引人。Android平台也提供了一套完整的动画框架,使得开发者可以用它开发出各种动画效果。
张哥编程
2024/12/17
1810
Android中的动画
Android样式的开发:View Animation篇
drawable汇总篇讲过两个动画,animation-list定义帧动画,animated-rotate定义旋转动画,这两个属于drawable动画。除了drawable动画,Android框架还提供了另外两种动画体系:视图动画(View Animation)和属性动画(Property Animation)。视图动画比较简单,只能应用于各种View,可以做一些位置、大小、旋转和透明度的简单转变。属性动画则是在android 3.0引入的动画体系,提供了更多特性和灵活性,也可以应用于任何对象,而不只是View。本篇先讲视图动画。
Keegan小钢
2018/08/10
1.1K0
Android中的Vector
随着 Android 的碎片化越来越严重,适配成为一个开发中一个痛点。如果 UI 只切一套图,但是在一些特定机型上难免会出现模糊或者变形的情况,如果切多套不同分辨率的图,虽然能解决适配问题,但是造成安装包过大的问题,很多开发者都会为这个问题感到头疼。终于,Android 的 Vector 的出现,可以解决这个问题了。
蜻蜓队长
2018/08/03
1.7K0
Android中的Vector
svg矢量图绘制以及转换为Android可用的VectorDrawable资源
项目需要 要在快速设置面板里显示一个VoWiFi图标(为了能够区分出来图形,我把透明的背景填充为黑色了) 由于普通图片放大后容易失真,这里我们最好用矢量图(SVG(Scalable Vector Gr
庞小明
2018/03/12
2.7K0
svg矢量图绘制以及转换为Android可用的VectorDrawable资源
Android开发之漫漫长途 XVII——动画
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!
LoveWFan
2018/08/21
4330
Android开发之漫漫长途 XVII——动画
Android中的动画全解!
View动画的平移、缩放、旋转、透明度 分别对应 Animation的的4个子类:TranslateAnimation、ScaleAnimation、RotateAnimation、AlphaAnimation。View可以用xml定义、也可以用代码创建。推荐使用xml,可读性好。
胡飞洋
2020/07/23
2.4K0
Android中的动画全解!
Android开发笔记(一百三十一)水波图形与水波动画
RippleDrawable是Android在5.0之后新增的图形类,它的作用是在点击时展示水波动画,从而提示用户在这里按压了屏幕。这个提示效果类似于状态图形StateListDrawable,区别在于,StateListDrawable使用一张静止图片表示按下状态,而RippleDrawable使用荡起涟漪的水波动画表示按压动作。 水波图形的用法很简单,先在xml文件中定义水波图形的规格,然后把视图的android:background属性设置为该图形,然后点击视图就会产生动画效果了。具体的水波样式主要有三种,说明如下: 1、没有边界限制的水波,这意味着允许水波动画充满整个视图,xml定义如下:
aqi00
2019/01/18
1.1K0
安卓开发_浅谈Android动画(三)
一、LayoutAnimation布局动画 用于为一个layout里面的控件,或者是一个ViewGroup里面的控件设置动画效果 在res-anim文件下新建一个动画xml文件 1 <?xml ve
听着music睡
2018/06/08
6140
Android:帧动画和补间动画看这篇就足够了!
为了使用户的交互更加流畅自然,动画也就成为了一个应用中必不可少的元素之一。在 Android 中常用的动画分类无外乎三种,最早的 帧动画 、补间动画,以及 3.0 之后加入的 属性动画,是它们组成了 Android 中各种炫酷亮眼的动画效果。
Android技术干货分享
2019/08/07
2K0
Android:帧动画和补间动画看这篇就足够了!
相关推荐
Android开发笔记(一百四十五)仿应用宝的垃圾清理动画
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验