一: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. Mysql 变量使用

    mysql 中可以将所查询到的数据用变量存储下来,供后面使用 语法:SELECT @变量名 := 变量值 eg: SELECT @cid:=class_id, (SELECT class_name F ...

  2. Redis小结

    一. Redis简介 Redis是一个速度非常快的高性能的key-value存储系统.redis的出现,很大程度补偿了memcached这类key/value存储的不足.Redis支持存储五种valu ...

  3. BOOST1.54简化编译

    1.设置环境变量 BOOST_ROOT E:\Projects\00.CODE.SDK\boost_1_54_0 2.运行bootstrap.bat 3.运行: bjam install --tool ...

  4. Windows文件系统漏洞

    1.Windows中很有用的文件替换命令,绕过文件保护用来替换文件的replace,连正在使用的文件也能替换.非常无敌. 比如:在C:下建一个目录,c:aaa 然后复制一首mp3到c:aaa并命名为c ...

  5. Restore Oracle database to another server

    1. Copy or remotely mount the backupset folder from the source server to the target server 2. On the ...

  6. 打印文本中的所有单词,并且打印每个单词出现的行号,非实义单词不考虑(TCPL,练习6-3)

    建立一棵二叉树,每个接单存放单词以及指向一个链表的指针,以及指向左右节点的指针.链表内存放行号以及指向下一个链表节点的指针. 每录入一个单词,先寻找二叉树,再寻找它的链表,分别将单词和行号插入二叉树和 ...

  7. jQuery给标签写入内容

    使用原生js时可以用 document.getElementById("divID").innerHTML = "div的显示值" 来赋值: 而在使用jQuer ...

  8. No prohects are avaliable for deployment to this server

    没有项目可用于部署到该服务器的项目或者所有项目都已部署到该服务器或没有发现项目 报错的就是这样的信息,网上看了很多解决方案,比如:http://ttov.blog.163.com/blog/stati ...

  9. 【异常】VS中运行HTTP 无法注册URL

    参考资料 http://www.java123.net/detail/view-449670.html http://www.cnblogs.com/jiewei915/archive/2010/06 ...

  10. UWP开发笔记——嵌套式页面的实现

    绪论 UWP开发中,Page是最常用的Control之一,通常情况下,在开发的application中,每一个页面就是一个Page.有时候,为了开发整合度更高,UI表现更为一致的UI,开发者需要把UI ...