一:Android图片操作

1.存储bitmap到本地文件系统

public static void bitmapToFile(Bitmap bitmap, String uri) {
  if(!externalStorageAvailable()) {
  return;
  }   if (bitmap == null) {
    return;
  }   // 先检查目录是否存在,不存在的话,创建目录
  File wikiDir = new File(WIKI_IMAGE_DIR);
  if (!wikiDir.exists()) {
    wikiDir.mkdirs();
  }
  File f = new File(IMAGE_DIR, uri);
  if (f.exists()) {
    return;
  }
  
  try {
    FileOutputStream out = new FileOutputStream(f);
    bitmap.compress(Bitmap.CompressFormat.JPEG, IMG_CACHE_QUALITY, out);
    out.flush();
    out.close();
  } catch (FileNotFoundException e) {
    e.printStackTrace();
  } catch (IOException e) {
  e.printStackTrace();
  }
}

2.读取图片为bitmap

public static Bitmap fileToBitmap(String uri) {
  File imgFile = new File(IMAGE_DIR + File.separator + uri);
  if(imgFile.exists()) {
    Bitmap bitmap = BitmapFactory.decodeFile(IMAGE_DIR + File.separator + uri);
    return bitmap;
  }
  return null;
}

二、Android 屏幕相关

结论:绝大部分机型的屏幕宽度是320dp和360dp。

在android中为了适应不同分辨率的屏幕,引入了密度无关像素density-independent pixes,也就是dip,也可以简写为dp。之所以是与密度无关,是因为android为不同的密度提供了不同的scale值,比如mdpi的值为1,hdpi为1.5,xhdpi为2.这样,如果使用相同的dp值,系统在转换为px时,会使用dp*scale值,这样得到的比例大家都相同,而比例相同了,也就意味着屏幕适配了。如480*800,4.0inch的屏幕,为hdpi。屏幕的一半可以用160dp表示,其px = 160 * 1.5 = 240px,恰好为480的一半。而320*640的 3.5inch的屏幕,为mdpi。屏幕的一半也是160dp,其px = 160 * 1 = 160px,恰好为320的一半。这样dp就实现了不同屏幕的适配。
 
但是现在xhdpi的屏幕也很普遍,比如720*1280 4.5inch的屏幕,其scale值为2,所以整个屏幕为360dp,这样与hdpi和mdpi就不太相同了,用dp表示比例就有些误差了。不过这种误差也是在可以接受的范围之内。
 
上面所说的都是以屏幕宽度为基准,因为ui设计时也是尽量已宽度为基准,如果以高度为基准,dp值表示的比例就相差更大了。
 
而对于平板很多情况下以高度作为标准。都是hdpi的平板其宽高就更不一样了。比如高度分别是1200和1600的平板,都是hdpi。这就意味着如果是表示一半的高度,dp值分别为400dp和533,相差如此之大,所以用dp来布局显然不再适用。
 
解决方法:
既然dp的引入其实就是为了用同一个dp值表示相同的比例,那么我们其实可以直接用比例表示(dp的本质也是比例,只不过scale的划分无法面面俱到)。当然前提是不同的屏幕比例不能相差过大,比如横屏和竖屏就无法通用,需要写两个layout
 
例如ui给一张设计图,尺寸为2560 * 1920,其长宽比为4:3. 所有的标注均以该尺寸为准。这样为了能够通用这些标注,不必手动计算,可以定义如下个方法
private int px_x(float px) {//以宽度为基准计算x方向上的比例
return (int)(px / 2560 * mScreenHight);
} private int px_y(float px) {
return (int)(px / 1920* mScreenWidth);
}
这样在代码中重新设置一下跟尺寸相关的属性即可以保证相关内容可以适配到不同尺寸的屏幕上。
 
需要注意的是:
这样写的一个缺点就是无法再xml里的layout中直接定义好布局。尤其是各个控件之间的距离。不过xml并非没有用处,可以通过xml很方便的定义控件直接的相对位置,比如above,below等属性,这样在代码中就不必重复定义了。可以通过 view.getLayoutParameters()方法获取到布局属性,然后覆盖与尺寸相关的内容即可。(注:不可以用new parameter()的方法,这样会完全覆盖xml中的设置)

三、Android  .9 图片的理解及用途

1..9.png如何理解?
.9.png仍然是一个png格式的图片,只不过是针对Android平台的可以指定图片特定位置拉伸和填充内容的一种特殊的png图片格式。
 
这里需要注意几个问题:
a..9.png只是针对Android平台而言的,在其他平台上没有效果;
b..9.png只是针对图片拉伸而言的,当然包括单独的横线拉伸,单独的纵向拉伸和同时横向和纵向拉伸,对于图片压缩没有效果;
c..9.png可以同时指定图片的横向和纵向拉伸的区域(相应的可以理解成可以指定图片不进行拉升的区域),由此可以在图片拉伸时达到自己想要的效果;
d..9.png可以指定图片上填充内容(包括文字和非文字的布局等)的区域,非填充区域即可理解成div中的padding留白。
 
