当前位置: 首页 > news >正文

Android中的Drawable(三)

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

目录

1、TransitionDrawable

2、InsetDrawable

3、ScaleDrawable

1、TransitionDrawable

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

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

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/img_3"/>
    <item android:drawable="@drawable/img_4"/>
</transition>

现在 img_3 的图片如下所示;

outside_default.png

img_4 的图片如下所示;

outside_default.png

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout


    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   >
    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/my_transition"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/iv"
        android:onClick="onClick"
        android:text="按钮"/>
</RelativeLayout>

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

public class TransitionActivity extends AppCompatActivity {
    ImageView mIv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transition);
        mIv = findViewById(R.id.iv);
    }


    public void onClick(View v) {
        TransitionDrawable transitionDrawable = (TransitionDrawable) mIv.getDrawable();
        transitionDrawable.startTransition(3000);
    }
}

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 文件;

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

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.a86188.myapplication.InsetDrawableActivity">
    <ImageView
        android:layout_width="match_parent"
        android:src="@drawable/my_inset_drawable"
        android:background="#FF0000"
        android:layout_height="200px" />
</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 文件;

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/img_3"
    android:scaleGravity="center"
    android:scaleHeight="75%"
    android:scaleWidth="75%">
</scale>

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:background="@drawable/scale_drawable"
       />
</RelativeLayout>

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

public class ScaleDrawableActivity extends AppCompatActivity {
    ImageView iv;
    private ScaleDrawable scaleDrawable;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scale_drawable);
        iv = (ImageView)findViewById(R.id.iv);
        scaleDrawable = (ScaleDrawable)iv.getBackground();
        scaleDrawable.setLevel(1);
    }
}

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%。

相关文章:

  • Java面向对象(二)
  • 【spring】bean的生命周期
  • R语言ggplot2可视化:使用ggpubr包的ggline函数可视化分组折线图(点线图、line plot)、palette参数自定义不同分组折线图的颜色
  • Dubbo之注册与发现
  • R语言使用df函数生成F分布密度函数数据、使用plot函数可视化F分布密度函数数据(F Distribution)
  • Java--正则表达式
  • java计算机毕业设计家政服务管理源码+数据库+系统+lw文档+mybatis+运行部署
  • Java常量池理解
  • Dubbo入门介绍及学习笔记总结
  • 【SpringMVC】重定向和转向详解
  • ocr的场景应用--发票识别
  • Dubbo入门(四)Provider和Consumer的注解实现
  • dubbo分布式日志调用链追踪
  • 软件测试周刊(第87期):天下就没有偶然,那不过是化了妆的、戴了面具的必然。
  • 灵性图书馆:好书推荐-《把好运吸过来》
  • [译] React v16.8: 含有Hooks的版本
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • ES6--对象的扩展
  • ES6核心特性
  • ESLint简单操作
  • Hibernate【inverse和cascade属性】知识要点
  • iOS | NSProxy
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Python3爬取英雄联盟英雄皮肤大图
  • 测试开发系类之接口自动化测试
  • 每天10道Java面试题,跟我走,offer有!
  • 爬虫模拟登陆 SegmentFault
  • 如何学习JavaEE,项目又该如何做?
  • 通信类
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • Semaphore
  • !$boo在php中什么意思,php前戏
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (4)Elastix图像配准:3D图像
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (WSI分类)WSI分类文献小综述 2024
  • (笔试题)分解质因式
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (汇总)os模块以及shutil模块对文件的操作
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .equals()到底是什么意思?
  • .Net 8.0 新的变化
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net 托管代码与非托管代码
  • .NET 中的轻量级线程安全
  • .net通用权限框架B/S (三)--MODEL层(2)
  • /etc/sudoer文件配置简析
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48