android中XML的使用主要分以下几个大类

  • Animation

  • Animator

  • Drawable

  • Layout

  • Menu

  • Values

这些文件均在R中存在映射可以通过R.xxx.xxx得到映射值最后转换成我们所需的对象。

Animation

在res里建立文件夹anim用于存放所有Animation的XML资源

  • 传统补间动画
                

可用set标签组合起来,让这些动画同时播放,也可以为单个动画指定标签,区分:前者可多动画同时进行并且可以通过android:fillAfter=“true”,android:fillBefore="false"设定动画结束停留在最后一帧率,停留第一帧值相反,后者无法设定。
注意:
pivotX,pivotY设定的是中心点,可填Integer,X%(自身宽高比例),X%p (父容器宽高比例)
取值范围:
scale : 0-1;
alpha :0-1 ;
rotate: Integer
translate : 同pivot

控件中应用

 Animation animator = AnimationUtils.loadAnimation(MainActivity.this,R.anim.s); btn.startAnimation(animator);

Activity中应用

overridePendingTransition(R.anim.anim_exit, R.anim.enter);

放在startActivity()后即可。

FragmentDialog中应用

参考这篇文章

使用FragmentDialog自定义底部弹出Dialog,动画无效的问题

layoutAnimation
用于listView,RecycleView控制不同的child按规定时间间隔分别播放动画

anim下建立la.xml文件

  • delay:指每个Item的动画开始延时,取值是android:animation所指定动画时长的倍数,取值类型可以是float类型,也可以是百分数,默认是0.5;比如我们这里指定的动画是@anim/slide_in_left,而在slide_in_left.xml中指定android:duration=”1000”,即单次动画的时长是1000毫秒,而我们在这里的指定android:delay=”1”,即一个Item的动画会在上一个item动画完成后延时单次动画时长的一倍时间开始,即延时1000毫秒后开始。
  • animationOrder:指viewGroup中的控件动画开始顺序,取值有normal(正序)、reverse(倒序)、random(随机)
  • animation:指定每个item入场所要应用的动画。仅能指定res/aim文件夹下的animation定义的动画,不可使用animator动画。

如何在控件中定义layoutAnimation

 android:layoutAnimation="@anim/la"    

在控件Xml中添加这行即可。
代码实现:

 Animation animation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.alpha);                LayoutAnimationController controller = new LayoutAnimationController(animation);   //设置控件显示的顺序;                controller.setOrder(LayoutAnimationController.ORDER_REVERSE);   //设置控件显示间隔时间;                controller.setDelay(0.2f);   //为RecycleView设置LayoutAnimation                recyclerView.setLayoutAnimation(controller);                recyclerView.startLayoutAnimation();

这里不能直接加载la.xml。

##Animator##

同样可以是set标签

                    

android:ordering=""用于指定动画播放顺序,可填sequentially与together两种,
propertyName分为:translationX,translationY,translationZ,alpah,scaleX,scaleY,rotation,rotationX,rotationY,这几种形式。当然单个的objectAnimator也可作为一个XML文件。

注意: Animator动画XML形式无法指定中心点,所以直接在控件中设定即可。
ObjectAnimator的代码使用

 Animator animator = AnimatorInflater.loadAnimator(MainActivity.this, R.animator.set);                animator.setTarget(btn);                animator.start();

只需这几行代码就可以搞定。

Animator里的selector标签

当我们想用XML实现触摸控件发生一段动画这时就需要Animator的selector标签了。
在animator文件夹下创建sanimator.xml文件

                                                                                                                        

android:state_pressed="true"当控件被按压就会执行这个item里的动画,否则会执行其他item动画。

如何配置selector动画

android:stateListAnimator="@animator/sanimator"

只需这一行,当控件状态改变就会调用这个xml资源动画。

Drawable

Drawable这个类象征着可以在Canvas上直接画出的东西,所以内容属于静态(笔者理解的静态为控件参数不发生变化)。

selector标签
同上selector标签给予原本的方案提供了选择也就是符合条件的item在最顶层显示, Animator里的selector偏向动态,Drawable偏向静态。

