Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

标签(空格分隔): Android基础入门教程


本节引言:

本节我们继续来学习Android中的Drawable资源,上一节我们学习了:
ColorDrawableNinePatchDrawable
ShapeDrawableGradientDrawable!这四个Drawable~
而本节我们继续来学习接下来的五个Drawable,他们分别是:
BitmapDrawableInsertDrawableClipDrawable
RotateDrawableAnimationDrawable!
还是贴下13种Drawable的导图:

此处输入链接的描述

好的,开始本节内容~


1.BitmapDrawable

对Bitmap的一种封装,可以设置它包装的bitmap在BitmapDrawable区域中的绘制方式,有:
平铺填充,拉伸填或保持图片原始大小!以<bitmap>为根节点!
可选属性如下:

  • src:图片资源~
  • antialias:是否支持抗锯齿
  • filter:是否支持位图过滤,支持的话可以是图批判显示时比较光滑
  • dither:是否对位图进行抖动处理
  • gravity:若位图比容器小,可以设置位图在容器中的相对位置
  • tileMode:指定图片平铺填充容器的模式,设置这个的话,gravity属性会被忽略,有以下可选值:
    disabled(整个图案拉伸平铺),clamp(原图大小),
    repeat(平铺),mirror(镜像平铺)

对应的效果图:

①XML定义BitmapDrawable:

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

②实现相同效果的Java代码:

BitmapDrawable bitDrawable = new BitmapDrawable(bitmap);  
bitDrawable.setDither(true);  
bitDrawable.setTileModeXY(TileMode.MIRROR,TileMode.MIRROR);  

2.InsetDrawable

表示把一个Drawable嵌入到另外一个Drawable的内部,并且在内部留一些间距,
类似与Drawable的padding属性,但padding表示的是Drawable的内容与Drawable本身的边距!
InsetDrawable表示的是两个Drawable与容器之间的边距,当控件需要的**背景比实际的边框
小的时候**,比较适合使用InsetDrawable,比如使用这个可以解决我们自定义Dialog与屏幕之间
的一个间距问题,相信做过的朋友都知道,即使我们设置了layout_margin的话也是没用的,这个
时候就可以用到这个InsetDrawable了!只需为InsetDrawable设置一个insetXxx设置不同
方向的边距,然后为设置为Dialog的背景即可!

相关属性如下:

  • 1.drawable:引用的Drawable,如果为空,必须有一个Drawable类型的子节点!
  • 2.visible:设置Drawable是否额空间
  • 3.insetLeft,insetRight,insetTop,insetBottm:设置左右上下的边距

①XML中使用:

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

在Java代码中使用

InsetDrawable insetDrawable = new InsetDrawable(getResources()  
        .getDrawable(R.drawable.test1), 10, 10, 10, 10);  

使用效果图


3.ClipDrawable

Clip可以译为剪的意思,我们可以把ClipDrawable理解为从位图上剪下一个部分;
Android中的进度条就是使用ClipDrawable来实现的,他根据设置level的值来决定剪切
区域的大小,根节点是<clip>

相关属性如下

  • clipOrietntion:设置剪切的方向,可以设置水平和竖直2个方向
  • gravity:从那个位置开始裁剪
  • drawable:引用的drawable资源,为空的话需要有一个Drawable类型的子节点
    ps:这个Drawable类型的子节点:就是在
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:clipOrientation="horizontal"
    android:drawable="@mipmap/ic_bg_meizi"
    android:gravity="left" /> 

②在activity_main主布局文件中设置一个ImageView,将src设置为clipDrawable!
记住是src哦,如果你写成了blackground的话可是会报空指针的哦!!!!

<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">

    <ImageView
        android:id="@+id/img_show"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/clip_bg" />

</LinearLayout>  

③MainActivity.java通过setLevel设置截取区域大小:

public class MainActivity extends AppCompatActivity {

    private ImageView img_show;
    private ClipDrawable cd;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0x123) {
                cd.setLevel(cd.getLevel() + 500);
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img_show = (ImageView) findViewById(R.id.img_show);
        // 核心实现代码
        cd = (ClipDrawable) img_show.getDrawable();
        final Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                handler.sendEmptyMessage(0x123);
                if (cd.getLevel() >= 10000) {
                    timer.cancel();
                }
            }
        }, 0, 300);
    }
}

好的,有点意思,妹子图别问我拿,百度上一堆哈~


4.RotateDrawable

用来对Drawable进行旋转,也是通过setLevel来控制旋转的,最大值也是:10000

相关属性如下

  • fromDegrees:起始的角度,,对应最低的level值,默认为0
  • toDegrees:结束角度,对应最高的level值,默认360
  • pivotX:设置参照点的x坐标,取值为0~1,默认是50%,即0.5
  • pivotY:设置参照点的Y坐标,取值为0~1,默认是50%,即0.5
    ps:如果出现旋转图片显示不完全的话可以修改上述两个值解决!
  • drawable:设置位图资源
  • visible:设置drawable是否可见!

角度图如下

使用示例

运行效果图

代码实现

