裁剪图形ClipDrawable

ClipDrawable可设置图形的裁剪幅度,它的构造函数除了指定来源图形之外,还可以指定图形的裁剪方式(从开始裁剪还是从中间裁剪还是从末尾裁剪),以及裁剪方向(水平裁剪还是垂直裁剪)。至于裁剪幅度的数值,则是通过Drawable类的公共方法setLevel来指定,setLevel方法指定一个比例,取值范围是0到10000。对于裁剪图形来说,setLevel方法用来设置裁剪后的图形比率,为0表示该图形完全不显示,为5000表示显示一半图形,为10000表示显示全部图形。

下面是裁剪图形的效果截图:
 

下面是裁剪图形的xml定义文件例子:

<clip xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/banner_1"android:clipOrientation="horizontal"android:gravity="center">
</clip>

下面是裁剪图形的使用代码例子:

 private String[] clipDescArray = {"水平百分十", "水平百分三十", "水平百分五十", "水平百分七十", "水平百分百", "垂直百分十", "垂直百分三十", "垂直百分五十", "垂直百分七十", "垂直百分百", };private int[] clipArray = { 10, 30, 50, 70, 100, 10, 30, 50, 70, 100 };private void initClipSpinner() {ArrayAdapter<String> clipAdapter = new ArrayAdapter<String>(this,R.layout.item_select, clipDescArray);Spinner sp_clip = (Spinner) findViewById(R.id.sp_clip);sp_clip.setPrompt("请选择裁剪幅度");sp_clip.setAdapter(clipAdapter);sp_clip.setOnItemSelectedListener(new OnItemSelectedListener() {public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {int ratio = clipArray[position];ClipDrawable clip = new ClipDrawable(drawable, Gravity.CENTER, position<5?ClipDrawable.HORIZONTAL:ClipDrawable.VERTICAL);iv_clip.setImageDrawable(clip);ClipDrawable clip_drawable = (ClipDrawable) iv_clip.getDrawable();clip_drawable.setLevel(ratio * 100);}public void onNothingSelected(AdapterView<?> parent) {}});sp_clip.setSelection(0);}

可是实际开发中很少会简单地裁剪图形,大家都希望图片尽量完整尽量清晰,好端端的何必要把一张美图拦腰截断呢?所以一般ClipDrawable会配合属性动画,实现犹抱琵琶半遮面的展开动画效果。

下面是展开动画的效果截图:

下面是通过ClipDrawable实现展开动画的代码片段:

 private void playAnimation(int oriention, int from, int to) {ClipDrawable clip = new ClipDrawable(drawable, Gravity.CENTER, oriention);iv_anim.setImageDrawable(clip);ClipDrawable anim_drawable = (ClipDrawable) iv_anim.getDrawable();ObjectAnimator anim = ObjectAnimator.ofInt(anim_drawable, "level", from, to);anim.setDuration(3000);anim.start();}

缩放图形ScaleDrawable

顾名思义,ScaleDrawable可对图形进行缩放操作,但实际上它只能缩小图形,不能放大图形。并且在设置缩放百分比的时候,设置的值是缩小的比例。也就是说,设置0.1,意为缩小10%,而不是原始大小的10%。ScaleDrawable的构造函数除了指定来源图形之外,还可以指定图形的对齐方式、宽度的缩小比例、高度的缩小比例等等。整个图形的缩放比率,也可以先获得缩放图形对象,然后通过setLevel方法进行设置。

下面是缩放图形的效果截图:
 

下面是缩放图形的xml定义文件例子:

<scale xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/banner_1"android:scaleWidth="50%"android:scaleHeight="50%"android:gravity="center">
</scale>

下面是缩放图形的使用代码例子:

 //ScaleDrawable的缩放,并不是自动的建立在原有Drawable尺寸的基础上的。而是,需要给原有的Drawable指定一个Level,然后ScaleDrawable是在这个Level的基础上进行缩放的private String[] scaleDescArray = {"二分之一", "十分之六", "四分之三", "十分之九", "原始尺寸"};private float[] scaleArray = { 0.5f, 0.4f, 0.25f, 0.1f, 0.0f };private void initScaleSpinner() {ArrayAdapter<String> scaleAdapter = new ArrayAdapter<String>(this,R.layout.item_select, scaleDescArray);Spinner sp_scale = (Spinner) findViewById(R.id.sp_scale);sp_scale.setPrompt("请选择缩小比例");sp_scale.setAdapter(scaleAdapter);sp_scale.setOnItemSelectedListener(new OnItemSelectedListener() {public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {float ratio = scaleArray[position];ScaleDrawable scale = new ScaleDrawable(drawable, Gravity.CENTER, ratio, ratio);iv_scale.setImageDrawable(scale);}public void onNothingSelected(AdapterView<?> parent) {}});sp_scale.setSelection(0);}

旋转图形RotateDrawable

有了缩放图形,就有旋转图形,需要注意的是,RotateDrawable不能通过构造函数指定旋转角度,这就意味着,旋转图形只能通过xml文件定义,不能在代码中动态构造。虽然如此,旋转角度仍旧可以通过setLevel方法设置,10000表示旋转360度,以此类推,5000表示旋转180度,2500表示旋转90度。

下面是旋转图形的效果截图:
 

下面是旋转图形的xml定义文件例子:

<rotate xmlns:android="http://schemas.android.com/apk/res/android"    android:drawable="@drawable/banner_1"android:fromDegrees="0"android:toDegrees="360"android:pivotX="50%"android:pivotY="50%">
</rotate>

