一个可以根据自己的level等级, 将指定的Drawable缩放到一定比例

资源放置位置:
  Eclipse/AS: res/drawable/filename.xml

引用用法:
  In Java: R.drawable.filename
  In XML: @drawable/filename

语法:

<?xml version="1.0" encoding="utf-8"?>
<scalexmlns:android="http://schemas.android.com/apk/res/android"android:drawable="@drawable/drawable_resource"android:scaleGravity=["top" | "bottom" | "left" | "right" | "center_vertical" |"fill_vertical" | "center_horizontal" | "fill_horizontal" |"center" | "fill" | "clip_vertical" | "clip_horizontal"]android:scaleHeight="percentage"android:scaleWidth="percentage" />
  • 首个标签必须是scale;
  • android:drawable: Drawable资源引用;
  • android:scaleGravity: 缩放的方向, 比如: top, 缩放的时候就会向顶部靠拢,bottom, 缩放时会想底部靠拢;
  • android:scaleHeight: 表示Drawable能够在高度上缩放的百分比, 比如: 50%,
    android:scaleWidth: 表示Drawable能够在宽度上缩放的百分比, 同上;

Scale Drawable不能单独的使用, 他需要配合Level等级使用, level的取值是0~10000, (0为不可见)

例子:

布局XML代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextView
        android:id="@+id/tv"android:layout_width="match_parent"android:layout_height="100dip"android:background="@drawable/scale_drawable_left"android:gravity="center"android:text="宽高可缩放百分比为100%"/><View
        android:layout_width="match_parent"android:layout_height="1dip"android:background="@android:color/black"/><TextView
        android:id="@+id/tv1"android:layout_width="match_parent"android:layout_height="100dip"android:background="@drawable/scale_drawable_left_half"android:gravity="center"android:text="宽高可缩放百分比为50%"/><Button
        android:id="@+id/btn1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="set Level 0"android:textAllCaps="false"/><Button
        android:id="@+id/btn2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="set Level 500"android:textAllCaps="false"/><Button
        android:id="@+id/btn3"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="set Level 5000"android:textAllCaps="false"/>
</LinearLayout>

scale_drawable_left.xml代码

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

scale_drawable_left_half.xml代码

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

逻辑Java代码

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.test_scale1);final TextView textView = (TextView) findViewById(R.id.tv);final TextView textView1 = (TextView) findViewById(R.id.tv1);textView.getBackground().setLevel(10000);textView1.getBackground().setLevel(10000);findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {textView.getBackground().setLevel(0);textView1.getBackground().setLevel(0);}});findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {textView.getBackground().setLevel(500);textView1.getBackground().setLevel(500);}});findViewById(R.id.btn3).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {textView.getBackground().setLevel(5000);textView1.getBackground().setLevel(5000);}});
}

代码解读:
先来理清下View的宽高, Drawable的宽高, 可缩放的百分比, Level等级三者间的关系: 一个个来说:

  • View的宽高: 在整个过程中是不会发生变化;
  • 可缩放的百分比: 先搞清楚这个百分比, 它是控件能够缩小的最小尺寸, 比如:10%, 表示Drawable最小能缩小到控件的10%宽或者高, 这时候还需要加上一个level等级
  • Level等级:取值是0~10000; 上面Drawable能放大或缩小的区间是10%~100%, 这个区间就是用0~10000是描述.
    它们和缩放后的宽高存在一个等式:

缩放后的宽高 = Drawable显示的宽高(大多时候是View的宽高) * 可缩放的百分比 * (设置的Level/10000);

使用前需要初始化, 给一个初始值, 不然Drawable不可见

textView.getBackground().setLevel(10000);

设置的时候

textView.getBackground().setLevel(5000);

当然Drawable还可以当做ImageView的源文件src属性去使用, 代码如下:

mImageView.getDrawable().setLevel(10000);

  • 下面是不同android:scaleGravity/缩放方向的区别: 写成了一个动画效果,

这里用的是shape图片
 

这里用的是png图片。

Drawable都是同一个: 仅仅改变了android:scaleGravity的参数

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