**animation-list标签 **
animation-list就是传统的帧图,用过XML布置让空间不断切换drawbale。
Drawable下建立al.xml文件

                                                         

android:oneshot=“false” 只循环一次,每个item即为要展示内容,drawbale只能对应Color或者图片资源,不能对应其他Drawable下xml文件。如何应用:

btn.setBackgroundResource(R.drawable.a);                AnimationDrawable animationDrawable= (AnimationDrawable) btn.getBackground();                animationDrawable.start();

只能通过代码来实现。

animated-rotate标签

自带旋转的标签,目前笔者发现只在Progressbar控件有效,

用于替换ProgressBar的animation-list,使用时配置

 android:indeterminateDrawable="@drawable/ar"

vector标签
用XML形式解释矢量元素资源,最后还是通过Canvas绘制,这里有大佬的文章很详细。

Android vector标签 PathData 画图超详解

避免混淆:

width与height对应的是画布的宽高,而viewportHeight与viewportWidth提供的是一个规范值,意义就是pathData的值如果用dp字符等可能会引起混乱所以直接用int值来提供一种比例。

vector若是只能画出静态那直接用Canvas不就行了,所以它的核心就在动态的Canvas。

animated-vector 实现"画画"

画画必然有一个动画过程,所以使用animated-vector必然要为其提供一个anim或者animator,而anim只是单方面的渲染,所以只能使用animator。

SVG学习–AnimatedVectorDrawable的使用

笔者加强记忆

    

必然要为其指定一个 android:drawable="" 填入的就是一个vector,target标签用于给指定的path或group(path集合)添加动画,android:name=“line” 表示要添加动画的path(path集合)的name为line。

propertyName笔者发现共有以下几类:

  • translateX,translateY

  • scaleX,scaleY

  • pathData

  • strokeColor,fillColor

  • trimPathEnd,trimPathStart

总结

针对group标签,

translateX,translateYscaleX,scaleY这些属性只能用于group标签即使只有一个path,类似改变Canvas对象。其中translateX,translateY,会使得vector指定的path集发生偏移。scaleX,scaleY,会使得vector指定的path集放大缩小。 android:pivotX=""与android:pivotY=""用于指定对称点,有点类似view.setPivot()方法。  

针对path标签

pathDatastrokeColor,fillColortrimPathEnd,trimPathStart这些属性只能用于path标签,类似改变path对象。pathData会使得path标签里pathData从valueFrom向valueTo靠拢,所以二者结构要相同否则报错。strokeColor,fillColor能提供给path标签里strokeColor或者fillColor颜色的变化动画。即使path里没有该属性也不会影响动画效果。trimPathEnd,trimPathStart提供path标签里pathData顺序绘制效果动画。

最后布置vector动画

 app:srcCompat="@drawable/animated"

注意 vector标签可用作View的background,但vector动画只能用于ImageView,且必须为 app:srcCompat属性。

代码调用即可

ImageView imageView = (ImageView) view;        Drawable drawable = imageView.getDrawable();        if (drawable instanceof Animatable) {            ((Animatable) drawable).start();        }

Drawable里的Animation

在Drawable里发现可以创建Animation的XML动画,正如笔者理解Drawable偏向静态,而Animation并没有控件参数变化所以自然可以在Drawable里创建了,不再累赘。

bitmap标签
其实也就是用XML解释一个bitmap对象,必须要为其指定一个src资源文件然后通过相关属性改变其展示方式。

Android资源知识(四)之XML Bitmap

clip标签
clip标签用于剪裁drawable且用于progressbar控件,其他的笔者还未发现,当我们需要自定义progressbar的进度条drawable时需要在外加上clip才能够设置进度,详见后续。

inset标签
将多个图层叠加,但是子类大小不能直接控制(由子类本身控制)所以用layer-list替代。

level-list标签
参考这篇文章,笔者感觉level-list优势不怎么明显

level-list参考

nine-patch标签

聊天软件的对话框就是用的nine-patch标签,目的就是防止图片资源随控件整体放大而变形, 所以nine-patch就是提供了资源的布局放大。

android studio创建nine-patch