下面是旋转图形的使用代码例子:

 private String[] rotateDescArray = {"0度", "45度", "90度", "135度", "180度", "225度", "270度", "315度", "360度"};private float[] rotateArray = { 0.0f, 0.125f, 0.25f, 0.375f, 0.5f, 0.625f, 0.75f, 0.875f, 1.0f };private void initRotateSpinner() {ArrayAdapter<String> rotateAdapter = new ArrayAdapter<String>(this,R.layout.item_select, rotateDescArray);Spinner sp_rotate = (Spinner) findViewById(R.id.sp_rotate);sp_rotate.setPrompt("请选择旋转角度");sp_rotate.setAdapter(rotateAdapter);sp_rotate.setOnItemSelectedListener(new OnItemSelectedListener() {public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {float ratio = rotateArray[position];RotateDrawable rotate = (RotateDrawable) iv_rotate.getDrawable();rotate.setLevel((int)(10000*ratio));}public void onNothingSelected(AdapterView<?> parent) {}});sp_rotate.setSelection(0);}

点击下载本文用到的使用变换图形的工程代码

点此查看Android开发笔记的完整目录

Android开发笔记(一百二十九)使用变换图形相关推荐

  1. Android开发笔记(二十九)使用SharedPreferences存取数据

    SharedPreferences使用场景 共享参数(SharedPreferences)是Android上的一个轻量级存储工具,存储结构是类似map的key-value键值对形式.它主要用于保存ap ...

  2. Android开发笔记(八十九)单例模式

    基本概念 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,从而方便对实例个数的控制并节约系统资源. 单例模式有三个特点: 1.某个类只能有一个实例: 2.它要自行创建这个实例: 3.它只有 ...

  3. Android开发笔记(七十九)资源与权限校验

    硬件资源 因为移动设备的硬件配置各不相同,为了防止使用了不存在的设备资源,所以要对设备的硬件情况进行检查.一般情况下,前置摄像头.部分传感器在低端手机上是没有的,像SD卡也可能因为用户没插卡使得找不到 ...

  4. Android开发笔记(二十四)res目录的结构与配置

    res目录结构 res是Android项目工程中存放各类的目录,主要包括布局.图形与配置等等.res的子目录主要有: anim : 存放动画的描述文件 drawable : 存放各类图形的描述文件,包 ...

  5. Android开发笔记(五十九)巧用传感器

    传感器Sensor 传感器是Android用来感知周围环境以及运动信息的工具.因为具体的感应信息依赖于相关硬件,所以虽然Android提供了众多的感应器,但不是每部手机都能支持这么多感应器,恰恰相反, ...

  6. Android开发笔记(六十九)JNI实战

    NDK NDK的用途 NDK全称为Native Development Kit,意即原生的开发工具,NDK允许开发者在APP中通过C/C++代码执行部分程序.它是Android提供的方便开发者通过JN ...

  7. Android开发笔记(四十九)异步任务处理AsyncTask

    AsyncTask异步任务 Thread+Handler方式虽然能够实现多线程的通信处理,但是写起代码来颇为繁琐,所以Android提供了AsyncTask这样一个轻量级的异步任务类,其内部封装好Th ...

  8. Android开发笔记(三十九)Activity的生命周期

    与生命周期有关的方法 下面是Activity类与生命周期有关的方法: onCreate : 创建页面 onStart : 开始页面 onStop : 停止页面 onResume : 恢复页面 onPa ...

  9. Android开发笔记(二十八)利用Application实现内存读写

    全局变量 C/C++有所谓的全局变量,因为全局变量保存在内存中,所以操作全局变量就是操作内存,其速度远比操作数据库或者操作文件快得多,而且工程里的任何代码都可以引用全局变量,因此很多时候全局变量是共享 ...

  10. Android开发笔记(二十六)Java的容器类

    容器的分类 集合(Set/HashSet) 集合中的元素是没有顺序的,而且不可以重复.这意味着,集合只能遍历而无法通过索引访问指定元素,并且如果重复添加相同值将不会增大集合.因为Set只是接口,所以实 ...

最新文章

  1. 调试代码遗留_陷入遗留代码地狱吗? 这里有一些想法可以帮助您处理情况
  2. C学习杂记(七)extern声明可省略变量类型
  3. 菜鸟成长记(十一)----- 操蛋的2016与未知的2017
  4. 【Shell教程】一----什么是Shell
  5. 【字符串算法1】 再谈字符串Hash(优雅的暴力)
  6. EL表达式获取对象属性的原理
  7. 如何学习opencv
  8. iov_iter操作
  9. 51CTO.com 巅峰访谈:让远程接入访问变得更简单 更高效
  10. SSL 域名证书 安装指引
  11. 关于游戏手柄按键的设计
  12. 电子榨菜之Mendix漫画
  13. CSS实现图片自适应布局
  14. 【Java】 杨辉三角 二维数组打印杨辉三角
  15. 1对多业务,数据库水平切分架构一次搞定 | 架构师之路
  16. 51单片机之蜂鸣器为什么不响
  17. [Demo]用简单的html,css做一个漂亮的网页!
  18. 自己动手开发翻译软件(Java版)
  19. Internet Download Manager2023下载器Win系统经典下载工具
  20. suse修改日期时间命令 2022_11_11

热门文章

  1. 吴恩达《机器学习》第十四章:降维
  2. 写作就像升级打怪,4个实战技巧让你“写什么都很棒”!
  3. input的一些使用方法
  4. 尼克老湿の面试回顾(7)
  5. 2005服务器文件夹网页设设置,设置VSS2005使支持通过Internet访问
  6. android studio grandle错误,flutter android studio构建失败
  7. 若依(RuoYi)如何不登录直接访问?
  8. windows下的安装与使用curl实现命令行访问Web网站
  9. 在Eclipse中使用Maven创建多模块的层级项目
  10. [JS基础] 之类型判断