在第三点的clipDrawable上做一点点修改即可!

①定义一个rotateDrawable资源文件:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@mipmap/ic_launcher"
    android:fromDegrees="-180"
    android:pivotX="50%"
    android:pivotY="50%" />  

②activity_main.xml中修改下src指向上述drawable即可,MainActivity只需要把ClipDrawable
改成rotateDrawable即可!

public class MainActivity extends AppCompatActivity {

    private ImageView img_show;
    private RotateDrawable cd;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0x123) {
                if (cd.getLevel() >= 10000)
                    Toast.makeText(MainActivity.this, "转完了~",
                            Toast.LENGTH_LONG).show();
                cd.setLevel(cd.getLevel() + 400);
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img_show = (ImageView) findViewById(R.id.img_show);
        // 核心实现代码
        cd = (RotateDrawable) img_show.getDrawable();
        final Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                handler.sendEmptyMessage(0x123);
                if (cd.getLevel() >= 10000) {
                    timer.cancel();
                }
            }
        }, 0, 100);
    }
}

5.AnimationDrawable

本节最后一个Drawable,AnimationDrawable是用来实现Android中帧动画的,就是把一系列的
Drawable,按照一定得顺序一帧帧地播放;Android中动画比较丰富,有传统补间动画,平移,
缩放等等效果,但是这里我们仅仅介绍这个AnimationDrawable实现帧动画,关于alpha,scale,
translate,rotate等,后续在动画章节再进行详细的介绍~
我们这里使用<animation-list>作为根节点

相关属性方法:

oneshot:设置是否循环播放,false为循环播放!!!
duration:帧间隔时间,通常我们会设置为300毫秒
我们获得AniamtionDrawable实例后,需要调用它的start()方法播放动画,另外要注意
在OnCreate()方法中调用的话,是没有任何效果的,因为View还没完成初始化,我们可以
用简单的handler来延迟播放动画!当然还有其他的方法,可见下述链接:
Android AnimationDrawable运行的几种方式
使用AnimationDrawable来实现帧动画真的是非常方便的~

使用示例

运行效果图

代码实现

先定义一个AnimationDrawable的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="@mipmap/ic_pull_to_refresh_loading01"
        android:duration="100" />

    <item
        android:drawable="@mipmap/ic_pull_to_refresh_loading02"
        android:duration="100" />
    <item
        android:drawable="@mipmap/ic_pull_to_refresh_loading03"
        android:duration="100" />
    <item
        android:drawable="@mipmap/ic_pull_to_refresh_loading04"
        android:duration="100" />
    <item
        android:drawable="@mipmap/ic_pull_to_refresh_loading05"
        android:duration="100" />
    <item
        android:drawable="@mipmap/ic_pull_to_refresh_loading06"
        android:duration="100" />

</animation-list>  

②activity_main.xml设置下src,然后MainActivity中:

public class MainActivity extends AppCompatActivity {

    private ImageView img_show;
    private AnimationDrawable ad;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img_show = (ImageView) findViewById(R.id.img_show);
        // 核心实现代码
        ad = (AnimationDrawable) img_show.getDrawable();
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                ad.start();
            }
        }, 300);
    }
}

嘿嘿,超简单有木有,以后在一些需要用到帧动画的地方,直接上AnimationDrawable
当然,只适合于不需要进行控制的帧动画,比如上面这个就是超表下拉刷新时候的进度条素材
做成的一个简单帧动画!根据自己的需求自行拓展~


本节小结:


本节又介绍了另外的五个Drawable,很有趣是吧,还不快快将他们应用到你的实际开发当中~
嘻嘻,就说这么多,谢谢!另外刚刚有读者私信我说以前的文章别删行不行,嗯,这里说下
只删除一些重复的,比如和这个雷同的那几节~当然我也会备份!删除的文章都会备份的~
所以放心!

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
内容简介   《Android基础教程(第3版·修订版)》是一部关于Android开发的基础教程,采用Pragmatic系列图书一贯由浅入深、循序渐进的方式讲解了Android程序设计的核心概念和技术。书不仅结合数独游戏开发案例形象生动地讲解了Android生命周期、用户界面、2D图形、多媒体,以及本地数据存储等基础知识,而且通过“Hello, Android”项目深入探讨了外部通信、基于位置的服务、内置SQLite数据库、3D图形、多点触控、小部件、兼容性测试,以及如何向AndroidMarket发布应用程序等内容。前13章章尾均有“快速阅读指南”,你无需按照顺序阅读该章,即可迅速找到所需信息,并高效地完成工作。   《Android基础教程(第3版·修订版)》适合所有移动开发人员学习参考。 目录 第一部分 Android简介 第1章 快速入门 1.1 安装工具 1.1.1 Java 5.0+ 1.1.2 Eclipse 3 1.1.3 AndroidSDK启动程序软件包 1.1.4 AndroidSDK组件 1.1.5 Eclipse插件 1.2 创建第一个程序 1.3 在模拟器上运行程序 1.3.1 创建一个AVD 1.3.2 再试一次 1.4 在手机上运行程序 1.5 快速阅读指南 第2章 基本概念 2.1 Android的系统架构 2.1.1 Linux内核 2.1.2 本机库 2.1.3 Android运行时 2.1.4 应用程序框架 2.1.5 应用程序和小部件 2.2 它还活着 2.2.1 进程不等于应用程序 2.2.2 应用程序生命周期 2.3 构建块 2.3.1 活动 2.3.2 意图 2.3.3 服务 2.3.4 内容提供者 2.4 使用资源 2.5 安全性 2.6 快速阅读指南 第二部分 Android基础知识 第3章 设计用户界面 3.1 数独游戏简介 3.2 声明性设计 3.3 创建启动界面 3.4 使用替代资源 3.5 实现About对话框 3.6 应用主题 3.7 添加菜单 3.8 添加设置 3.9 开始新游戏 3.1 调试程序 3.10.1 利用日志消息调试程序 3.10.2 利用调试器调试程序 3.11 退出游戏 3.12 快速阅读指南 第4章 绘制2D图形 4.1 Android图形基础 4.1.1 Color类 4.1.2 Paint类 4.1.3 Canvas类 4.1.4 Path类 4.1.5 Drawable类 4.2 在数独程序添加图形 4.2.1 开始游戏 4.2.2 定义Game类 4.2.3 定义PuzzleView类 4.2.4 绘制游戏盘面 4.2.5 绘制数字 4.3 处理输入 4.3.1 定义和更新选定区域 4.3.2 输入数字 4.3.3 增加提示 4.3.4 抖动屏幕 4.4 其他问题 4.4.1 创建软键盘 4.4.2 实现游戏逻辑 4.4.3 其他功能 4.5 更多改进 4.6 快速阅读指南 第5章 多媒体 5.1 播放音频 5.2 播放视频 5.3 为数独游戏配上音乐 5.4 快速阅读指南 第6章 存储本地数据 6.1 为数独游戏添加选项 6.2 继续玩前一个游戏 6.3 记住当前位置 6.4 访问内部文件系统 6.5 访问SD卡 6.6 快速阅读指南 第三部分 高级主题 第7章 互联的世界 7.1 通过意图实现浏览 7.2 利用视图打开网页 7.3 JavaScript与Java通信 7.4 使用Web服务 7.5 快速阅读指南 第8章 定位与环境感知 8.1 位置,位置,位置 8.1.1 我在哪里 8.1.2 更新位置 8.1.3 模拟说明 8.2 充分利用传感器 8.2.1 了解传感器 8.2.2 解析传感器的读数 8.2.3 模拟说明 8.3 地图功能 8.3.1 嵌入MapView 8.3.2 准备就绪 8.3.3 模拟说明 8.4 快速阅读指南 第9章 SQL实战 9.1 SQLite简介 9.2 SQL基础 9.2.1 DDL语句 9.2.2 修改语句 9.2.3 查询语句 9.3 你好,数据库 9.3.1 使用SQLiteOpenHelper 9.3.2 定义主程序 9.3.3 添加一行 9.3.4 运行一个查询 9.3.5 显示查询结果 9.4 数据绑定 9.5 使用ContentProvider 9.5.1 更改主程序 9.5.2 添加一行 9.5.3 运行一个查询 9.6 实现ContentProvider 9.7 快速阅读指南 第10 章 利用OpenGL实现3D图形 10.1 理解3D图形 10.2 OpenGL简介 10.3 构建一个OpenGL程序 10.4 渲染场景 10.5 构建一个模型 10.6 光线、相机 10.7 动作 10.8 应用纹理 10.9 透明效果 10.1 测量平滑度 10.11 快速阅读指南 第四部分 下一代产品 第11章 多点触控 11.1 多点触控概述 11.2 创建触控示例 11.3 了解触控事件 11.4 设置图像变换 11.5 实现拖动动作 11.6 实现捏压缩放动作 11.6.1 两个点之间的距离 11.6.2 两个点的点 11.7 快速阅读指南 第12章 主界面 12.1 Hello,Widget 12.1.1 创建第一个小部件程序 12.1.2 调用所有小部件 12.1.3 拉伸以适合屏幕尺寸 12.1.4 使用和扩展 12.1.5 运行小部件 12.1.6 最新进展 12.1.7 快乐之旅 12.2 动态壁纸 12.2.1 创建壁纸项目 12.2.2 服务简介 12.2.3 创建一个绘图引擎 12.2.4 重用OpenGL代码 12.2.5 创建和销毁引擎 12.2.6 管理Surface 12.2.7 可视化壁纸 12.2.8 响应用户的输入 12.3 快速阅读指南 第13章 一次编,到处测试 13.1 启动模拟器 13.2 创建适用于多个版本的程序 13.3 AndroidAPI的发展 13.4 大量错误 13.5 各屏幕尺寸 13.6 在SD卡上安装程序 13.7 快速阅读指南 第14章 发布到AndroidMarket 14.1 准备工作 14.2 签名 14.3 发布 14.4 更新 14.5 结语 第五部分 附录 附录A Java与Android:语言及其API 附录B 参考书目

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值