制作好nine-patch图片资源后有两种使用方式,一种是直接布局这个资源,另一种是通过nine-patch标签包裹这个资源再进行布局(相当于添加额外属性),具体就看需求了。

注意:
图片一定要正常描边,否则会报错。
正常描边后仍然报错,在build文件下android域里添加

 aaptOptions {        cruncherEnabled = false        useNewCruncher = false    }

不能用bitmap标签包裹nine图片资源,没有意义。

ripple标签

ripple标签提供了水波纹特效(类似5.0以上的button),一个控件布局了后按压会触发这个特效。

Ripple 水波纹效果

文章很详细不再啰嗦了。

shape标签

通过shape我们可以实现不需要资源文件而改变一个View绘制的形状,与vector有点类似,shape的XML可以直接作为background使用。

笔者还是贴出别人的文章 ,,哈哈

Android Shape使用

这里是shape的属性具体解释

shape属性详解

两篇文章搞懂shape就算ok了。

熟悉了后发现shape只能展示一个形状如果我们想设计出叠加效果就难实现了,其实有了layer-list就可以搞定。

layer-list标签

        

这是layer-list的简单结构, 每个item代表一个图层。layer-list与selector不同的是,前者最顶层的图层是最后的item,而后者是状态符合的item。

Android中layer-list使用详解

有了layer-list我们便可以任意组合使用Drawable的标签了,只需注意图层覆盖即可。

最后附带一个修改Progressbar的XML

                                                                                                                                                                                                                

注意: 添加id的作用用于区分progressbar与secondprogressbar.
progressbar控件如何知道那个item设置progressbar? 一种是用clip标签包裹,另一种是ring形状的shape。设置的时候一定要区分id,否则有些会失效。
依然是最下方的item在最顶层所以可能会覆盖上一个item。

最后在Progressbar里布局:

 android:progressDrawable="@drawable/layer-list"

圆形进度条progressbar用法一致,去掉clip标签,shape的形状改为ring并设置ring的相关参数其他不变就ok了。

transition标签

transition提供了两个Drawable的渐变过程,其实就是后者图层叠加在前一个图层上, 标签内存放两个item即可。

Drawable子类之——TransitionDrawable (渐变)

Menu

猴子都能看懂的Android Menu总结

menu的用法不难,按照规定的套路来即可。

Values

values下只能以resources标签形式书写,主要用于存放一些通用变量 ,自定义属性,主题(属性值集合)等

变量:

    #FF4081    @drawable/ic_launcher_round    233dp    false

代码获得

getResources().getInteger(R.integer.int);

自定义属性:

                                

后者用declare-styleable标签可以一次性获得所有自定义属性。

代码获得:

 TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.attrs); progress = typedArray.getInt(R.styleable.attr1, 0);

其中attrs是通过XML形式填入值最后包装成的对象,R.styleable.attrs是我们自定义的属性集。attr1是在属性集内的一个自定义属性,这样就能通过代码得到以XML形式给自定义属性所赋加的值了。

主题:

    

原谅笔者目前知识浅薄,好多用法总结不出来,所以暂时到这了。

路漫漫其修远兮,吾将上下而求索。

更多相关文章

  1. Android(安卓)Animation 框架
  2. 【Android】Could not find XXX.apk!的解决方法
  3. Android(安卓)8.1 关机充电动画(二)Uboot模式
  4. 四十四、Android之android:layout_weight详解
  5. Android自定义时间控件不可选择未来时间
  6. Android(安卓)apk签名、第三方内置、图标添加与删除、开关机动画
  7. 初识android 自定义控件
  8. Android近场通信---NFC基础(一)
  9. android实现一个简单的加法功能

随机推荐

  1. Android(安卓)6.0+ SMSManager 使用示例
  2. AndroidManifest 中original-package标签
  3. Java,Android,窥探组合的用法。AndroidUI
  4. Android实现计时与倒计时的5种方法
  5. Android QQ皮肤制作 apk之间资源共享
  6. Android的Message Pool是个什么鬼——源
  7. Android 开发性能优化简介
  8. Libcurl库移植指南(上)--OpenSSL库移植
  9. android TextView添加滚动条
  10. Android(安卓)Fragment 优化与切换