美文网首页Android...
android resource简单总结

android resource简单总结

作者: 梧叶已秋声 | 来源:发表于2019-07-15 16:47 被阅读0次

    按官方文档所示,resource types应有9大类。
    注意:如果实在不能访问链接的话可以把https://developer.android.com/ 中的.com换成.google.cn ,这是谷歌开发者中国站。但是,通常为了提升搜索效率,em。。这个还是要尽量想办法解决一下。

    1. Animation Resources
      1.1 Property Animation
      1.2 View Animation 
        1.2.1 Tween animation
        1.2.2 Frame animation
    2. Color State List Resource
    3. Drawable Resources
      3.1 Bitmap File
      3.2 Nine-Patch File
      3.3 Layer List
      3.4 State List
      3.5 Level List
      3.6 Transition Drawable
      3.7 Inset Drawable
      3.8 Clip Drawable
      3.9 Scale Drawable
      3.10 Shape Drawable
    4. Layout Resource
    5. Menu Resource
    6. String Resources
    7. Style Resource
    8. Font Resources
    9. More resource types
      9.1 Bool
      9.2 Color
      9.3 Dimension
      9.4 ID
      9.5 Integer
      9.6 Integer Array
      9.7 Typed Array
    

    1. Animation Resources

    动画Resources可以分为2类:属性动画(Property Animation )和视图动画(View Animation)。

    1.1 Property Animation

    属性动画:通过使用Animator在设定的时间段内修改对象的属性值来创建动画。


    image.png

    先来看看属性动画工作方式。
    方式一:线性动画。
    单位时间内(40ms内),图形的x轴坐标不断移动(每10ms移动10),终点坐标x=40(y未知,暂时想象成匀速水平运动的图形)。


    线性动画
    方式二:非线性动画。
    单位时间内(40ms内),图形的x轴坐标不断移动,第一个10ms内移动了6,第二、三个10ms内移动了14,第四个10ms内移动了6。
    非线性动画

    看完属性动画的2种工作方式后,再回过头去看属性动画的定义:
    通过使用Animator在设定的 时间段 内修改 对象的属性值 来创建动画。
    对这句话会有更深的理解。以上2个动画工作的例子设定的 时间段 均为40ms,修改的 对象的属性值 为x坐标值。就是说 对象的属性值 是 包括但不限于坐标之类的东西(还有颜色、透明度等其他属性)。
    那么现在的关键就是Animator是如何使用的。

    Animator类提供了创建动画的基本结构。 您通常不直接使用此类,因为它只提供必须扩展的最小功能,以完全支持动画值。通常使用ValueAnimator
    、ObjectAnimator以及AnimatorSet。


    https://developer.android.com/guide/topics/graphics/prop-animation.html?hl=zh-CN

    简单机翻后可以看到描述如上所示(这里先大致看两眼就行)。下面来看看这3个类的使用。

    1.ValueAnimator
    ValueAnimator的简单使用可以参考这里。
    Android动画-属性动画-ValueAnimator
    https://www.jianshu.com/p/2966227ea0b4

    这里我贴了一个比较简单但比较直观的示例。详细一点的还是看上面的链接。

    public class MainActivity extends AppCompatActivity {
        private static final String TAG = " MainActivity";
        private Button mButton;
        private ProgressBar mProgressBar;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mButton = findViewById(R.id.test_button);
            mProgressBar = findViewById(R.id.progress_bar);
            mButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 100,50,100);
                    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                        @Override
                        public void onAnimationUpdate(ValueAnimator animation) {
                            Log.i(TAG, "onAnimationUpdate: " + animation.getAnimatedValue());
                            mProgressBar.setProgress((Integer) animation.getAnimatedValue());
                        }
                    });
                    valueAnimator.setDuration(3000);
                    valueAnimator.setInterpolator(new LinearInterpolator());
                    valueAnimator.start();
                }
            });
        }
    }
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <Button
            android:id="@+id/test_button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="test"/>
    
        <ProgressBar
            android:id="@+id/progress_bar"
            style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:max="100" />
    </LinearLayout>
    

    2.ObjectAnimator
    ObjectAnimator的简单使用可以参考这里。
    【Android】属性动画(基本用法)
    https://www.jianshu.com/p/d23f58f4368d
    ps: 我觉得入门的话不推荐一上来就看长篇大论的概念,直接简单的一个helloworld就好,最好是几分钟就能跑起来的demo。这个demo就挺合适的。

    下面代码实现功能为:在1s内,将imageView的透明度从1变成0。出处是上面的链接。

    ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0f);
    animator.setDuration(1000);//时间1s
    animator.start();
    

    3.AnimatorSet
    这里我的参考链接如下:
    Android中的属性动画
    http://linzhengblog.com/2016/12/07/Android%E4%B8%AD%E7%9A%84%E5%B1%9E%E6%80%A7%E5%8A%A8%E7%94%BB/

    一个简单demo java文件如下。

    public class MainActivity extends AppCompatActivity {
        private TextView mTextView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mTextView = findViewById(R.id.test_text_view);
            ObjectAnimator objectAnimator1 = ObjectAnimator.ofInt(mTextView,"BackgroundColor",0xffff00ff,0xffffff00,0xffff00ff);
            ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(mTextView,"translationX",0,300,0);
            ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(mTextView,"translationY",0,300,0);
            AnimatorSet animatorSet = new AnimatorSet();
            animatorSet.playSequentially(objectAnimator1,objectAnimator2,objectAnimator3);
            animatorSet.setDuration(3000);
            animatorSet.start();
        }
    }
    

    xml文件如下。

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
       <TextView
           android:id="@+id/test_text_view"
           android:text="test"
           android:layout_width="match_parent"
           android:layout_height="match_parent" />
    </LinearLayout>
    

    从使用上来对3者进行对比,AnimatorSet 是使用多个ObjectAnimator(即合集)去实现动画效果,ValueAnimator则无法直接对图形属性进行操作。

    最后,还可以在Xml中定义ValueAnimator 、ObjectAnimator和 AnimatorSet。
    参考链接:
    http://linzhengblog.com/2016/12/07/Android%E4%B8%AD%E7%9A%84%E5%B1%9E%E6%80%A7%E5%8A%A8%E7%94%BB/

    在res下新建animator文件夹。
    animator文件夹下分别新建value_animator.xml、object_animator.xml以及animator_set.xml文件。
    value_animator.xml如下。

    <?xml version="1.0" encoding="utf-8"?>
    <animator  xmlns:android="http://schemas.android.com/apk/res/android"
        android:valueFrom="0"
        android:valueTo="300"
        android:duration="1000"
        android:valueType="intType"
        android:interpolator="@android:anim/bounce_interpolator"/>
    

    object_animator.xml如下。

    <?xml version="1.0" encoding="utf-8"?>
    <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="1000"
        android:valueTo="200"
        android:valueType="floatType"
        android:propertyName="y"
        android:repeatCount="1"
        android:repeatMode="reverse"/>
    

    animator_set.xml如下。

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:ordering="together">
    
        <objectAnimator
            android:propertyName="x"
            android:duration="500"
            android:valueFrom="0"
            android:valueTo="400"
            android:valueType="floatType"/>
    
        <objectAnimator
            android:propertyName="y"
            android:duration="500"
            android:valueFrom="0"
            android:valueTo="300"
            android:valueType="floatType"/>
    
    </set>
    

    layout xml文件如下。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
       <TextView
           android:id="@+id/test_text_view"
           android:text="test"
           android:layout_width="match_parent"
           android:layout_height="wrap_content" />
    </LinearLayout>
    

    使用ValueAnimator 时java代码如下所示。

            ValueAnimator valueAnimator = (ValueAnimator) AnimatorInflater.loadAnimator(this, R.animator.value_animator);
            valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    int offset = (int) animation.getAnimatedValue();
                    mTextView.layout(mTextView.getLeft(), offset, mTextView.getRight(), offset + mTextView.getHeight());
                }
            });
            valueAnimator.start();
    

    使用ObjectAnimator时java代码如下所示。

            ObjectAnimator objectAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.object_animator);
            objectAnimator.setTarget(mTextView);
            objectAnimator.start();
    

    使用AnimatorSet 时java代码如下所示。

            AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(this,R.animator.animator_set);
            animatorSet.setTarget(mTextView);
            animatorSet.start();
    

    看完Animator的ValueAnimator、ObjectAnimator以及AnimatorSet这3个基本类的使用后,如果想对属性动画深入了解也可以来看官方给出的示例。
    demo地址如下(这个是api demo合集)。
    https://android.googlesource.com/platform/development/+/master/samples/ApiDemos?autodive=0/
    进入之后,点击tgz下载,找到动画那个文件夹。

    image.png

    由于这个不是标准工程文件,所以需自行移植到project中。
    属性动画就到这里了,下面来看视图动画。

    1.2 View Animation

    视图动画可以分为补间动画(Tween animation)和帧动画(Frame animation)。

    1.2.1 Tween animation

    补间动画:通过使用Animation对单个图像执行一系列转换来创建动画。

    上面的定义比较简单,可以去往视频方向去查找补间定义。
    这种视频类的资料adobe官网定义还是挺详细的。
    补间
    补间动画用于在 Animate 中创建动画运动。补间动画是通过为第一帧和最后一帧之间的某个 对象属性 指定不同的值来创建的。对象属性包括位置、大小、颜色、效果、滤镜及旋转。

    再来看看补间动画的创建。
    创建补间动画
    创建补间动画过程如下图。

    创建补间动画
    简单来说,使用adobe 软件 创建补间动画的过程就是定义帧长度,起点和终点,以及运动路径等。这只是一个基本的定义。
    看完了广义上所定义的的补间动画,再回过头来看android中的补间动画。

    View Animation

    补间动画可以对View对象的内容执行一系列简单的转换(位置,大小,旋转和透明度)。 基本与广义上的补间动画 一致(功能稍微少一点)。

    对定义有了一定概念后,现在来看具体使用。
    在res目录下新建anim文件夹,再新建hyperspace_jump.xml文件。

    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <scale
            android:interpolator="@android:anim/accelerate_decelerate_interpolator"
            android:fromXScale="1.0"
            android:toXScale="1.4"
            android:fromYScale="1.0"
            android:toYScale="0.6"
            android:pivotX="50%"
            android:pivotY="50%"
            android:fillAfter="false"
            android:duration="700" />
        <set
            android:interpolator="@android:anim/accelerate_interpolator"
            android:startOffset="700">
            <scale
                android:fromXScale="1.4"
                android:toXScale="0.0"
                android:fromYScale="0.6"
                android:toYScale="0.0"
                android:pivotX="50%"
                android:pivotY="50%"
                android:duration="400" />
            <rotate
                android:fromDegrees="0"
                android:toDegrees="-45"
                android:toYScale="0.0"
                android:pivotX="50%"
                android:pivotY="50%"
                android:duration="400" />
        </set>
    </set>
    
    public class MainActivity extends AppCompatActivity {
        private TextView mTextView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mTextView = findViewById(R.id.test_text_view);
            Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
            mTextView.startAnimation(hyperspaceJump);
        }
    }
    

    这就是一个简单的demo了。
    详细的可以看这个。
    Android 动画:手把手教你使用 补间动画 (视图动画)
    https://blog.csdn.net/carson_ho/article/details/72827747
    下面来看Frame animation。

    1.2.2 Frame animation

    帧动画:通过使用AnimationDrawable按顺序显示一系列图像来创建动画。

    现在来看adobe上的定义。

    动画的类型
    逐帧动画 使用此动画技术,可以为时间轴中的每个帧指定不同的艺术作品。使用此技术可创建与快速连续播放的影片帧类似的效果。对于 每个帧的图形元素必须不同的复杂动画 而言,此技术非常有用。

    android中帧动画的具体使用。
    首先随便画4张图,分别命名为r0、r1,r2 和 r3。

    image.png

    把这4张图放到drawable目录下。
    然后 在res/drawable目录下,新建rocket.xml文件。

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="false">
        <item android:drawable="@drawable/r1" android:duration="200" />
        <item android:drawable="@drawable/r2" android:duration="200" />
        <item android:drawable="@drawable/r3" android:duration="200" />
    </animation-list>
    

    layout xml文件如下

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
      <ImageView
           android:id="@+id/test_image_view"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:background="@drawable/r0"/>
    </LinearLayout>
    

    java 文件如下

    public class MainActivity extends AppCompatActivity {
        private AnimationDrawable rocketAnimation;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ImageView rocketImage = findViewById(R.id.test_image_view);
            rocketImage.setBackgroundResource(R.drawable.rocket);
            rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
            rocketImage.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    rocketAnimation.start();
                }
            });
        }
    }
    
    

    最后再来看这3种动画的区别。
    先回过头去看3种动画的基本定义。
    属性动画:通过使用Animator在设定的时间段内修改对象的属性值来创建动画。
    补间动画:通过使用Animation对单个图像执行一系列转换来创建动画。
    帧动画:通过使用AnimationDrawable按顺序显示一系列图像来创建动画。
    按字面的意思去理解,就是按Animator、Animation和AnimationDrawable这三种不同的方式去实现动画的效果,毕竟要想使画面有动感有多种实现方式。此时再回忆一下3种动画方式的简单demo,会对这3种定义有更深的理解。
    从上面的信息来看帧动画特点很明显(多个图片),属性动画和补间动画的差异并不容易发现。

    以下文字出处
    Android中属性动画和补间动画的区别
    https://blog.csdn.net/wzy_1988/article/details/50587248
    为什么引入属性动画
    Android3.0之前提供的补间动画机制还算相对比较健全的,比如你的需求中只需要对View进行移动、缩放、旋转和淡入淡出的操作,那么补间动画已经足够健全了。但是,如果一旦需求超出了这四种操作,补间动画就无能为力了。
    例如,我们需要改变View的宽度,这个时候就不能通过补间动画实现。此外,补间动画还有一个最大的缺陷,就是它只是改变了View的显示效果而已,并不会真正的改变View的属性。具体来说,例如屏幕左上角有一个Button,使用补间动画将其移动到右下角,此刻你去点击右下角的Button,它是绝对不会响应点击事件的,因此其作用区域依然还在左上角。只不过是补间动画将其绘制在右下角而已。

    就是说,实际上android中的所谓补间动画,只是动画效果得到了实现,实际上view控件的位置等属性并没有变化。应该这样说,android中定义的补间动画并不是广义上的补间动画,属性动画更像广义上的补间动画。
    动画的Resource就到此为止,下面是Color State List。

    2. Color State List Resource

    image.png

    A ColorStateList是您可以在XML中定义的对象,您可以将其应用为颜色,但实际上会根据View应用它的对象的状态更改颜色。例如,Button窗口小部件可以存在于几种不同状态之一(按下,聚焦或两者都不存在),并且使用颜色状态列表,您可以在每个状态期间提供不同的颜色。
    从使用方式上来看其实跟state list drawable差不多,但是功能更单一。
    使用方式
    在res/color/目录下新建button_text.xml文件。

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true"
              android:color="#ffff0000"/> <!-- pressed -->
        <item android:state_focused="true"
              android:color="#ff0000ff"/> <!-- focused -->
        <item android:color="#ff000000"/> <!-- default -->
    </selector>
    

    layout 文件中加入一个

     <Button
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="text"
           android:textColor="@color/button_text" />
    

    这样就不点击的情况下显示android:color定义的颜色,点击的情况下显示android:state_pressed定义的颜色。
    不过这样是无法显示android:state_focused定义的颜色。如果想显示android:state_focused的颜色话Button控件定义加一点。

    <Button
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="text"
           android:textColor="@color/button_text"
           android:focusable="true"
           android:focusableInTouchMode="true"/>
    

    这个功能其实还是挺少用的,下面来看Drawable ,这是个放了超多资源的文件夹。

    3. Drawable Resources

    先来看什么叫Drawable 。

    在Android世界里,凡是要在屏幕上绘制的东西都可以叫作drawable。
    //出处为android编程权威指南。

    再来看官方文档中的定义。
    Drawable Resources,即 可绘制对象资源。
    可绘制对象资源是一般概念,是指可在屏幕上绘制的图形,以及可以使用 getDrawable(int) 等 API 检索 或者 应用到具有 android:drawable 和 android:icon 等属性的 其他 XML 资源 的图形。
    这里就简单理解是 图片格式 的文件 或 xml的格式的文件吧。

    3.1 Bitmap File

    Bitmap File,位图文件。
    Android 支持以下三种格式的 位图文件:.png(首选)、.jpg(可接受)、.gif(不建议)。
    您可以使用文件名作为资源 ID 直接引用位图文件,也可以在 XML 中创建别名资源 ID。
    位图文件是 .png、.jpg 或 .gif 文件。当您将这些文件保存到 res/drawable/ 目录中时,Android 将为它们创建 Drawable 资源。
    文件位置:res/drawable/filename.png(.png、.jpg 或 .gif)
    资源引用:
    在 Java 中:R.drawable.filename
    在 XML 中:@[package:]drawable/filename
    在 XML 中引用示例:
    当图像保存为 res/drawable/myimage.png 后,此布局 XML 会将图像应用到视图:

    <ImageView
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:src="@drawable/myimage" />
    

    在 Java 中引用示例

    以下应用代码将图像作为 Drawable 检索:
    Resources res = getResources();
    Drawable drawable = res.getDrawable(R.drawable.myimage);

    另外,还有一种XML bitmap。
    XML bitmap是在 XML 中定义的资源,指向bitmap file。实际上是原始位图文件的别名。XML 可以指定位图的其他属性,例如抖动和层叠。
    文件位置:res/drawable/filename.xml
    具体定义如下。

    <?xml version="1.0" encoding="utf-8"?>
    <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@drawable/icon"
        android:tileMode="repeat" />
    

    android:tileMode 定义平铺模式。当平铺模式启用时,位图会重复。重力在平铺模式启用时将被忽略。

    3.2 Nine-Patch File

    Nine-Patch File,九宫格文件。
    NinePatch 是一种 PNG 图像,在其中可定义当视图中的内容超出正常图像边界时 Android 缩放的可拉伸区域。
    关于这句话的理解,可以参考这里:
    Android开发 -- .9图片原理和Draw 9-patch工具的使用
    https://blog.csdn.net/genius9_9/article/details/45691741
    这张图充分诠释了当视图中的内容超出正常图像边界时使用9 path的好处。

    image.png

    文件位置:res/drawable/filename.9.png

    NinePatch 图形及其工作原理一开始我是想通过参考官方文档去理解,但是这个看得我还是一头雾水。
    NinePatch drawables

    //以下部分出自android编程权威指南


    9-patch拉伸原理

    顶部以及左边框标记了图像的可拉伸区域,那么底部以及右边框又该如何处理呢?它们定义了9-patch图像的可选内容区。内容区是绘制内容(通常是文字)的地方。如果不标记内容区,那么默认与可拉伸区域保持一致。

    下面来看NinePatch 的具体使用。
    官方文档有说明如何使用工具。
    创建可调整大小的位图(9-Patch 文件)

    下面的这个是实际中的应用场景。
    Android draw9patch 图片制作与使用
    关于9patch图片制作的关键点在于下面这4点。

    1.上边 决定左右拉升不变
    2.左边 决定上下拉升不变形
    3.右边 设置内容高度区域
    4.下边 设置内容宽度区域

    关键在于画黑点的时候4个方向的黑点分别有导致不同的效果。
    以下是我把电脑桌面的自带时钟(因为我觉得时钟能更好显示出拉伸的效果)截图放到android studio中尝试制作9 patch的效果图。
    原图如下:

    原图
    随便在左边的9到10点钟之间的位置画了黑点后的效果图如下:
    image.png
    image.png
    可以发现,这个效果是当整个图片文件进行竖直方向的拉伸时,9到10点,2到3点这个部分会进行竖直方向的拉伸,其他部分保持不变。
    当图片进行水平方向拉伸时亦是如此。

    在4个方向都画上像素点后如下图:


    9patch图

    多尝试动手画一画像素点并且查看预览图就能理解了。

    如同bitmap有XML bitmap一样,这里Nine-Patch也有xml文件——XML Nine-Patch。
    XML Nine-Patch是在 XML 中定义的资源,指向 Nine-Patch file。XML 可以为图像指定抖动。
    文件位置:res/drawable/filename.xml
    xml示例:

    <?xml version="1.0" encoding="utf-8"?>
    <nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@drawable/myninepatch"
        android:dither="false" />
    

    android:dither 布尔值。当位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕),启用或停用位图抖动。

    3.3 Layer List

    Layer List,图层列表
    LayerDrawable是管理其他可绘制对象阵列的可绘制对象。列表中的每个可绘制对象按照列表的顺序绘制,列表中的最后一个可绘制对象绘于顶部。
    每个可绘制对象由单一 <layer-list> 元素内的 <item> 元素表示。
    文件位置:
    res/drawable/filename.xml
    官方文档中代码如下所示。基本构造就是用layer-list+item,然后item中放Drawable resource

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item>
          <bitmap android:src="@drawable/android_red"
            android:gravity="center" />
        </item>
        <item android:top="10dp" android:left="10dp">
          <bitmap android:src="@drawable/android_green"
            android:gravity="center" />
        </item>
        <item android:top="20dp" android:left="20dp">
          <bitmap android:src="@drawable/android_blue"
            android:gravity="center" />
        </item>
    </layer-list>
    

    //以下部分出自android编程权威指南第二版
    下面的代码出自android编程权威指南,是书中关于layer-list的实例讲解。可以看出实际中item下的Drawable resource,不仅可以放bitmap file,还可以放shape drawable等资源。

    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
      <item>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="oval">
          <solid android:color="@color/red"/>
        </shape>
      </item>
      <item>
        <shape android:shape="oval">
            <stroke 
              android:width="4dp"
              android:color="@color/dark_red"/>
        </shape>
      </item>
    </layer-list>
    

    layer list drawable中指定了两个drawable。第一个是和以前一样的红圈。第二个则会绘制在第一个圈上,它定义了一个4dp粗的深红圈。



    仅定义红圈图如下所示。


    从实际应用中可以看出,Layer List的用法是将多个drawable resource组合到一起,形成一个新的drawable resource,以达到更好的视觉效果。

    3.4 State List

    State List,状态列表
    StateListDrawable 是在 XML 中定义的可绘制对象,它根据对象的状态,使用多个不同的图像来表示同一个图形。例如,Button 小部件可以是多种不同状态(按下、聚焦或这两种状态都不是)中的其中一种,而且可以利用状态列表可绘制对象为每种状态提供不同的背景图片。
    您可以在 XML 文件中描述状态列表。每个图形由单一 <selector> 元素内的 <item> 元素表示。每个 <item> 均使用各种属性来描述应用作可绘制对象的图形的状态。
    文件位置:
    res/drawable/filename.xml
    官方实例如下所示。

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true"
              android:drawable="@drawable/button_pressed" /> <!-- pressed -->
        <item android:state_focused="true"
              android:drawable="@drawable/button_focused" /> <!-- focused -->
        <item android:state_hovered="true"
              android:drawable="@drawable/button_focused" /> <!-- hovered -->
        <item android:drawable="@drawable/button_normal" /> <!-- default -->
    </selector>
    

    应用则是在layout xml中添加android:background属性。

    <Button
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:background="@drawable/filename" />
    

    这里可以随便尝试一下。
    在drawable下新建一个test.xml,并且随便截个图片,命名为testaa,放到drawable目录下。
    test.xml具体如下所示。

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true"
              android:drawable="@drawable/testaa" />
    </selector>
    

    最后在layout xml的控件中加入 android:background="@drawable/test",实际运行后,当控件处于被按状态时,图片就会显示出来。

    3.5 Level List

    Level List,级别列表
    管理大量备选可绘制对象的可绘制对象,每个可绘制对象都分配有最大的备选数量。使用 setLevel() 设置可绘制对象的级别值会加载级别列表中 android:maxLevel 值大于或等于传递到方法的值的可绘制对象资源。
    文件位置:
    res/drawable/filename.xml
    官方示例

    <?xml version="1.0" encoding="utf-8"?>
    <level-list xmlns:android="http://schemas.android.com/apk/res/android" >
        <item
            android:drawable="@drawable/status_off"
            android:maxLevel="0" />
        <item
            android:drawable="@drawable/status_on"
            android:maxLevel="1" />
    </level-list>
    

    在此项目应用到 View 后,可通过 setLevel() 或 setImageLevel() 更改级别。
    这个实际应用比较少,但是还是有,我找到了这个:
    图片设置level-list,根据不同状态显示不同图片
    Android样式开发之layer-list、level-list总结

    简单试一下效果。
    先新建一个level-list的xml文件filename.xml。testaa和testbb是随便电脑桌面截图的图片。

    <?xml version="1.0" encoding="utf-8"?>
    <level-list xmlns:android="http://schemas.android.com/apk/res/android" >
        <item android:maxLevel="0" android:drawable="@drawable/testaa"/>
        <item android:maxLevel="1" android:drawable="@drawable/testbb"/>
    </level-list>
    

    注意:android:maxLevel 必须从0递增,顺序错误后只会显示第一张图片

    然后在button中引用。

     <Button
            android:id="@+id/test_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            android:background="@drawable/filename"/>
    

    最后在简单测试一下。点击button后,background的图片就会变化。

    public class MainActivity extends AppCompatActivity {
        private Button mButton;
        private LevelListDrawable pauseDrawable;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mButton = (Button) findViewById(R.id.test_button);
            pauseDrawable = (LevelListDrawable) mButton.getBackground();
            mButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    pauseDrawable.setLevel(1);//根据业务需要,对应图片等级
                }
            });
        }
    }
    

    3.6 Transition Drawable

    Transition Drawable,转换可绘制对象
    TransitionDrawable是可在两种drawable resources之间交错淡出的可绘制对象。
    每个可绘制对象由单一 <transition> 元素内的 <item> 元素表示。不支持超过两个项目。要向前转换,请调用 startTransition()。要向后转换,则调用 reverseTransition()。
    文件位置:
    res/drawable/filename.xml
    官方给出的示例挺详细的,照着跑一遍挺容易理解这个的。

    <?xml version="1.0" encoding="utf-8"?>
    <transition xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/on" />
        <item android:drawable="@drawable/off" />
    </transition>
    
    <ImageButton
        android:id="@+id/button"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:src="@drawable/transition" />
    
    ImageButton button = (ImageButton) findViewById(R.id.button);
    TransitionDrawable drawable = (TransitionDrawable) button.getDrawable();
    drawable.startTransition(500);
    

    3.7 Inset Drawable

    Inset Drawable,插入可绘制对象
    在 XML 文件中定义的以指定距离插入其他可绘制对象的可绘制对象。当视图需要小于视图实际边界的背景时,此类可绘制对象很有用。

    文件位置:
    res/drawable/filename.xml
    官方示例

    <?xml version="1.0" encoding="utf-8"?>
    <inset xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/background"
        android:insetTop="10dp"
        android:insetLeft="10dp" />
    

    原谅我光看这些真的看不懂啊。
    我后面参考下面的链接简单试了一下,对这个有了一定的认识。
    InsetDrawable
    但是这个应用场景又是什么?这个感觉实际应用中很少见。感觉是只有面试中才会问到的知识点。
    我的Android进阶之旅------>Android嵌入图像InsetDrawable的用法

    3.8 Clip Drawable

    Clip Drawable,裁剪可绘制对象
    在 XML 文件中定义的对其他可绘制对象进行裁剪(根据其当前级别)的可绘制对象。您可以根据级别以及用于控制其在整个容器中位置的重力,来控制子可绘制对象的裁剪宽度和高度。通常用于实现进度栏之类的项目。
    文件位置:
    res/drawable/filename.xml
    具体应用实例官方代码很详细了。
    drawable下新建clip.xml文件。

    <?xml version="1.0" encoding="utf-8"?>
    <clip xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/android"
        android:clipOrientation="horizontal"
        android:gravity="left" />
    

    在layout xml的对应控件中加入 android:background="@drawable/clip"

    <ImageView
        android:id="@+id/image"
        android:background="@drawable/clip"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content" />
    

    最后添加java代码如下。

    ImageView imageview = (ImageView) findViewById(R.id.image);
    ClipDrawable drawable = (ClipDrawable) imageview.getDrawable();
    drawable.setLevel(drawable.getLevel() + 1000);
    

    具体应该是用来制作进度条、实现一些效果吧,稍微搜了一下。
    Android中ClipDrawable的使用

    3.9 Scale Drawabl

    Scale Drawabl,缩放可绘制对象
    在 XML 文件中定义的更改其他可绘制对象大小(根据其当前级别)的可绘制对象。
    文件位置:
    res/drawable/filename.xml
    官方示例。

    <?xml version="1.0" encoding="utf-8"?>
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/logo"
        android:scaleGravity="center_vertical|center_horizontal"
        android:scaleHeight="80%"
        android:scaleWidth="80%" />
    

    虽然找到了使用详解,但是使用场景我真的没有搜到,暂时只能用百度的我废了。。。
    Android Drawable - Scale Drawable使用详解(附图)

    3.10 Shape Drawable

    Shape Drawable,形状可绘制对象
    这是在 XML 中定义的一般形状。
    文件位置:
    res/drawable/filename.xml
    这个就真的是没有预览图直接xml作图了。
    官方示例如下。

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <gradient
            android:startColor="#FFFF0000"
            android:endColor="#80FF00FF"
            android:angle="45"/>
        <padding android:left="7dp"
            android:top="7dp"
            android:right="7dp"
            android:bottom="7dp" />
        <corners android:radius="8dp" />
    </shape>
    

    这个有点复杂,先来看一个简单的,以下代码出自android编程权威指南。

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
           android:shape="oval">
        <solid android:color="#FFFF0000"/>
    </shape>
    

    然后在layout xml中对应的控件中加入android:background属性并引用上面的xml文件,运行一下,看下效果。
    最后,对照文档,查看所定义的xml的具体情况。
    android:shape
    关键字。定义形状的类型。"oval" 适应包含视图尺寸的椭圆形状。
    <solid>
    用于填充形状的纯色。
    属性: android:color 颜色。应用于形状的颜色,以十六进制值或颜色资源表示。
    通过对照官方文档,对shape xml的定义有了一定的了解,就可以再深入下去多看一些shape xml是如何写的了,shape xml实际应用还是挺广泛的。

    Drawable Resources小结:

    Drawable Resources下的10个点,除了Bitmap File 和Nine-Patch File是与图片有关,这10个Drawable Resources均与XML 相关。
    //以下部分出自android编程权威指南

    XML drawable用起来方便灵活,不仅用法多样,还易于更新维护。另外,XML drawable独立于屏幕像素密度,它们直接定义在drawable目录中,不需要加屏幕密度资源修饰符。如果是普通图像,就需要准备多个版本,以适配不同屏幕像素密度的设备;而XML drawable只要定义一次,就能在任何设备的屏幕上表现出色。

    4. Layout Resource

    A layout resource defines the architecture for the UI in an Activity or a component of a UI.
    文件位置:
    res/layout/filename.xml
    构成元素有以下几种:
    <ViewGroup>
    <View>
    <requestFocus>
    <include>
    <merge>
    这些元素的属性是android:id、android:layout_height以及android:layout_width等,不同的元素属性还是有一定的差别,例如View下的各个控件属性差别还是挺大的,这个页面中并没有详细说明,这个只有在实际使用中才能体会。

    如果想了解更多需要看下面的链接

    5. Menu Resource

    A menu resource defines an application menu (Options Menu, Context Menu, or submenu) that can be inflated with MenuInflater.
    文件位置:
    res/menu/filename.xml
    使用详情可以参考这个 Menus ,或者直接搜索菜单相关实例。

    6. String Resources

    字符串资源为您的应用提供具有可选文本样式和格式设置的文本字符串。 共有三种类型的资源可为您的应用提供字符串:

    String
    提供单个字符串的 XML 资源。

    String Array
    提供字符串数组的 XML 资源。

    Quantity Strings (Plurals)
    带有用于多元化的不同字符串的 XML 资源。

    String

    可从应用或从其他资源文件(如 XML 布局)引用的单个字符串。
    文件位置:
    res/values/filename.xml
    filename 是任意值。<string> 元素的 name 将用作资源 ID。
    但是通常来说filename都会命名为strings.xml。

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="hello">Hello!</string>
    </resources>
    

    元素:
    <resources> 必备。此元素必须是根节点。无属性。
    <string> 一个字符串,可包括样式设置标记。请注意,您必须将撇号和引号转义。 如需了解有关如何正确设置字符串样式和格式的详细信息,请参阅下文的格式和样式设置。string属性:name 。
    XML 中引用。

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />
    

    java中引用

    String string = getString(R.string.hello);
    

    StringArray

    可从应用引用的字符串数组。
    文件位置:
    res/values/filename.xml
    filename 是任意值。<string-array> 元素的 name 将用作资源 ID。

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="planets_array">
            <item>Mercury</item>
            <item>Venus</item>
            <item>Earth</item>
            <item>Mars</item>
        </string-array>
    </resources>
    

    元素:
    <resources> 必备。此元素必须是根节点。无属性。
    <string-array> 定义一个字符串数组。包含一个或多个 <item> 元素。属性:name String。数组的名称。该名称将用作资源 ID 来引用数组。
    <item>一个字符串,可包括样式设置标记。其值可以是对另一字符串资源的引用。 必须是 <string-array> 元素的子项。请注意,您必须将撇号和引号转义。 如需了解有关如何正确设置字符串样式和格式的信息,请参阅下文的格式和样式设置
    无属性。
    在java中使用如下。

    Resources res = getResources();
    String[] planets = res.getStringArray(R.array.planets_array);
    

    Quantity Strings (Plurals)

    不同语言在语法数量一致上具有不同的规则。例如,在英语中,数量 1 是一种特殊情况。 我们会写成“1 book”,但如果是任何其他数量,我们则会写成“n books”。 这种对单复数的区分很常见,但其他语言进行了更加细致的区分。 Android 支持的完整集合包括 zero、one、two、few、many 和 other。

    值 说明
    zero 当语言要求对数字 0 做特殊对待时(如阿拉伯语的要求)。
    one 当语言要求对 1 这类数字做特殊对待时(如英语和大多数其他语言中对数字 1 的对待要求;在俄语中,任何末尾是 1 但不是 11 的数字均属此类)。
    two 当语言要求对 2 这类数字做特殊对待时(如威尔士语中对 2 的要求,或斯洛文尼亚语中对 102 的要求)。
    few 当语言要求对“小”数字做特殊对待时(如捷克语中的 2、3 和 4;或波兰语中末尾是 2、3 或 4 但不是 12、13 或 14 的数字)。
    many 当语言要求对“大”数字做特殊对待时(如马耳他语中末尾是 11-99 的数字)。
    other 当语言不要求对给定数量做特殊对待时(如中文中的所有数字,或英语中的 42)。

    文件位置:
    res/values/filename.xml
    filename 是任意值。<plurals> 元素的 name 将用作资源 ID

    保存在res/values/strings.xml 的 XML 文件:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <plurals name="numberOfSongsAvailable">
            <!--
                 As a developer, you should always supply "one" and "other"
                 strings. Your translators will know which strings are actually
                 needed for their language. Always include %d in "one" because
                 translators will need to use %d for languages where "one"
                 doesn't mean 1 (as explained above).
              -->
            <item quantity="one">%d song found.</item>
            <item quantity="other">%d songs found.</item>
        </plurals>
    </resources>
    

    保存在 res/values-pl/strings.xml 的 XML 文件:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <plurals name="numberOfSongsAvailable">
            <item quantity="one">Znaleziono %d piosenkę.</item>
            <item quantity="few">Znaleziono %d piosenki.</item>
            <item quantity="other">Znaleziono %d piosenek.</item>
        </plurals>
    </resources>
    

    代码中引用如下。getNumberOfsongsAvailable()需根据实际需求定义。

    int count = getNumberOfsongsAvailable();
    Resources res = getResources();
    String songsFound = res.getQuantityString(R.plurals.numberOfSongsAvailable, count, count);
    

    使用 getQuantityString() 方法时,如果您的字符串包括的字符串格式设置带有数字,则需要传递 count 两次。 例如,对于字符串 %d songs found,第一个 count 参数选择相应的复数字符串,第二个 count 参数将插入 %d 占位符内。 如果您的复数字符串不包括字符串格式设置,则无需向 getQuantityString 传递第三个参数。

    格式和样式设置

    关于如何正确设置字符串资源的格式和样式,您应该了解下面这几个要点。

    • 转义撇号和引号
    • 设置字符串格式
    • 使用 HTML 标记设置样式
    • 使用 Spannable 设置样式
    1. 转义撇号和引号
      如果字符串中包含撇号 ',您必须用反斜杠 ' 将其转义,或为字符串加上双引号 ""。 例如,以下是一些有效和无效的字符串:
    <string name="good_example">This\'ll work</string>
    <string name="good_example_2">"This'll also work"</string>
    <string name="bad_example">This doesn't work</string>
        <!-- Causes a compile error -->
    

    如果字符串中包含双引号,您必须将其转义(使用 ")。 为字符串加上单引号不起作用。

    <string name="good_example">This is a \"good string\".</string>
    <string name="bad_example">This is a "bad string".</string>
        <!-- Quotes are stripped; displays as: This is a bad string. -->
    <string name="bad_example_2">'This is another "bad string".'</string>
        <!-- Causes a compile error -->
    

    2.设置字符串格式
    如果您需要使用 String.format(String, Object...) 设置字符串格式,可以通过在字符串资源中加入格式参数来实现。 例如,对于以下资源:

    <string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
    

    在本例中,格式字符串有两个参数:
    %1$s 是一个字符串,而 %2$d 是一个十进制数字。 您可以像下面这样使用应用中的参数设置字符串格式:

    Resources res = getResources();
    String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
    

    3.使用 HTML 标记设置样式
    您可以使用 HTML 标记为字符串添加样式设置。例如:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="welcome">Welcome to <b>Android</b>!</string>
    </resources>
    

    支持的 HTML 元素包括:

    • <b> 表示粗体文本。
    • <i> 表示斜体文本。
    • <u> 表示 下划线 文本。
      有时,您可能想让自己创建的带样式文本资源同时也用作格式字符串。 正常情况下,这是行不通的,因为 String.format(String, Object...) 方法会去除字符串中的所有样式信息。 这个问题的解决方法是编写带转义实体的 HTML 标记,在完成格式设置后,这些实体可通过 fromHtml(String) 恢复。 例如:
      1.将您带样式的文本资源存储为 HTML 转义字符串:
    <resources>
      <string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string>
    </resources>
    

    在这个带格式的字符串中,添加了<b>元素。请注意,开括号使用 &lt; 表示法进行了 HTML 转义。
    2.然后照常设置字符串格式,但还要调用 fromHtml(String) 以将 HTML 文本转换成带样式文本:

    Resources res = getResources();
    String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
    CharSequence styledText = Html.fromHtml(text);
    

    由于 fromHtml(String) 方法将设置所有 HTML 实体的格式,因此务必要使用 htmlEncode(String) 对您用于带格式文本的字符串中任何可能的 HTML 字符进行转义。 例如,如果您向 String.format() 传递的字符串参数可能包含“<”或“&”之类的字符,则必须在设置格式前进行转义,这样在通过 fromHtml(String)传递带格式字符串时,字符就能以原始形式显示出来。 例如:

    String escapedUsername = TextUtil.htmlEncode(username);
    
    Resources res = getResources();
    String text = String.format(res.getString(R.string.welcome_messages), escapedUsername, mailCount);
    CharSequence styledText = Html.fromHtml(text);
    

    4.使用 Spannable 设置样式
    Spannable 是一种文本对象,让您可以使用颜色和字体粗细等字体属性进行样式设置。 您可以使用 SpannableStringBuilder 生成文本,然后对文本应用 android.text.style包中定义的样式。
    总而言之,就是定义高级显示效果的的样式。
    延伸:
    SpannableString实现富文本样式

    7. Style Resource

    A style resource defines the format and look for a UI. A style can be applied to an individual View (from within a layout file) or to an entire Activity or application (from within the manifest file).
    For more information about creating and applying styles, please read Styles and Themes.
    file location: res/values/filename.xml
    关于Style,官方文档并不是很详细,可能是因为太多了。当初我是看android编程权威指南了解概况的。

    8. Font Resources

    A font resource defines a custom font that you can use in your app. Fonts can be individual font files or a collection of font files, known as a font family and defined in XML.

    Also see how to define fonts in XML or instead use downloadable fonts.
    文件位置:
    res/font/filename.ttf (.ttf, .ttc, .otf, or .xml)
    1.首先搜索lobster.ttf 或者其他所需字体文件,把文件下下来,放到res/font目录下。
    2.然后创建font family。
    在res/font/下创建lobster.xml文件,具体如下

    <?xml version="1.0" encoding="utf-8"?>
    <font-family xmlns:android="http://schemas.android.com/apk/res/android">
        <font
            android:fontStyle="normal"
            android:fontWeight="400"
            android:font="@font/lobster_regular" />
        <font
            android:fontStyle="italic"
            android:fontWeight="400"
            android:font="@font/lobster_italic" />
    </font-family>
    

    3.最后在layout xml中引用。

    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:fontFamily="@font/lobster"/>
    

    这里有一个地方我感觉比较模糊,就是创建font family的时候定义了2个<font>并且定义了android:fontStyle 为normal或italic(即正常或斜体),但是在layout xml中实际调用的时候好像并没有用到此处,实际调用的是lobster。由于知识的全面性不够我无法理解这个。

    而且Fonts in XML中实际的效果图,也不是用lobster后的效果图,而是typo_graphica和dancing_script的效果图。所以实际使用lobster.ttf后创建font family,最后在layout xml中引用的一整套流程我是模糊的,还有一个模糊点是<font>定义normal和italic时实际会调用哪个,具体如何操作我也是很模糊的。
    我怀疑TextView中的android:fontFamily="@font/lobster"这个实际上应该写成android:fontFamily="@font/normal"或者android:fontFamily="@font/italic"才对,因为通常来说,@后面跟是是font,因此@font/后面应该写上 <font>节点中的内容才对。不过这些只是我的猜测。
    由于这个是api26后才引入的特性,所以用的人也比较少,而且现在我手上的设备用的还是android studio 2.x版本,版本太低了,无法进行实测,因此这些问题就先搁置了。

    后面还有一个Downloadable font就先略过。

    9. More resource types

    9.1 Bool

    A boolean value defined in XML.
    file location: res/values/filename.xml
    XML file saved at res/values-small/bools.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <bool name="screen_small">true</bool>
        <bool name="adjust_view_bounds">true</bool>
    </resources>
    

    java中调用

    Resources res = getResources();
    boolean screenIsSmall = res.getBoolean(R.bool.screen_small);
    

    xml中调用

    <ImageView
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:src="@drawable/logo"
        android:adjustViewBounds="@bool/adjust_view_bounds" />
    

    9.2 Color

    在 XML 中定义的颜色值。颜色使用 RGB 值和 alpha 通道指定。您可以在接受十六进制颜色值的任何地方使用颜色资源。当 XML 中需要可绘制资源时,您也可以使用颜色资源(例如,android:drawable="@color/green")。

    该值始终以井号 (#) 字符开头,后跟以下某种格式的“透明度、红、绿、蓝”(Alpha-Red-Green-Blue) 信息:

    • #RGB
    • #ARGB
    • #RRGGBB
    • #AARRGGBB
      file location: res/values/colors.xml
      其实一开始写这篇文的初衷就是想要记录RGB、ARGB、RRGGBB以及AARRGGBB的具体定义以及差别的,因为平时都是直接调用,没有搞清楚这些差别。后面就干脆再扩展一下,于是就有了这篇文章。

    Color使用简单实例
    XML file saved at res/values/colors.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
       <color name="opaque_red">#f00</color>
       <color name="translucent_red">#80ff0000</color>
    </resources>
    

    java中引用

    Resources res = getResources();
    int color = res.getColor(R.color.opaque_red);
    

    xml中引用

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textColor="@color/translucent_red"
        android:text="Hello"/>
    

    这里定义了2种格式颜色,一种格式是 #f00 另一个是 #80ff0000
    那么这两种格式又分别对应哪种格式呢?
    首先,这些概念的基础是rgb。
    先来看颜色的定义。
    以下部分出自adobe官方文档。
    关于颜色
    https://helpx.adobe.com/cn/photoshop/using/color.html
    原色
    加色原色是指三种色光(红色、绿色和蓝色),当按照不同的组合将这三种色光添加在一起时,可以生成可见色谱中的所有颜色。添加等量的红色、蓝色和绿色光可以生成白色。完全缺少红色、蓝色和绿色光将导致生成黑色。计算机的显示器是使用加色原色来创建颜色的设备。

    image.png
    减色原色是指一些颜料,当按照不同的组合将这些颜料添加在一起时,可以创建一个色谱。与显示器不同,打印机使用减色原色(青色、洋红色、黄色和黑色颜料)并通过减色混合来生成颜色。使用“减色”这个术语是因为,这些原色都是纯色,将它们混合在一起后生成的颜色都是原色的不纯版本。例如,橙色是通过将洋红色和黄色进行减色混合创建的。
    image.png
    色轮

    如果您是第一次调整颜色分量,在处理色彩平衡时手头有一个标准色轮图表会很有帮助。可以使用色轮来预测一个颜色分量中的更改如何影响其它颜色,并了解这些更改如何在 RGB 和 CMYK 颜色模型之间转换。


    image.png

    例如,通过增加色轮中相反颜色的数量,可以减少图像中某一颜色的数量,反之亦然。在标准色轮上,处于相对位置的颜色被称作补色。同样,通过调整色轮中两个相邻的颜色,甚至将两个相邻的色彩调整为其相反的颜色,可以增加或减少一种颜色。

    在 CMYK 图像中,可以通过减少洋红色数量或增加其互补色的数量来减淡洋红色,洋红色的互补色为绿色(在色轮上位于洋红色的相对位置)。在 RGB 图像中,可以通过删除红色和蓝色或通过添加绿色来减少洋红。所有这些调整都会得到一个包含较少洋红的整体色彩平衡。

    再来看RGB
    RGB 颜色值是这样规定的:rgb(red, green, blue)。每个参数 (red、green 以及 blue) 定义颜色的强度,可以是介于 0 与 255 之间的整数,或者是百分比值(从 0% 到 100%)。举例说,rgb(0,0,255) 值显示为蓝色,这是因为 blue 参数被设置为最高值(255),而其他被设置为 0。
    可以使用简单尝试。
    rgb(0,0,0) 即 HEX 格式为 #00000时为黑色,rgb( 255, 255, 255 ) 即 HEX 格式为 #FFFFFF 时为白色。十进制的数据255转十六进制即为FF。

    0-255使用的是十进制的数值,而colors.xml中定义需要使用十六进制并且在数值前加上#。

    例如一个颜色RGB值为(230,75,75),A的值为255,这些数值是十进制的。
    230,75,75对应的十六进制数值分别为E6,4B,4B,255对应FF。
    下图为Android studio自带的取色器。随便定义一个颜色(例如#fff)后选择显示出的颜色即可打开。


    image.png

    那么在colors.xml中定义应如下所示。

        <color name="test">#FFE64B4B</color>
    

    color 的编码

    int color = (A & 0xff) << 24 | (R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff);

    现在就以上面的那个数值来计算一下color的值。
    A & 0xffFF & 0xff ,为 11111111,再左移24位。结果为11111111 00000000 00000000 00000000
    R & 0xffE6 & 0xff,为 1110 0110,再左移16位。结果为 1110 0110 00000000 00000000
    G & 0xff4B & 0xff ,为 100 1011,再左移8位,结果为100 1011 0000
    B & 0xff4B & 0xff,结果为 100 1011
    最后相加int color = 11111111 1110 0110 100 1011 100 1011

    其实int color = (A & 0xff) << 24 | (R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff);这个公式就是把ARGB的值按一定的顺序去存储。4个8位的数值,存储顺序为A-R-G-B。

    color 的编码,就是把自然界中的数值(十进制数值),转化成计算机可以识别的二进制数值的过程。

    根据数据的 位数 可以看到,这里的opaque_red所定义的颜色#f00 就是上面4种格式之一#RGB 格式。

       <color name="opaque_red">#f00</color>
    

    而translucent_red所定义的颜色#80ff0000 就是 #AARRGGBB 格式。

       <color name="translucent_red">#80ff0000</color>
    

    而根据这篇文章请问#f00是什么颜色?可以看出,两两相等的十六进制例如 #ff0000 可以简写为三位,即 #f00,因此 #RGB 从使用角度来看只是#RRGGBB的简写,在找颜色的时候需要输入的格式都是#RRGGBB格式。

    前面对rgb做了一些解释,现在的问题是 A
    首先,打开Photoshop,随便打开一张图片,并且把图层解锁,然后注意看 **不透明度 **这里,一个图片的 **不透明度 **默认是百分之100的。

    百分之100
    不透明度百分之100
    不透明度百分之50 不透明度百分之0

    3张不同 不透明度的图片对比如下。

    image.png

    可以看到,一个原始的不做透明度操作的图层,不透明度是100%,需要透明度的时候就把透明度往低调,直至0%,图层就完全不可见。

    ARGB中的A,实际上是指alpha通道,但是为什么用 Alpha代表透明度?
    关于通道,adobe有如下所示文档。
    关于通道
    其中关于Alpha 通道的部分有如下定义。

    • Alpha 通道 将选区存储为灰度图像。可以添加 Alpha 通道来创建和存储蒙版,这些蒙版用于处理或保护图像的某些部分(请参阅关于蒙版和 Alpha 通道)。

    然后我找到了这个答案。
    但是这里看不出与不透明度有什么关系,并且灰度跟不透明的概念是不一样的。
    为什么用 ‘Alpha’ 代表透明度?
    https://www.zhihu.com/question/21422818

    比如你有一张图片你想抠出图片中间的一部分 在PS里你会建立一个蒙板 然后在蒙板里把不需要的地方填充成黑色 需要的留成白色 这个时候实际上是是做了一次乘法 用黑色所代表的数值0去乘以你所填充的地方 那么这个地方就变透明了 反之白色所代表的数值1乘以你需要保留的地方 1乘以任何数都还是那个数本身 而0乘以任何数都是0 如果需要半透明的效果就用灰色去填充
    链接:https://www.zhihu.com/question/21422818/answer/18181801

    那么在android的世界里,ARGB又是如何使用的呢?
    不透明度的范围是0-255,在计算机中,我们就用16进制(00-FF)表示,全透明就是00,完全不透明就是FF,这里与前面adobe中是一致的,android中的00,表示图像不可见,对应adobe中的不透明度0%,android中的FF,图像完全可见,对应adobe中的不透明度100%。
    那么如何对应起来呢?这里需要的是计算百分比转十六进制的方法。

    计算方法:255 * 不透明度 -> 转换成16进制数

    eg:30%不透明度也就是255*30%=76.5,四舍五入77,然后利用计算器转为16进制为4D。

    public static void main(String[] args) {
            for (int i = 0; i <= 100; i++) {
                float temp = 255 * i * 1.0f / 100f;
                int alpha = Math.round(temp);
                String hexStr = Integer.toHexString(alpha);
                if (hexStr.length() < 2)
                    hexStr = "0" + hexStr;
                System.out.println(i + "%, " + hexStr.toUpperCase());
    
          }
    }
    
    不透明度 16进制表示
    0% 00
    1% 03
    2% 05
    3% 08
    4% 0A
    5% 0D
    6% 0F
    7% 12
    8% 14
    9% 17
    10% 1A
    11% 1C
    12% 1F
    13% 21
    14% 24
    15% 26
    16% 29
    17% 2B
    18% 2E
    19% 30
    20% 33
    21% 36
    22% 38
    23% 3B
    24% 3D
    25% 40
    26% 42
    27% 45
    28% 47
    29% 4A
    30% 4D
    31% 4F
    32% 52
    33% 54
    34% 57
    35% 59
    36% 5C
    37% 5E
    38% 61
    39% 63
    40% 66
    41% 69
    42% 6B
    43% 6E
    44% 70
    45% 73
    46% 75
    47% 78
    48% 7A
    49% 7D
    50% 80
    51% 82
    52% 85
    53% 87
    54% 8A
    55% 8C
    56% 8F
    57% 91
    58% 94
    59% 96
    60% 99
    61% 9C
    62% 9E
    63% A1
    64% A3
    65% A6
    66% A8
    67% AB
    68% AD
    69% B0
    70% B3
    71% B5
    72% B8
    73% BA
    74% BD
    75% BF
    76% C2
    77% C4
    78% C7
    79% C9
    80% CC
    81% CF
    82% D1
    83% D4
    84% D6
    85% D9
    86% DB
    87% DE
    88% E0
    89% E3
    90% E6
    91% E8
    92% EB
    93% ED
    94% F0
    95% F2
    96% F5
    97% F7
    98% FA
    99% FC
    100% FF

    参考链接:
    Android颜色透明度(不透明度)计算
    https://blog.csdn.net/wangliblog/article/details/73248122

    9.3 Dimension

    A dimension value defined in XML. A dimension is specified with a number followed by a unit of measure. For example: 10px, 2in, 5sp. The following units of measure are supported by Android:dp、sp、pt、px、mm,in。
    file location: res/values/filename.xml
    example:
    XML file saved at res/values/dimens.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <dimen name="textview_height">25dp</dimen>
        <dimen name="textview_width">150dp</dimen>
        <dimen name="ball_radius">30dp</dimen>
        <dimen name="font_size">16sp</dimen>
    </resources>
    

    java调用代码如下

    Resources res = getResources();
    float fontSize = res.getDimension(R.dimen.font_size);
    

    layout xml调用如下。

    <TextView
        android:layout_height="@dimen/textview_height"
        android:layout_width="@dimen/textview_width"
        android:textSize="@dimen/font_size"/>
    

    9.4 ID

    A unique resource ID defined in XML. Using the name you provide in the <item> element, the Android developer tools create a unique integer in your project's R.java class, which you can use as an identifier for an application resources (for example, a View in your UI layout) or a unique integer for use in your application code (for example, as an ID for a dialog or a result code).
    file location:res/values/filename.xml

    example:
    XML file saved at res/values/ids.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <item type="id" name="button_ok" />
        <item type="id" name="dialog_exit" />
    </resources>
    

    Then, this layout snippet uses the "button_ok" ID for a Button widget:

    <Button android:id="@id/button_ok"
        style="@style/button_style" />
    

    9.5 Integer

    An integer defined in XML.
    file location: res/values/filename.xml
    example:
    XML file saved at res/values/integers.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <integer name="max_speed">75</integer>
        <integer name="min_speed">5</integer>
    </resources>
    

    This application code retrieves an integer:

    Resources res = getResources();
    int maxSpeed = res.getInteger(R.integer.max_speed);
    

    9.6 Integer Array

    An array of integers defined in XML.
    file location: res/values/filename.xml

    example:
    XML file saved at res/values/integers.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <integer-array name="bits">
            <item>4</item>
            <item>8</item>
            <item>16</item>
            <item>32</item>
        </integer-array>
    </resources>
    

    This application code retrieves the integer array:

    Resources res = getResources();
    int[] bits = res.getIntArray(R.array.bits);
    

    9.7 Typed Array

    A TypedArray defined in XML. You can use this to create an array of other resources, such as drawables. Note that the array is not required to be homogeneous, so you can create an array of mixed resource types, but you must be aware of what and where the data types are in the array so that you can properly obtain each item with the TypedArray's get...() methods.

    file location: res/values/filename.xml
    example:
    XML file saved at res/values/arrays.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <array name="icons">
            <item>@drawable/home</item>
            <item>@drawable/settings</item>
            <item>@drawable/logout</item>
        </array>
        <array name="colors">
            <item>#FFFF0000</item>
            <item>#FF00FF00</item>
            <item>#FF0000FF</item>
        </array>
    </resources>
    

    This application code retrieves each array and then obtains the first entry in each array:

    Resources res = getResources();
    TypedArray icons = res.obtainTypedArray(R.array.icons);
    Drawable drawable = icons.getDrawable(0);
    
    TypedArray colors = res.obtainTypedArray(R.array.colors);
    int color = colors.getColor(0,0);
    

    最后的一点碎碎念:其实写到后面,前面我写的东西很多都忘记了,所以说,写文章其实既是一个整理思路的过程,又是一个方便日后复习的过程,在写的过程中可以加深对知识点的印象。

    参考链接:
    https://developer.android.com/guide/topics/resources/available-resources?hl=zh-CN
    https://developer.android.com/guide/topics/resources/providing-resources

    Resource 使用详解
    https://www.jianshu.com/p/44bc6109aa78

    Android属性动画和视图动画的区别
    https://blog.csdn.net/u010126792/article/details/70194464

    【Android】属性动画(基本用法)
    https://www.jianshu.com/p/d23f58f4368d

    Android动画-属性动画-ValueAnimator
    https://www.jianshu.com/p/2966227ea0b4

    Android中的属性动画
    http://linzhengblog.com/2016/12/07/Android%E4%B8%AD%E7%9A%84%E5%B1%9E%E6%80%A7%E5%8A%A8%E7%94%BB/

    Android 动画:手把手教你使用 补间动画 (视图动画)
    https://blog.csdn.net/carson_ho/article/details/72827747

    Android中属性动画和补间动画的区别
    https://blog.csdn.net/wzy_1988/article/details/50587248

    https://www.w3school.com.cn/cssref/css_colors.asp
    https://www.jianshu.com/p/cd7e73005ac4

    图解RGB565、RGB555、RGB16、RGB24、RGB32、ARGB32等格式的区别
    https://blog.csdn.net/byhook/article/details/84262330
    我的Android进阶之旅------>Android颜色值(RGB)所支持的四种常见形式
    https://blog.csdn.net/ouyang_peng/article/details/13618959
    我的Android进阶之旅------>Android颜色值(#AARRGGBB)透明度百分比和十六进制对应关系以及计算方法
    https://blog.csdn.net/ouyang_peng/article/details/51896521

    相关文章

      网友评论

        本文标题:android resource简单总结

        本文链接:https://www.haomeiwen.com/subject/hngrkctx.html