android Drawable setbounds()介绍

一、Drawable相关概念

1、Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象
2、Canvas画布,绘图的目的区域,用于绘图
3、Bitmap位图,用于图的处理
4、Matrix矩阵

二、Bitmap

1、从资源中获取Bitmap

Java代码  

  1. Resources res = getResources();
  2. Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.icon);

2、Bitmap → byte[]

Java代码  

  1. public byte[] Bitmap2Bytes(Bitmap bm) {
  2. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  3. bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
  4. return baos.toByteArray();
  5. }

3、byte[] → Bitmap

Java代码  

  1. public Bitmap Bytes2Bimap(byte[] b) {
  2. if (b.length != 0) {
  3. return BitmapFactory.decodeByteArray(b, 0, b.length);
  4. } else {
  5. return null;
  6. }
  7. }

4、Bitmap缩放

Java代码  

  1. public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {
  2. int w = bitmap.getWidth();
  3. int h = bitmap.getHeight();
  4. Matrix matrix = new Matrix();
  5. float scaleWidth = ((float) width / w);
  6. float scaleHeight = ((float) height / h);
  7. matrix.postScale(scaleWidth, scaleHeight);
  8. Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
  9. return newbmp;
  10. }

5、将Drawable转化为Bitmap

Java代码  

  1. public static Bitmap drawableToBitmap(Drawable drawable) {
  2. // 取 drawable 的长宽
  3. int w = drawable.getIntrinsicWidth();
  4. int h = drawable.getIntrinsicHeight();
  5. // 取 drawable 的颜色格式
  6. Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
  7. : Bitmap.Config.RGB_565;
  8. // 建立对应 bitmap
  9. Bitmap bitmap = Bitmap.createBitmap(w, h, config);
  10. // 建立对应 bitmap 的画布
  11. Canvas canvas = new Canvas(bitmap);
  12. drawable.setBounds(0, 0, w, h);
  13. // 把 drawable 内容画到画布中
  14. drawable.draw(canvas);
  15. return bitmap;
  16. }

6、获得圆角图片

Java代码  

  1. public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {
  2. int w = bitmap.getWidth();
  3. int h = bitmap.getHeight();
  4. Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888);
  5. Canvas canvas = new Canvas(output);
  6. final int color = 0xff424242;
  7. final Paint paint = new Paint();
  8. final Rect rect = new Rect(0, 0, w, h);
  9. final RectF rectF = new RectF(rect);
  10. paint.setAntiAlias(true);
  11. canvas.drawARGB(0, 0, 0, 0);
  12. paint.setColor(color);
  13. canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
  14. paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
  15. canvas.drawBitmap(bitmap, rect, rect, paint);
  16. return output;
  17. }

7、获得带倒影的图片

Java代码  

  1. public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {
  2. final int reflectionGap = 4;
  3. int w = bitmap.getWidth();
  4. int h = bitmap.getHeight();
  5. Matrix matrix = new Matrix();
  6. matrix.preScale(1, -1);
  7. Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, h / 2, w,
  8. h / 2, matrix, false);
  9. Bitmap bitmapWithReflection = Bitmap.createBitmap(w, (h + h / 2),
  10. Config.ARGB_8888);
  11. Canvas canvas = new Canvas(bitmapWithReflection);
  12. canvas.drawBitmap(bitmap, 0, 0, null);
  13. Paint deafalutPaint = new Paint();
  14. canvas.drawRect(0, h, w, h + reflectionGap, deafalutPaint);
  15. canvas.drawBitmap(reflectionImage, 0, h + reflectionGap, null);
  16. Paint paint = new Paint();
  17. LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,
  18. bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,
  19. 0x00ffffff, TileMode.CLAMP);
  20. paint.setShader(shader);
  21. // Set the Transfer mode to be porter duff and destination in
  22. paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
  23. // Draw a rectangle using the paint with our linear gradient
  24. canvas.drawRect(0, h, w, bitmapWithReflection.getHeight()
  25. + reflectionGap, paint);
  26. return bitmapWithReflection;
  27. }

三、Drawable

1、Bitmap转换成Drawable

Java代码  

  1. Bitmap bm=xxx; //xxx根据你的情况获取
  2. BitmapDrawable bd= new BitmapDrawable(getResource(), bm);
  3. 因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。

2、Drawable缩放