代码也很简单, 点击事件就执行了这个Runnaable:

    boolean flag;private Runnable startScaleThread = new Runnable() {@Overridepublic void run() {int level = tv1.getBackground().getLevel();//缩小动画if (flag) {level += 100;if (level >= 10000) {flag = false;//Toast.makeText(MainActivity.this, "缩小", Toast.LENGTH_SHORT).show();}//放大动画} else {level -= 100;if (level <= 100) {flag = true;//Toast.makeText(MainActivity.this, "放大", Toast.LENGTH_SHORT).show();}}tv1.getBackground().setLevel(level);tv2.getBackground().setLevel(level);tv3.getBackground().setLevel(level);tv4.getBackground().setLevel(level);tv5.getBackground().setLevel(level);tv6.getBackground().setLevel(level);tv1.postDelayed(startScaleThread, 10);}};

Android Drawable - Scale Drawable使用详解(附图)相关推荐

  1. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高...

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

  2. android控件使用大全,Android常见控件使用详解

    本文实例为大家分享了六种Android常见控件的使用方法,供大家参考,具体内容如下 1.TextView 主要用于界面上显示一段文本信息 2.Button 用于和用户交互的一个按钮控件 //为Butt ...

  3. Android特效 五种Toast详解

    Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的时间有限,过一定的时间就会自动消失.而且Toast主要用于向用户显示提示消 ...

  4. android 刷新标题栏,Android 自定义标题栏的实例详解

    Android 自定义标题栏的实例详解 开发 Android APP 经常会用到自定义标题栏,而有多级页面的情况下还需要给自定义标题栏传递数据. 本文要点: 自定义标题填充不完整 自定义标题栏返回按钮 ...

  5. Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!...

    Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...

  6. 基于百度地图实现Android定位功能实现(详解+教程)

    基于百度地图实现Android定位功能实现(详解+教程) 1.初始化 (一)获取到SHA1 (1)找到View中的Tool Windows并打开Terminal (2)找到你的jdk的bin目录,小编 ...

  7. Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!

    Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...

  8. Android项目刮刮奖详解(二)

    Android项目刮刮奖详解(一) 前言 上期我们简单地实现了一个画板的功能,用户可以在上面乱写乱画,其实,刮刮奖也是如此,用户刮奖的时候也是乱写乱画的. 刮刮奖原理 一共有两层画布,底层画布存放中奖 ...

  9. 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——2.3节简析Android安装文件...

    本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第2章,第2.3节简析Android安装文件,作者 王石磊 , 吴峥,更多章节内容可以访问 ...

  10. Android软件开发之TextView详解(六)

    Android软件开发之TextView详解 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/ ...

最新文章

  1. html5游戏生态,白鹭引擎发起共建HTML5游戏生态访谈!
  2. Android 解决RecyclerView删除Item导致位置错乱的问题
  3. 大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?
  4. 搭建Harbor企业级docker仓库
  5. java 向量空间模型_VSM向量空间模型对文本的分类以及简单实现
  6. python调研报告总结体会_调研报告心得(多篇)
  7. python列表生成多个号码_python按需生成固定数量电话号码并保存为excel(不重复)...
  8. Spring事务的传播行为和隔离级别
  9. win7系统登录其他服务器端口,win7系统添加打印服务器端口的操作方法
  10. TLB的作用及工作原理,如何查看TLB miss?
  11. EJB的beans们
  12. Python之Mac上搭建集成开发环境
  13. java读取配置文件中文乱码
  14. 【MySQL】MySQL中的死锁
  15. 鸿蒙二部曲关系,用鸿蒙OS在蜂鸣器上放一曲《两只老虎》
  16. <第六、七周>新店日记,shopee怎么怎么开广告?怎么定价比较合理?
  17. 关关于android 微信sdk 分享 图片 到 朋友圈 的问题
  18. css学习--css基础
  19. 用Django加PIL做一个证件照模板生成器网页
  20. MySQL安装 ,版本mysql-5.7.19-winx64

热门文章

  1. EASYEXCEL 根据模板导出
  2. linux配置dns测试外网
  3. 一、 云计算基础1-数据中心发展阶段
  4. js设计模式之抽象工厂模式
  5. 为什么维也纳智慧城市全球排名第一?
  6. 常用的javaScript正则表达式
  7. iperf3 网络带宽测试工具
  8. python getattr setattr_python hasattr/getattr/setattr介绍
  9. scoped 属性的小知识
  10. Linux命令大全(一)