• Android中的Drawable(三)


    文章收藏的好句子:一个人也许无法改变外界,但可以改变自己。

    目录

    1、TransitionDrawable

    2、InsetDrawable

    3、ScaleDrawable

    1、TransitionDrawable

    我们基于Android中的Drawable(二)这篇文章再继续分析其他常用的 Drawable;TransitionDrawable 在 xml 文件中对应的标签是 transition,它实现的是2个 Drawable 之间的淡入淡出效果,为了更好的理解它,我们也先写一个 demo;

    (1)在 drawable 文件夹下新建一个 my_transition.xml 文件;

    1. "1.0" encoding="utf-8"?>
    2. <transition xmlns:android="http://schemas.android.com/apk/res/android" >
    3. <item android:drawable="@drawable/img_3"/>
    4. <item android:drawable="@drawable/img_4"/>
    5. transition>

    现在 img_3 的图片如下所示;

    outside_default.png

    img_4 的图片如下所示;

    outside_default.png

    (2)Activity 的布局文件 activity_transition.xml 如下所示;

    1. "1.0" encoding="utf-8"?>
    2. <RelativeLayout
    3. xmlns:android="http://schemas.android.com/apk/res/android"
    4. xmlns:app="http://schemas.android.com/apk/res-auto"
    5. xmlns:tools="http://schemas.android.com/tools"
    6. android:layout_width="match_parent"
    7. android:layout_height="match_parent"
    8. >
    9. <ImageView
    10. android:id="@+id/iv"
    11. android:layout_width="wrap_content"
    12. android:layout_height="wrap_content"
    13. android:src="@drawable/my_transition"/>
    14. <Button
    15. android:layout_width="match_parent"
    16. android:layout_height="wrap_content"
    17. android:layout_below="@id/iv"
    18. android:onClick="onClick"
    19. android:text="按钮"/>
    20. RelativeLayout>

    名称为 TransitionActivity 的 Activity 的处理逻辑如下所示;

    1. public class TransitionActivity extends AppCompatActivity {
    2. ImageView mIv;
    3. @Override
    4. protected void onCreate(Bundle savedInstanceState) {
    5. super.onCreate(savedInstanceState);
    6. setContentView(R.layout.activity_transition);
    7. mIv = findViewById(R.id.iv);
    8. }
    9. public void onClick(View v) {
    10. TransitionDrawable transitionDrawable = (TransitionDrawable) mIv.getDrawable();
    11. transitionDrawable.startTransition(3000);
    12. }
    13. }

    app 一开始运行的效果图如下所示;

    d697143b77872326a32e8776388fc6ca.jpeg

    当我们点击 “按钮” 后,3s 后就变成了如下的效果图;

    b1c69c7bc1ea6a5c2a973ea407635ee1.jpeg

    在 my_transition.xml 文件中,transition 标签下的 item 标签其实就是一种 Drawable;一般我们用 TransitionDrawable 作为 ImageView 的前景图,或者用作 View 的背景图,我们可通过 TransitionDrawable 的 startTransition 和 reverseTransition 方法来实现淡入淡出的效果以及它的逆过程。

    2、InsetDrawable

    InsetDrawable 在 xml 布局文件中对应的标签是 inset;如果要实现一个 View 的背景比 View 本身还要小,可以使用 InsetDrawable 来实现,类似与 Drawable 的 padding 属性;InsetDrawable 还可以实现将其他 Drawable 内嵌到自己当中,并可以在四周留出一定的间距;好,为了更好的理解,我们也写一个 demo ;

    (1)在 drawable 文件夹下新建一个 my_inset_drawable.xml 文件;

    1. "1.0" encoding="utf-8"?>
    2. <inset xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:insetBottom="30dp"
    4. android:drawable="@drawable/img_4"
    5. android:insetTop="30dp"
    6. android:insetLeft="30dp"
    7. android:insetRight="30dp"
    8. >
    9. inset>

    (2)Activity 的 activity_inset_drawable.xml 文件如下所示;

    1. "1.0" encoding="utf-8"?>
    2. <RelativeLayout
    3. xmlns:android="http://schemas.android.com/apk/res/android"
    4. xmlns:app="http://schemas.android.com/apk/res-auto"
    5. xmlns:tools="http://schemas.android.com/tools"
    6. android:layout_width="match_parent"
    7. android:layout_height="match_parent"
    8. tools:context="com.example.a86188.myapplication.InsetDrawableActivity">
    9. <ImageView
    10. android:layout_width="match_parent"
    11. android:src="@drawable/my_inset_drawable"
    12. android:background="#FF0000"
    13. android:layout_height="200px" />
    14. RelativeLayout>

    app 的运行结果如下所示;

    0ae325cfa888936c24b9d8144e925de4.png

    首先看一下,我们的 ImageView 的区域是红色背景的这一块对不对?ImageView 的前景就是我们看到的图片对不对?很明显,图片距离 ImageView 顶部 30 dp,图片距离 ImageView 底部 30 dp;好,我们对开发中常见的 inset 标签的属性进行说明一下;

    android:insetBottom  :  View 的背景或者前景在 View 实际区域的底部内边距

    android:insetTop  :  View 的背景或者前景在 View 实际区域的顶部内边距。

    android:insetRight  :  View 的背景或者前景在 View 实际区域的右边内边距。

    android:insetLeft  :  View 的背景或者前景在 View 实际区域的左边内边距。

    3、ScaleDrawable 

    ScaleDrawable 在 xml 文件中对应于 scale 标签,它可以根据自己的等级将指定的 Drawable 缩放到一定比例,为了更好的理解,我们也先写一个 demo 出来;

    (1)在 drawable 文件夹下新建一个 scale_drawable.xml 文件;

    1. "1.0" encoding="utf-8"?>
    2. <scale xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:drawable="@drawable/img_3"
    4. android:scaleGravity="center"
    5. android:scaleHeight="75%"
    6. android:scaleWidth="75%">
    7. scale>

    (2)Activity 的布局文件 activity_scale_drawable.xml 如下所示;

    1. "1.0" encoding="utf-8"?>
    2. <RelativeLayout
    3. xmlns:android="http://schemas.android.com/apk/res/android"
    4. xmlns:app="http://schemas.android.com/apk/res-auto"
    5. xmlns:tools="http://schemas.android.com/tools"
    6. android:layout_width="match_parent"
    7. android:layout_height="match_parent"
    8. >
    9. <ImageView
    10. android:id="@+id/iv"
    11. android:layout_width="wrap_content"
    12. android:layout_height="wrap_content"
    13. android:layout_centerHorizontal="true"
    14. android:background="@drawable/scale_drawable"
    15. />
    16. RelativeLayout>

    (3)Activity 的子类 ScaleDrawableActivity 对 ScaleDrawable 进行处理;

    1. public class ScaleDrawableActivity extends AppCompatActivity {
    2. ImageView iv;
    3. private ScaleDrawable scaleDrawable;
    4. @Override
    5. protected void onCreate(Bundle savedInstanceState) {
    6. super.onCreate(savedInstanceState);
    7. setContentView(R.layout.activity_scale_drawable);
    8. iv = (ImageView)findViewById(R.id.iv);
    9. scaleDrawable = (ScaleDrawable)iv.getBackground();
    10. scaleDrawable.setLevel(1);
    11. }
    12. }

    app运行的结果如下所示;

    f3b471027e3af3bc9b93d974c178c0bb.jpeg

    好,我们现在将 ScaleDrawableActivity 中的 scaleDrawable.setLevel(1) 这行代码改为 scaleDrawable.setLevel(1000),然后再运行一下app,效果图如下所示;

    c07155c4a321488ce9a90f0b2e8d0411.jpeg

    看到没有,图片明显变大了,看 ScaleDrawable 中的 setLevel 方法中的参数,参数的取值范围是1-10000,在取值范围内,参数越大,内部的 Drawable 就看起来越大;ScaleDrawable 的默认等级为 0,那么 ScaleDrawable 将无法显示出来。我们可以将 Drawable 的等级设置为大于10000 的值,比如10050,虽然也能正常工作,但是不推荐这么做,有可能会出现其他的问题。

    刚刚说了,如果 ScaleDrawable 的为0,那么 ScaleDrawable 就无法显示出来,这是不是真的呢?我们看一下 ScaleDrawable 的 draw(Canvas canvas)方法;

    4b0ccb272bab1ca3d989f6eb7c24aca1.png

    看到了没,当等级不为0的时候才调用 Drawable 的 draw 方法;好,我们再看看 scale 标签的属性;

    android:scaleGravity:  等同于 shape 的 android:gravity 属性。

    android:scaleHeight  :表示 Drawable 的高的缩放比例,值越大,内部 Drawable 的高度显示得越小,  例如 android:scaleHeight=70%”,那么显示时 Drawable 的高度只有原来的30%。

    android:scaleWidth  :  表示 Drawable 的宽的缩放比例,值越大,内部 Drawable 的宽显示得越小,例如 android:scaleWidth=70%”,那么显示时 Drawable 的宽度只有原来的30%。

  • 相关阅读:
    【优化调度】基于粒子群实现并网模型下微电网的经济调度优化附matlab代码
    【JavaScript 20】String对象 构造函数 工具方法 静态方法 实例属性 实例方法
    JAVA【JDBC】
    mysql-隔离级别
    node.js毕业设计源码宠物医生预约系统
    取证基础——MongoDB数据库基础
    JavaScript与数据库MongoDB的联动:打造高效的数据驱动应用
    IOS课程笔记[1-3] 第一个IOS应用
    【Flink 实战系列】Flink 消费多个 Topic 数据利用侧流输出完成分流功能
    【C# 学习笔记 ①】C# 程序结构和基本语法(VSCode工具配置、数据类型、修饰符、构造函数)
  • 原文地址:https://blog.csdn.net/qq_37837621/article/details/126654118