项目结构详解

1.java是写代码的地方,我们的业务功能在此实现

2.res存放各种资源的地方。eg:图片,字符串,动画,音频,xml文件等

3.assets

  /*获取assets目录下的网页资源*/

  webView.loadUrl("file:///android_asset/html/index.htmll")

/*获取assets目录下的图片资源*/

InputStream is=getAssets().open("wpics/0ZR424L-0.jpg");
Bitmap bitmap=BitmapFactory.decodeStream(is);
imgShow.setImageBitmap(bitmap); 

/*获取assets目录下的文本资源*/

InputStream is = getAssets().open(fileName);    
int lenght = is.available();    
byte[]  buffer = new byte[lenght];    
is.read(buffer);    
String result = = new String(buffer, "utf8");
/*获取assets目录下的音乐资源*/

// 打开指定音乐文件,获取assets目录下指定文件的AssetFileDescriptor对象    
AssetFileDescriptor afd = am.openFd(music);    
mPlayer.reset();    
// 使用MediaPlayer加载指定的声音文件。    
mPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());    
// 准备声音    
mPlayer.prepare();    
// 播放    
mPlayer.start();

/**
 从assets目录中复制整个文件夹内容
 *  @param  context  Context 使用CopyFiles类的Activity
 *  @param  oldPath  String  原文件路径  如:/aa
 *  @param  newPath  String  复制后路径  如:xx:/bb/cc
 */
public void copyFilesFassets(Context context,String oldPath,String newPath) {                   
         try {
        String fileNames[] = context.getAssets().list(oldPath);//获取assets目录下的所有文件及目录名
        if (fileNames.length > 0) {//如果是目录
            File file = new File(newPath);
            file.mkdirs();//如果文件夹不存在,则递归
            for (String fileName : fileNames) {
               copyFilesFassets(context,oldPath + "/" + fileName,newPath+"/"+fileName);
            }
        } else {//如果是文件
            InputStream is = context.getAssets().open(oldPath);
            FileOutputStream fos = new FileOutputStream(new File(newPath));
            byte[] buffer = new byte[1024];
            int byteCount=0;              
            while((byteCount=is.read(buffer))!=-1) {//循环从输入流读取 buffer字节       
                fos.write(buffer, 0, byteCount);//将读取的输入流写入到输出流
            }
            fos.flush();//刷新缓冲区
            is.close();
            fos.close();
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        //如果捕捉到错误则通知UI线程
                   MainActivity.handler.sendEmptyMessage(COPY_FALSE);
    }                          
}

4.res与assets

1>res下所有的资源文件都会在R.java中生成对应的资源id,可通过R.xx.id来调用。(R可以理解为字典,在此生成唯一的id)

2>assets下所有的资源文件不会在R.java中生成对应的资源id,需要通过AssetManager以二进制流的方式来读取

4.1mipmap的目录,在Eclipse并不存在这个,Eclipse中都是drawable开头的,其实区别不大,只是使用mipmap会在图片缩放在提供一定的性能优化,分辨率不同系统会根据屏幕分辨率来选择hdpi,mdpi,xmdpi,xxhdpi下的对应图片,所以你解压别人的apk可以看到上述目录同一名称的图片,在四个文件夹下都有,只是大小和像素不一样而已!当然,这也不是绝对的,比如我们把所有的图片都丢在了drawable-hdpi下的话,即使手机 本该加载ldpi文件夹下的图片资源,但是ldpi下没有,那么加载的还会是hdpi下的图片! 另外,还有一种情况:比如是hdpi,mdpi目录下有,ldpi下没有,那么会加载mdpi中的资源! 原则是使用最接近的密度级别!另外如果你想禁止Android不跟随屏幕密度加载不同文件夹的资源,只需在AndroidManifest.xml文件中添加android:anyDensity="false"字段即可!

4.2图片资源

  • drawable:存放各种位图文件,(.png,.jpg,.9png,.gif等)除此之外可能是一些其他的drawable类型的XML文件
  • mipmap-hdpi:高分辨率,一般我们把图片丢这里
  • mipmap-mdpi:中等分辨率,很少,除非兼容的的手机很旧
  • mipmap-xhdpi:超高分辨率,手机屏幕材质越来越好,以后估计会慢慢往这里过渡
  • mipmap-xxhdpi:超超高分辨率,这个在高端机上有所体现
  • 4.3布局资源
  • layout:该目录下存放的就是我们的布局文件,另外在一些特定的机型上,我们做屏幕适配,比如480*320这样的手机,我们会另外创建一套布局,就行:layout-480x320这样的文件夹!
  • 4.4values目录
    • demens.xml:定义尺寸资源
    • string.xml:定义字符串资源
    • styles.xml:定义样式资源
    • colors.xml:定义颜色资源
    • arrays.xml:定义数组资源
    • attrs.xml:自定义控件时用的较多,自定义控件的属性!
    • theme主题文件,和styles很相似,但是会对整个应用中的Actvitiy或指定Activity起作用,一般是改变窗口外观的!可在Java代码中通过setTheme使用,或者在Androidmanifest.xml中为<application...>添加theme的属性! PS:你可能看到过这样的values目录:values-w820dp,values-v11等,前者w代表平板设备,820dp代表屏幕宽度;而v11这样代表在API(11),即android 3.0后才会用到的!
    • 4.5 raw目录

    • 用于存放各种原生资源(音频,视频,一些XML文件等),我们可以通过openRawResource(int id)来获得资源的二进制流!和Assets差不多,但是这里面的资源会在R文件那里生成一个资源id;raw下不能建文件夹,但assets可以

    • 获取raw下的资源InputStream is = getResources().openRawResource(R.id.filename);

    • 4.6动画

    • 动画有两种:属性动画和补间动画。animator:存放属性动画的XML文件;anim:存放补间动画的XML文件



相关文章: