1: 获取asset下面的文件 获得文件IO流。
(context).getResources().getAssets().open("文件名")
2: 通过流创建Bitmap对象:
BitmapFactory.decodeStream(is) 返回Bitma对象,获取后要记得关闭
3:通过流直接获取Drawab
Bitmap b=new BitmapDrawable(is)
Bitmap Config 参数
Bitmap.Config ALPHA_8 Bitmap.Config ARGB_4444 Bitmap.Config ARGB_8888 Bitmap.Config RGB_565 A R G B 透明度 红色 绿色 蓝色 Bitmap.Config ARGB_4444 16 每个像素 占四位 Bitmap.Config ARGB_8888 32 每个像素 占八位 Bitmap.Config RGB_565 16 R占5位 G占6位 B占5位 没有透明度(A) 一般情况下我们都是用argb888 但是无可厚非 它也相对的很占内存 因为一个像素32位 8位一个字节 如果是800*480的图片的话自己算 估计有1M多了
4: 计算字体宽度 在canvas中
Paint p=new Paint(); p.setTextSize(24); Rect bounds = new Rect(); p.getTextBounds(str,0, str.length(), bounds); int width = bounds.width();
5. 什么是density
引用
1) density
density表示每英寸有多少个显示点(逻辑值),它的单位是dpi:dot per inch,通常屏幕大时,density就大,屏幕小时,density就小,通常
屏幕实际分辨率为240px*400px时,density=120
屏幕实际分辨率为320px*533px,density=160
屏幕实际分辨率为480px*800px,density=240
2) 分辨率
是整个屏是多少点,比如800×480,它是软件的显示单位
3) 从Android1.6版本开始支持density(对应API Level 4)
用于解决应用在屏幕大小不同的硬件上正常显示的问题
6.相关代码及设置
引用
1) AndroidManifest.xml
这个参数在API Level 4也就是SDK 1.6以后才启用的,而且1.6版本的API Level 4的应用默认值就是True
2) 资源目录名(android 2.0以后)
res/xxx-hdpi 当density为240时,使用此目录下的资源
res/xxx-mdpi 当density为160时,使用此目录下的资源
res/xxx-ldpi 当density为120时,使用此目录下的资源
res/xxx 不常后缀,为默认设置,同xxx-mdpi
3) 资源单位(xml文件中定义大小的单位)
a) dp=dip=dx (Density independent pixel)
基于屏幕密度的抽象单位,设备无关的点,用于说明与密度无关的尺寸和位置。这些单位是相对于一个160dpi的屏幕,所有一个dp是160dpi屏幕上的一个点。
b) px
px指软件的单位点,设备相关的点
c) 具体使用
i.布局时尽量使用单位dip,少使用px
若使用px,如果设某控件大小400x400px,在800×480上显示正常,而在533×320的屏上就超出屏幕了
若使用dp,如果设某控件大小为160x160dp,就可以通过从系统中取density来算出真正的大小,比如在800×480屏的density设为240,而533×320屏的density设为160,借以下公式计算
pixels = dips * (density / 160)
在800×480在屏中显示240象素,而在533×320的屏中显示为160象素,控件在屏中显示的比例是一样的。
ii. 内部的处理过程分为三步:
取screen中其它元素,转为应用的值,计算应用各控件位置,然后再转成800×480以供真正显示
若res-xxx不存在,则读取res有的资源,然后对其做相应缩放
7. 实现density的关键源码
1) BitmapFactory.java(用于缩放图片)
2) ComptibilityInfo.java(用于位置计算)
8.取得屏幕信息(宽高等)
public static String getDisplayMetrics(Context cx) { String str = ""; DisplayMetrics dm = new DisplayMetrics(); dm = cx.getApplicationContext().getResources().getDisplayMetrics(); int screenWidth = dm.widthPixels; int screenHeight = dm.heightPixels; float density = dm.density; float xdpi = dm.xdpi; float ydpi = dm.ydpi; str += "The absolute width:" + String.valueOf(screenWidth) + "pixelsn"; str += "The absolute heightin:" + String.valueOf(screenHeight) + "pixelsn"; str += "The logical density of the display.:" + String.valueOf(density) + "n"; str += "X dimension :" + String.valueOf(xdpi) + "pixels per inchn"; str += "Y dimension :" + String.valueOf(ydpi) + "pixels per inchn"; return str; }
9. 取得状态栏和标题栏高度
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_test2); tv1 = (TextView) findViewById(R.id.TextView01); tv1.post(new Runnable(){ public void run() { processLayout(); } }); } private void processLayout(){ Rect rect= new Rect(); Window window= getWindow(); tv1.getWindowVisibleDisplayFrame(rect); //状态栏高度 int statusBarHeight= rect.top; int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); //标题栏高度 int titleBarHeight= contentViewTop - statusBarHeight; //测试结果:ok之后 100多 ms 才运行了 Log.v("test", "=-init-= statusBarHeight="+statusBarHeight+ " contentViewTop="+contentViewTop+ " titleBarHeight="+titleBarHeight); }