2..9.png拉伸和填充区域如何指定?
这方面网上资料太多,主要都谈到在.png图片四周增加左、上、右、下四条带有一个像素的黑实线,分别表示含义如下:
左边线条:当图片进行纵向拉伸时,由此线条从图片左边水平位移到图片右边所形成的区域都是可以进行纵向拉伸的,此区域外则不进行拉伸,保留原来效果;
上边线条:当图片进行水平拉伸时,由此线条从图片上边垂直位移到图片下边所形成的区域都是可以进行横向拉伸的,此区域外则不进行拉伸,保留原来效果;
右边线条:控制图片填充内容的垂直padding留白;
下边线条:控制图片填充内容的水平padding留白。
 
3..9.png如何制作?
 
网上也介绍了不少关于.9.png的图片制作工具,推荐Google官方推荐的工具draw9patch。位于目录\adt-bundle\sdk\tools\下。双击即可打开,既可以通过.png图片制作成.9.png,也可直接对现有.9.png图片进行修改,使用非常方便。

Android 图片文件操作、屏幕相关、.9图片的理解的更多相关文章

  1. C#文件操作常用相关类(Directory类、File类、Path类)

    1.文件操作常用相关类 1)File //操作文件,静态类,对文件整体操作.拷贝.删除.剪切等 2)Directory //操作目录(文件夹),静态类 3)DirectoryInfo //文件夹的一个 ...

  2. android的文件操作

    http://blog.csdn.net/fenghome/article/details/5668598 android的文件操作要有权限: <uses-permission android: ...

  3. 如何将位图格式图片文件(.bmp)生成geotiff格式图片?

    一.位图格式信息 位图BITMAPINFOHEADER 与BITMAPFILEHEADER: 先来看BITMAPINFOHEADER,只写几个主要的 biSize包含的是这个结构体的大小(包括颜色表) ...

  4. C#实现图片文件到数据流再到图片文件的转换 --转

    /----引入必要的命名空间 using System.IO; using System.Drawing.Imaging; //----代码部分----// private byte[] photo; ...

  5. android通用文件操作

    最经用到android的SCCard的文件操作,因此稍作了整理,将它写成一个简单的工具类.其中,可以判断SDCard的是否可用,可用存储空间,文件的创建以及写入数据.经过测试,可以正常使用.代码如下: ...

  6. Struts2图片文件上传,判断图片格式和图片大小

    1. 配置Struts2能够上传的最大文件大小 使用Struts2进行文件上传的时候,Struts2默认文件大小最大为2MB,如果要传大一点的文件,就需要修改struts.xml配置文件,重新设置能够 ...

  7. C#实现图片文件到数据流再到图片文件的转换

    //----引入必要的命名空间using System.IO;using System.Drawing.Imaging; //----代码部分----// private byte[] photo;/ ...

  8. Android FileUtils 文件操作类

    系统路径 Context.getPackageName(); // 用于获取APP的所在包目录 Context.getPackageCodePath(); //来获得当前应用程序对应的apk文件的路径 ...

  9. python3 文件操作练习 r+ w+ a+ 的理解

    突然来一句:“慨然有经略四方之志” 文件操作三部曲:1.先用open打开 2.再写关闭  3.再回到中间写操作     为啥要刚打开就关闭 那是很容易望,所以先写上... 基本格式 f = open( ...

随机推荐

  1. UIImagePickerController在ios10环境一打开就crash的问题

    在之前的系统环境下,UIImagePickerController都可以顺利打开.但是自从手机升级了ios10以后,每次打开相机和照片库都会直接崩溃. 通过google搜索找到StackOverflo ...

  2. Debian系统vim中文显示乱码问题

    网上查的一堆东西好像都不灵,试了半天! 先安装中文字体:sudo aptitude install fonts-arphic-uming fonts-wqy-zenhei 然后:sudo locale ...

  3. (转)Java中的static关键字解析

    转自http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “sta ...

  4. ftp 服务器搭建和添加用户和目录

    安装: yum install  -y vsftpd 修改配置: vsftpd.conf 修改:anonymous_enable=YES 改为:anonymous_enable=NO 启动/停止/重启 ...

  5. 推荐一款跨平台的 Azure Storage Explorer

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  6. ArcGIS Js/Flex等前端API(Query(StatisticDefinition)时)针对SDE的SHAPE.AREA/SHAPE.LEN知道查询无效,而对GDB的SHAPE_Area/SHAPE_Length有效探索。

    FIeld 'SHAPE.AREA' and 'SHAPE.LEN' of SDE For Oracle,Field 'SHAPE_Area' and 'SHAPE_Length' of gdb(ge ...

  7. [UCSD白板题] Maximum Pairwise Product

    Problem Description Task.Given a sequence of non-negative integers \(a_0, ..., a_{n-1}\),find the ma ...

  8. Hive使用技巧

    hive默认查询不会显示列名, 当一个表字段比较多的时候,往往看不出值与列之间的对应关系,对日常查错及定位问题带来不便,像下面这样. hive> >select * from exampl ...

  9. Struts2中获取servlet API的几种方式

    struts2是一个全新的MVC框架,如今被广大的企业和开发者所使用,它的功能非常强大.这给我们在使用servlet 纯java代码写项目的时候带来了福音.但是一般来说,我们的项目不到一定规模并不需要 ...

  10. java入门(1)

    今天开始了java的学习,是同学给的一个说是外面培训的视频,因为我个人的专业是硬件,对软件开发其实也蛮有兴趣,不过确实有跟风的嫌疑哈,因为大家都说现在的主流就是java,所以就跟软件的人要了它的资料, ...