Java代码  

  1. public static Drawable zoomDrawable(Drawable drawable, int w, int h) {
  2. int width = drawable.getIntrinsicWidth();
  3. int height = drawable.getIntrinsicHeight();
  4. // drawable转换成bitmap
  5. Bitmap oldbmp = drawableToBitmap(drawable);
  6. // 创建操作图片用的Matrix对象
  7. Matrix matrix = new Matrix();
  8. // 计算缩放比例
  9. float sx = ((float) w / width);
  10. float sy = ((float) h / height);
  11. // 设置缩放比例
  12. matrix.postScale(sx, sy);
  13. // 建立新的bitmap,其内容是对原bitmap的缩放后的图
  14. Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height,
  15. matrix, true);
  16. return new BitmapDrawable(newbmp);
  17. }
时间: 2024-11-09 05:56:04

android Drawable setbounds()介绍的相关文章

Android Drawable的9种子类 介绍

原文: Android Drawable的9种子类 介绍 Drawable 在android里面 就是代表着图像,注意是图像 而不是图片. 图片是图像的子集.图像除了可以包含图片以外 还可以包含颜色. 换句话说Drawble就是canvas 可以绘制的 一种概念. android 系统自带了很多种drawable.我们最好对自带的drawable 有一种比较熟悉的了解, 这样对我们apk开发很有好处,因为drawable使用 非常简单 基本上就是xml编写 即可.比你自己自定义view的成本要低

Android UI集锦——1.Android Drawable分类汇总(1/3)

Android UI集锦--1.Android Drawable分类汇总(1/3) -转载请注明出处coder-pig 本节引言: 小猪好像写了好几个专题,都没坚持写完,又忍不住开个新的专题了,因为最近打算 开始研究Android图形与图形图像处理,动画以及自定义View等,所以就顺道记录下, 最近事有点多,感觉情绪很低迷,心理压抑又找不到倾述的对象,这个时候程序猿肯定会说: "没对象,你自己new一个啊",好有道理,我竟无言以对...好吧!还是自己的那句座右铭: 没什么可以一蹴而就,

我的Android第三章:Android的组件介绍

小编摘录了Android文档介绍Android四大组件的基本内容,感觉文档的内容写的很详细所以小编将它写入了博客 Android 使用Java语言开发.Android SDK 工具编译代码-以及任意数据并连同相关资源打包进一个Android 包内,它是一个以.apk 为后缀的压缩文件. 一个 .apk 文件中的 所有代码就是一个程序.这个.apk文件就用于在Android设备上安装这个程序. 一旦安装成功,这个Android程序就拥有了自己独立的运行沙盒(沙盒是在受限的安全环境中运行应用程序的一

Android控件介绍

Android控件介绍 多选按钮(CheckBox) CheckBox有两个常用的事件,OnClickListener事件和OnClickChangeListener事件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_w

Android CollapsingToolbarLayout使用介绍

我非常喜欢Material Design里折叠工具栏的效果,bilibili Android客户端视频详情页就是采用的这种设计.这篇文章的第二部分我们就通过简单的模仿bilibili视频详情页的实现来了解下CollapsingToolbarLayout的使用.文章的第三部分介绍了CollapsingToolbarLayout与TabLayout的组合使用. 有基础的朋友可以直接跳过第一部分. 一.相关基础属性介绍 Android studio中有一个Activity模板叫ScrollingAct

Android Fragment的介绍与使用(案例Demo)

应用场景: 众所了解Android上的界面展示都是通过Activity实现的,但是Activity也有它的局限性,同样的界面在手机上显示可能很好看,在平板上就未必了.为了让界面可以在平板上更好地展示,Android在3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像Activity一样包含布局.Fragment通常是嵌套在Activity中使用的.首先需要注意,Fragment是在3.0版本引入的,如果你使用的是3.0之前的系统,需要先导入android-supp

Android Phone设计介绍

Android Phone设计介绍 在Android之rild进程启动源码分析一文中已经详细介绍了Android的电话系统架构设计,并对rild进程进行了详细的剖析.native层的rild进程负责与底层modem设备交互,比如向modem发送AT命令.从modem中接收消息,同时实时监控modem的状态:作为三层架构设计的Android电话系统:客户端的framework.服务端的rild.modem设备,rild进程还需要接收来自客户端的命令消息,将客户端的需求转发给modem设备,实现对m

Android CoordinatorLayout 入门介绍

Android CoordinatorLayout 入门介绍 CoordinatorLayout View 知道如何表现 在 2015 年的 I/O 开发者大会上,Google 介绍了一个新的 Android Design Support Library,该库可以帮助开发者在应用上使用 meterial design.它包含了许多重要的 meterial design 的构建块,并且它支持 API 7及以上的版本.如果你错过了这次大会,那就请打开谷歌开发者站点来查阅它的相关信息吧:传送门. Co

Android Drawable 与 LayerList综合汇总

先看需求.要求这样的效果 上代码 <?xml version="1.0" encoding="utf-8"? > <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape android:shape="oval" > <solid android:color=