精华内容
下载资源
问答
  • Unity3D加载外部资源

    千次阅读 2015-06-26 10:41:31
    Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时动态加载,可以指定路径和来源的。其实场景里所有静态的对象也有这么一个加载过程,只是

    Unity 3D里有两种动态加载机制

         一是Resources.Load

         一是通过AssetBundle

         其实两者本质上没有什么区别。Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时动态加载,可以指定路径和来源的。其实场景里所有静态的对象也有这么一个加载过程,只是Unity后台替你自动完成了。

    1.    AssetBundles是什么?

         在一些大型的网络游戏,或者加载比较多的一些场景时,如果要等待所有模型,贴图等各种资源文件加载完毕才能执行游戏,对用户将会是一个很头大的事情。所以就需要用到动态加载,即AssetBundles。比如玩家在进入游戏时先加载一些周围的场景文件,这样不仅可以提高速度还可以减少内存资源的消耗。       

         AssetBundles是可以把unity3d中你所创建的文件或任何资源导出的一种文件格式,这些文件导出后使用的是一种特定的文件格式(.Unity3d),这些特定格式的文件能在需要的时候加载到场景中。而这些特定的文件格式可以是模型,贴图,声音文件甚至是场景文件,它们是先前就被设计好的文件,所以很容易就可以被下载到你所建立的游戏或场景中来

         AssetBundles 可以是任意类型的文件只要是unity3d能识别的资源文件格式,识别主要是以文件扩展名为准,比如.prefab等等。当然如果你想包含自定义的二进制文件,需要命名这些文件为以".bytes"为后缀,Unity将会把这些文件导成TextAssets

    2.    Creating AssetBundles 创建资源包

    有三个类方法可以用来构建资源包:

    BuildPipeline.BuildAssetBundle,

    BuildPipeline.BuildStreamedSceneAssetBundle 

    BuildPipeline.BuildAssetBundleExplicitAssetNames.

    • BuildPipeline.BuildAssetBundle allows you to build AssetBundles of any type of asset.
          可以构建任意类型资源的资源包。【创建一个压缩好的包含Assets下的所有资源文件.unity3d。可以包含是项目目录下的任意资源,而把所有的资源压缩成一个.unity3d的文件,这个文件包括所有的预置物体(prefabs),纹理贴图(textures),模型,动画。使用AssetBundle.mainAsset这个函数可以很方便的让你指定一个定义好的物体。被压缩的资源储存在pathName. Options,会自动的允许用户包含相关的或者需要用到的】
    • BuildPipeline.BuildStreamedSceneAssetBundle is used when you want to include only scenes to be streamed and loaded as the data becomes available.
           用来当你希望只包括流场景,使数据加载变为可用。【建立一个或多个场景,这些场景所需要的所有资源将被压缩入资源包,即asset bundle里面。资源包中的场景文件可以在任何平台上建立,而且这些文件往往是以一个单一的unity3d文件格式被用来创建。使用WWW类可以下载场景文件。当场景文件被下载好可以使用WWW.LoadFromCacheOrDownload来加载下载好的场景文件。】
    • BuildPipeline.BuildAssetBundleExplicitAssetNames is the same as BuildPipeline.BuildAssetBundle but has an extra parameter to specify a custom string identifier (name) for each object.
           BuildPipeline.BuildAssetBundle类似,但是有额外的参数来指定每个物体的自定义的字符串(名字)。【建立一个自定义名字的资源包方法:创建一个包含所有资源的一个压缩好的unity3d文件。AssetBundle可以包括任何项目目录下的资源文件。在assetNames参数中提供一个与资源数目相同大小的字符串数组。在资源数组中存储的信息与资源文件名相同,可以传递AssetBundle.Load去加载一个指定的资源。使用BuildAssetBundle时,只需使用资源的路径名。压缩好的资源包文件将会被储存在pathName. Options,允许用户自动包含与之相关的或者总是包含完整的资源去代替确切的参照物体。】

              当使用上面的三个函数做完准备工作,我们现在就需要去下载这些资源然后加载它们。

    3.    Downloading AssetBundles 下载资源包

    推荐使用WWW.LoadFromCacheOrDownload方法用来下载资源。当下载完成你就可以重新得到该资源的相关属性,例如:

    1. function Start ()  
    2. {  
    3.      var www = WWW.LoadFromCacheOrDownload ("http://myserver.com/myassetBundle.unity3d",   
    4. 5);  
    5. yield www;  
    6. if (www.error != null)  
    7. {  
    8.      Debug.Log (www.error);  
    9.      return;  
    10. }  
    11.     var myLoadedAssetBundle = www.assetBundle;  
    12.     var asset = myLoadedAssetBundle.mainAsset;  
    13. }  


     

    4.   Loading and unloading objects from an AssetBundle从资源包加载和卸载对象

            下载完以后,等于把硬盘或者网络的一个文件读到内存一个区域,这时候只是个AssetBundle内存镜像数据块,还没有Assets的概念。就可以使用这三个不同的函数来加载物体了:

     AssetBundle.Load

    AssetBundle.LoadAsync

     AssetBundle.LoadAll

    • AssetBundle.Load会加载物体,使用该物体的名字作为识别的参数。名字可以在Unity3d中Project view看到。你可以自由选择去传递对象变量的类型来确认该加载对象是否是被指定的类型。
    • AssetBundle.LoadAsync 与AssetBundle.Load 函数相类似,但是当资源加载时它不会阻碍主线程。如果同时要加载比较大的资源或者很多资源时,这个函数会比较有用,它可以避免程序的暂停,因为它会同步加载。
    • AssetBundle.LoadAll 顾名思义这个函数是用来加载所有在你资源包中的对象。作为AssetBundle.Load这个函数,你可以随意用该对象的类型去过滤。

            使用AssetBundle.Unload这个函数可以卸载加载好的资源,这个函数有一个布尔值的参数是用来告诉Unity是否要卸载所有的数据(包含加载的资源对象)或者只是已经下载过的被压缩好的资源数据。如果要在资源包中从你的应用程序要使用一些对象或者你想释放一些内存,可以传递false这个值来卸载已经压缩好了的文件从你的内存中(即.unity3d文件)。如果要完全卸载所有的资源数据,需要传递true这个值,这将会销毁所有的资源包器中加载的资源。

            AssetBundle.Unload(flase)是释放AssetBundle文件的内存镜像,不包含Load创建的Asset内存对象。

            AssetBundle.Unload(true)是释放那个AssetBundle文件内存镜像和并销毁所有用Load创建的Asset内存对象。

    5. Instantiating objects from AssetBundles 从资源包实例化物体

           下载了资源,也加载好了,那么就该在场景中使用Instantiate函数去实例化它了。

            Instantiate一个Prefab,是一个对Assets进行Clone(复制)+引用结合的过程,GameObject transform 是Clone是新生成的。其他mesh / texture / material / shader 等,这其中些是纯引用的关系的,包括:Texture和TerrainData,还有引用和复制同时存在的,包括:Mesh/material/PhysicMaterial。引用的Asset对象不会被复制,只是一个简单的指针指向已经Load的Asset对象。

    Unity里每个Script都是一个封闭的Class定义而已,并没有写调用代码,光Class的定义脚本是不会工作的。其实Unity引擎就是那个调用代码,Clone一个script asset等于new一个class实例,实例才会完成工作。把他挂到Unity主线程的调用链里去,Class实例里的OnUpdate OnStart等才会被执行。多个物体挂同一个脚本,其实就是在多个物体上挂了那个脚本类的多个实例而已,这样就好理解了。在new class这个过程中,数据区是复制的,代码区是共享的,算是一种特殊的复制+引用关系。

            当你Destroy一个实例时,只是释放那些Clone对象,并不会释放引用对象和Clone的数据源对象,Destroy并不知道是否还有别的object在引用那些对象。等到没有任何游戏场景物体在用这些Assets以后,这些assets就成了没有引用的游离数据块了,是UnusedAssets了,这时候就可以通过Resources.UnloadUnusedAssets来释放,Destroy不能完成这个任务,AssetBundle.Unload(false)也不行,AssetBundle.Unload(true)可以但不安全,除非你很清楚没有任何对象在用这些Assets了。

    1. string url = "http://www.mywebsite.com/mygame/assetbundles/assetbundle1.unity3d";  
    2. IEnumerator Start () {  
    3.     // Start a download of the given URL  
    4.     // 开始从指定路径下载  
    5.     WWW www = WWW.LoadFromCacheOrDownload (url, 1);  
    6.     // Wait for download to complete  
    7.     // 等待下载完成  
    8.     yield return www;  
    9.     // Load and retrieve the AssetBundle  
    10.     // 加载并取回资源包  
    11.     AssetBundle bundle = www.assetBundle;  
    12.     // Load the TextAsset object  
    13.     // 加载文本资源对象  
    14.     GameObject go = bundle.Load("myGameObject", typeof(GameObject)) as GameObject;  
    15.     // Instantiate the GameObject  
    16.     // 实例化该对象  
    17.     Instantiate(go);  
    18. }  

            Unity不提供自动的一个可以取回所有被下载资源的列表。所以需要我们在脚本中要建立这些资源对象的信息和它们的路径以便我们去查找。

    6. Including scripts in AssetBundles 在资源包中包含脚本

           资源包可以作为TextAssets包含脚本但是不会实际执行代码。如果想要在资源包包含用来执行应用程序的代码,需要预先编译,然后使用Mono Reflection class来加载(注意:Reflection在iOS平台不可用)。可以在任何版本的C#IDE编辑器(如:Monodevelop, Visual Studio)或者使用mono/.net 文档编辑器。

    1. string url = "http://www.mywebsite.com/mygame/assetbundles/assetbundle1.unity3d";  
    2. IEnumerator Start () {  
    3.     // Start a download of the given URL  
    4.     WWW www = WWW.LoadFromCacheOrDownload (url, 1);  
    5.     // Wait for download to complete  
    6.     yield return www;  
    7.     // Load and retrieve the AssetBundle  
    8.     AssetBundle bundle = www.assetBundle;  
    9.     // Load the TextAsset object  
    10.     TextAsset txt = bundle.Load("myBinaryAsText", typeof(TextAsset)) as TextAsset;  
    11.     // Load the assembly and get a type (class) from it  
    12.     var assembly = System.Reflection.Assembly.Load(txt.bytes);  
    13.     var type = assembly.GetType("MyClassDerivedFromMonoBehaviour");  
    14.     // Instantiate a GameObject and add a component with the loaded class  
    15.     GameObject go = new GameObject();  
    16.     go.AddComponent(type);  
    17. }  

    一个常见的错误:

             从某个AssetBundle里Load了一个prefab并克隆之:obj = Instantiate (AssetBundle1.Load('MyPrefab”);

              这个prefab比如是个npc,然后你不需要他的时候你用了:Destroy(obj);你以为就释放干净了。其实这时候只是释放了Clone对象,通过Load加载的所有引用、非引用Assets对象全都静静静的躺在内存里。这种情况应该在Destroy以后用:AssetBundle1.Unload(true),彻底释放干净。如果这个AssetBundle1是要反复读取的 不方便Unload,那可以在Destroy以后用:Resources.UnloadUnusedAssets()把所有和这个npc有关的Asset都销毁。

              当然如果这个NPC也是要频繁创建 销毁的那就应该让那些Assets呆在内存里以加速游戏体验。由此可以解释另一个之前有人提过的话题:为什么第一次Instantiate一个Prefab的时候都会卡一下,因为在你第一次Instantiate之前,相应的Asset对象还没有被创建,要加载系统内置的AssetBundle并创建Assets,第一次以后你虽然Destroy了,但Prefab的Assets对象都还在内存里,所以就很快了。

     

    资源加载和释放例子:

    从磁盘读取一个1.unity3d文件到内存并建立一个AssetBundle1对象

    AssetBundle AssetBundle1 = AssetBundle.CreateFromFile("1.unity3d");

    从AssetBundle1里读取并创建一个Texture Asset,把obj1的主贴图指向它

    obj1.renderer.material.mainTexture = AssetBundle1.Load("wall") as Texture;

    把obj2的主贴图也指向同一个Texture Asset

    obj2.renderer.material.mainTexture =obj1.renderer.material.mainTexture;

    Texture是引用对象,永远不会有自动复制的情况出现(除非你真需要,用代码自己实现copy),只会是创建和添加引用

    继续:

    AssetBundle1.Unload(true) 那obj1和obj2都变成黑的了,因为指向的Texture Asset没了

    如果:

    AssetBundle1.Unload(false) 那obj1和obj2不变,只是AssetBundle1的内存镜像释放

    继续:

    Destroy(obj1),//obj1被释放,但并不会释放刚才Load的Texture

    如果这时候:

    Resources.UnloadUnusedAssets();

    不会有任何内存释放 因为Texture asset还被obj2用着

    如果:

    Destroy(obj2)

    obj2被释放,但也不会释放刚才Load的Texture

    继续:

    Resources.UnloadUnusedAssets();

    这时候刚才load的Texture Asset释放了,因为没有任何引用了

    最后CG.Collect();

    强制立即释放内存。

     

    如何加载一堆大图片轮流显示又不爆掉?

    不考虑AssetBundle,直接用www读图片文件的话等于是直接创建了一个Texture Asset。

    1. TLlist<string> fileList;  
    2. int n=0;  
    3. IEnumerator OnClick()  
    4. {  
    5. WWW image = new www(fileList[n++]);  
    6. yield return image;  
    7. Texture tex = obj.mainTexture;  
    8. obj.mainTexture = image.texture;  
    9.    
    10. n = (n>=fileList.Length-1)?0:n;  
    11. Resources.UnloadAsset(tex);  
    12. }  


    文档下载地址:http://download.csdn.net/detail/tanmengwen/5262100

    展开全文
  • springboot对外部静态资源文件的处理

    千次阅读 2019-05-22 17:53:07
    springboot对外部资源文件的处理主要分为2部分,存和取,通过查看官方文件和看博客踩了坑之后终于搞定了,特此记录。 存方面倒还简单,这里贴上一个获取微信临时素材并保存的方法 /** * @功能 下载临时素材接口 ...

    springboot对外部资源文件的处理主要分为2部分,存和取,通过查看官方文件和看博客踩了坑之后终于搞定了,特此记录。

    存方面倒还简单,这里贴上一个获取微信临时素材并保存的方法

    /**
         * @功能 下载临时素材接口
         * @param filePath 文件将要保存的目录
         * @param method 请求方法,包括POST和GET
         * @param url 请求的路径
         * @return
         */
    
        public static String saveUrlAs(String url,String filePath,String method){
            //创建不同的文件夹目录
            File file=new File(filePath);
            //判断文件夹是否存在
            if (!file.exists())
            {
                //如果文件夹不存在,则创建新的的文件夹
                file.mkdirs();
            }
            FileOutputStream fileOut = null;
            HttpURLConnection conn = null;
            InputStream inputStream = null;
            String savePath = null ;
            try
            {
                // 建立链接
                URL httpUrl=new URL(url);
                conn=(HttpURLConnection) httpUrl.openConnection();
                //以Post方式提交表单,默认get方式
                conn.setRequestMethod(method);
                conn.setDoInput(true);
                conn.setDoOutput(true);
                // post方式不能使用缓存
                conn.setUseCaches(false);
                //连接指定的资源
                conn.connect();
                //获取网络输入流
                inputStream=conn.getInputStream();
                BufferedInputStream bis = new BufferedInputStream(inputStream);
                //判断文件的保存路径后面是否以/结尾
                if (!filePath.endsWith("/")) {
    
                    filePath += "/";
    
                }
                String filePathDir =  DateUtil.getStringAllDate();
                //写入到文件(注意文件保存路径的后面一定要加上文件的名称)
                savePath = filePath+filePathDir+".png";
                fileOut = new FileOutputStream(savePath);
                BufferedOutputStream bos = new BufferedOutputStream(fileOut);
    
                byte[] buf = new byte[4096];
                int length = bis.read(buf);
                //保存文件
                while(length != -1)
                {
                    bos.write(buf, 0, length);
                    length = bis.read(buf);
                }
                bos.close();
                bis.close();
                conn.disconnect();
            } catch (Exception e)
            {
                e.printStackTrace();
                logger.error(">>>>>>>>>>>>>>>>下载临时素材接口抛出异常 [{}]",e.getMessage());
            }
    
            return savePath;
    
        }

    2.取,由于对springboot不熟悉,所以在这上面踩了坑

     先看一下springboot官方文档对静态资源这一块的表述

    https://docs.spring.io/spring-boot/docs/1.5.19.RELEASE/reference/htmlsingle/#boot-features-spring-mvc-static-content

    主要使用到这2个配置

    spring.mvc.static-path-pattern=/resources/**    //配置url访问路径
    spring.resources.static-locations=                      //配置对应的文件路径

    由于我想要将静态资源存到项目外部比如 和项目根目录同级的 static文件夹里,然后配置了

    spring.resources.static-locations=  static/

    spring.mvc.static-path-pattern=/static/** 

    之后,访问文件一直404

    随后网上查了一下,看到了这一篇https://blog.csdn.net/kilua_way/article/details/54601195

    发现

    spring.resources.static-locations= file:xxx 

    使用了file: + 路径这一配置方法,然后尝试了一下,变成这样:

    spring:
      resources:
        static-locations: file:${my.config.static-location}
    my:
      config:
        static-location: /static/

    发现文件访问成功了!

    所以实际上外部文件是需要file: 来配置的, static-locations默认访问的是类路径下的文件

     

    展开全文
  • VS资源文件和外部依赖项

    千次阅读 2015-03-26 14:44:27
    1、VS资源文件是什么 2、VS外部依赖项是什么 3、VS2012d的MSDN帮助文档的下载外部依赖项:里面显示的文件是你程序中显示包含的头文件所包含的的头文件。比如,你的main函数里面包含了windows.h头文件,而windows.h...

    本文解决的问题:
    1、VS资源文件是什么
    2、VS外部依赖项是什么
    3、VS2012d的MSDN帮助文档的下载

    外部依赖项:里面显示的文件是你程序中显示包含的头文件所包含的的头文件。比如,你的main函数里面包含了windows.h头文件,而windows.h头文件又包含其他头文件,而这些头文件又可能还包含另外的头文件,所有这些都显示在外部依赖项里面。

    资源文件主要是你用到的一些程序代码以外的东西,比如图片之类,或者菜单、工具栏之类的。

    术语“资源文件”可以指若干文件类型,包括:

    程序的资源脚本 (.rc) 文件。
    
    资源模板 (.rct) 文件。
    
    作为独立文件存在的个别资源,如从 .rc 文件引用的位图、图标或光标文件。
    
    由开发环境生成的头文件(如 Resource.h),它从 .rc 文件中引用。
    
    在 其他文件类型(如 .exe、.dll 和 .res 文件)中也可以找到资源。 可以使用项目内的资源和资源文件,并可使用不属于当前项目的资源和资源文件。也可使用不是在 Visual Studio 开发环境中创建的资源文件。例如,您可以:
    
    使用嵌套的和按条件包含的资源文件。
    
    更新现有资源或将其转化成 Visual C++ 格式。
    
    将图形资源导入当前资源文件或从当前资源文件导出。
    
    包含开发环境无法修改的共享或只读标识符(符号)。
    
    在可执行 (.exe) 文件中包含创建当前项目的过程中不需要编辑(或不希望编辑)的资源,如若干项目之间共享的资源。
    
    包含开发环境不支持的资源类型。
    

    VS2012文档下载:
    http://www.microsoft.com/zh-cn/download/details.aspx?id=34794

    展开全文
  • 1.1 外部资源 不论你是什么开发环境,对于开发来说最好的做法就是不要将资源(例如图片等)路径这些整合到代码中。Android支持将这些资源外部化,范围包括一些简单的值,如字符串、颜色和更加复杂的图片资源、主题...

    1.1 外部资源

    不论你是什么开发环境,对于开发来说最好的做法就是不要将资源(例如图片等)路径这些整合到代码中。Android支持将这些资源外部化,范围包括一些简单的值,如字符串、颜色和更加复杂的图片资源、主题和动画。也许最强大的外部资源是布局。

    通过外部资源化,可以让维护、升级和管理变得更加容易,这会让你更加容易定义不同的资源值去支持不同的硬件和国际化。

    接下来你会了解到Andriod是如何为不同的硬件、语言以及位置动态的选择资源。这就需要你去为不同的语言、国家、屏幕以及键盘创建不同的资源。当应用启动后,Android会自动选择资源而不用编写任何代码。

    这样你就可以基于屏幕大小更改布局,并且可以定制基于语言和国家定制提示信息。

    1.1.1 创建资源

    应用的资源都被存储在项目的 res/ 文件夹目录下。在这个文件夹中每种可用的资源类型都被存储在子文件夹下。

    如果你使用ADT插件向导创建一个项目,它会为你创建一个res文件夹,它下边的子文件夹包括valuesdrawable- ldpi,drawable-mdpi,drawable-hdpi,和一个默认的layout布局资源,应用图片和分别定义的string 资源。如图3-4所示。

    注意那三个Drawable资源文件夹创建了三种不同的图标,分别是低、中、高 DPI显示方式。

    九个主要的资源类型有不同的文件夹:simple valuesDrawableslayoutsanimationsstylesmenussearchablesXMLraw resources。当你的应用被打包的时候,这些资源就会尽可能高效的被包含到你应用的package中。

    这个过程也会产生一个R class文件,这个文件引用了项目中的所有资源。这个为你的代码提供了资源的引用以及设计时候的变量检查。

    接下来的部分描述了这些目录中可用的资源类型,以及如何为你的应用创建它们。

    资源文件的命名要遵循以下方式:仅使用小写字母、数字、.和下划线_

    3-4


    Creaing Simple Values

    支持的简单值包括stringscolors,dimensions,string或者integer数组。所有的简单值被存储在res/values文件夹的下的XML文件中。

    每个XML文件中指定了存储的标签的类型值。如图Listing 3-1显示的XML文件

    图 Listing 3-1


    上边这个例子中包含了所有的简单值类型。按照约定俗成的方式来说,每种类型的值都会被分成不同的文件存储。例如,res/values/strings.xml文件只是包含string的资源类型定义。

    接下来的我们会详细介绍定义simple resource的配置项。

    Strings

    外部化你的strings帮助你更好的维护你的应用,并且能让国际化更加简单。

    String 资源被通过<string>标签引用。如下XML片段所示:

       <string name="stop_message">Stop.</string>

    Android支持简单的文本样式,所以你可以使用HTML标签<b><i><u>对你的文本strings去进行加粗,斜体、或者增加下划线,如下XML片段所示:

       <string name="stop_message"><b>Stop.</b></string>

    对于String.format方法,你可以使用资源strings作为输入参数。但是,String.format方法不支持上边描述的文本样式。为了将格式化的文本能使用String.format方法,当你创建资源时你不得不去讲HTML标签转换,如下所示:

       <string name="stop_message"><b>Stop</b>. %1$s</string>

    在你的代码中,使用Html.fromHTML方法去讲这个转换成一个有样式的字符序列。

       String rString = getString(R.string.stop_message);

       String fString = String.format(rString, "Collaborate and listen.");

       CharSequence styledString = Html.fromHtml(fString);

    Colors

    使用<color>标签去定义一个新的color资源。通过使用#符号去指定一个color的值,然后就是将红、绿、蓝值进行组合来描述具体的颜色:

    ·    #RGB

    ·    #RRGGBB

    ·    #ARGB

    ·    #AARRGGBB

    下边的例子展示了如何去指定一个蓝色和渐变绿色的值:

       <color name="opaque_blue">#00F</color>

       <color name="transparent_green">#7700FF00</color>

    Dimensions

    Dimensions(尺寸)是最常见的被引用的资源,一般他们在创建布局的时候用来指定边框的像素和字体高度。

    我们使用<dimen>标签去声明一个dimension资源,指定dimension尺寸值,同时指明一个尺寸的单位值:

    · px (screen pixels)

    · in (physical inches)

    · pt (physical points)

    · mm (physical millimeters)

    · dp (density-independent pixels relative to a 160-dpi screen)

    · sp (scale-independent pixels)

    这些可选项允许你定义不同的尺寸,而不是定义成绝对的大小,我们针对不同的硬件和屏幕可以进行量体裁衣了。

    下边的XML片段展示了如何指定一个大的字体和一个标准边框的尺寸值

       <dimen name="standard_border">5dp</dimen>

       <dimen name="large_font_size">16sp</dimen>

    Styles and Themes

    Style资源通过你为Views指定的属性值保持应用的界面和感受。最常见使用themesstyles的方式就是存储颜色和字体。

    你可以简单的更改你应用的界面,只需要在你项目manifest中简单的指定一个不同的styletheme

    通过一个包含name属性的<style>标签去创建一个style,同时他的内部可以包含一个或者多个<item>标签。每个item标签包含一个name属性用来指定被定义的属性。标签本身应该包含值,如下代码所示:

       <?xml version="1.0" encoding="utf-8"?>

          <resources>

          <style name="StyleName">

             <item name="attributeName">value</item>

          </style>

       </resources>

    Styles支持集成的方式,这个可以通过<style>标签的parent属性指定。这让他更加容易的创建简单的变量。

    下边的例子展示了两个styles能被一个theme使用:一个基本的style设置了几个文本属性,另外一个style修改了那个基本的style,并使其定义的字体变小。

       <?xml version="1.0" encoding="utf-8"?>

       <resources>

          <style name="BaseText">

             <item name="android:textSize">14sp</item>

             <item name="android:textColor">#111</item>

          </style>

          <style name="SmallText" parent="BaseText">

             <item name="android:textSize">8sp</item>

          </style>

       </resources>

    Drawables

    Drawable 资源包括bitmapsNinePatchPNG)图片。他也包含一些更加复杂的组合Drawables,例如LevelListDrawablesStateListDrawables,这些能在XML文件中定义。

    所有的Drawables被存在独立的文件夹res/drawable中,对于一个Drawable资源的标识是一个没有拓展的小写文件名。

    注意:最好的bitmap资源是PNG,虽然GPGGIF文件也会被支持。

    Layout

    Layout资源让你的表现层松耦合,我们可以在XML中定义你的布局而不是在代码中定义。

    最常见layout用法是为一个Activity定义一个用户接口。一旦在XML中定义了,布局会在Activity中通过SetContentView 

    使用,通常这个被包含在onCreate方法中。你也可以从其他的layout资源中引用layouts,例如为每行引用一个List View 

    layout

    使用layout去创建你的展示界面在android中是一个最佳实践。代码与layout松耦合能让你为不同的硬件配置创建最优的

    layout,例如不同的屏幕大小、表现方式、键盘和触摸屏等等。

    每个布局的定义被存储在一个单独的文件中,包含了一个layout,存放在res/layout 文件夹中。文件名会变成这个资源

    的唯一标识。

    针对layout容器和View的完整解释会在下个章节阐述,图Listing 3-2展示了使用项目向导创建的布局信息。他使用了一

    个线性布局作为布局容器,并且包含了一个文本视图展示了“Hello World”的问候信息。

    图 Listing 3-2


    Animations

    Android支持两种类型的动画。Tweened 动画可以被用来旋转,移动、拉伸和隐藏;或者你可以创建帧动画去展示一系列的Drawable图片。深度使用创建和应用动画将会在第15张详细说明。

    把动画定义为外部资源可以让你在多个地方重用相同系列动画,并且给你提供了一个基于不同设备和定位去显示不同的动画。

    Tweened Animations

    每个tweened动画都被以单独文件形式存储在项目的res/anmi文件夹下。就像其他布局和Drawable资源,动画文件的名字会被用作资源的唯一标识。

    动画可以被定义为渐变、所见、移动或者旋转。

    表 Table 3-1 展示了每种动画类型支持的有效属性,属性值

    你可以使用set标签创建一个组合动画。一个动画集合包含一个或者多个动画转换,同时支持多个其他标签和属性供我们设定动画如何去运行。

    下边列表展示了一些可用的标签集合。

      duration:动画运行时间

      startOffset:动画开始前延迟播放时间

      fillBefore:设定为true的时,在动画开始前使用转换

      fillAfter:设定为true时,在动画播放完毕后使用转换

      Interpolator:设定动画播放速度。第十五章的时候我们将深入探讨。需要说明的是,使用系统动画资源要通过android:anim/interpolatorName

    表 table 3-1:动画类型属性:


    注意:如果你设定startOffset标签,一个集合中所有的动画效果都会一起执行。

    下边的例子展示了一个动画设定,当他缩小或者渐变退出的时候旋转360度。

    <?xml version="1.0" encoding="utf-8"?>

    <set xmlns:android="http://schemas.android.com/apk/res/android"

    android:interpolator="@android:anim/accelerate_interpolator">

    <rotate

    android:fromDegrees="0"

    android:toDegrees="360"

    android:pivotX="50%"

    android:pivotY="50%"

    android:startOffset="500"

    android:duration="1000" />

    <scale

    android:fromXScale="1.0"

    android:toXScale="0.0"

    android:fromYScale="1.0"

    android:toYScale="0.0"

    android:pivotX="50%"

    android:pivotY="50%"

    android:startOffset="500"

    android:duration="500" />

    <alpha

    android:fromAlpha="1.0"

    android:toAlpha="0.0"

    android:startOffset="500"

    android:duration="500" />

    </set>

    Frame-by-Frame Animations

    帧动画允许你创建一系列的Drawables,在View的背景中每个都会展示一段时间。

    因为帧动画展现的是存储在res/drawable文件中的动画Drawables,而不是tweened 动画,使用它们的文件名作为资源ID

    下边的XML片段展示了一个简单的循环显示一系列的bitmap资源动画,并且每个展示0.5秒。为了使用这个片段,你需要创建新的图片资源rocket1rocket3.

    <animation-list

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:oneshot="false">

       <item android:drawable="@drawable/rocket1" android:duration="500" />

       <item android:drawable="@drawable/rocket2" android:duration="500" />

       <item android:drawable="@drawable/rocket3" android:duration="500" />

    </animation-list>

    Menus

    创建menu(菜单)资源会进一步分离你的展现层和代码。这样你在设计菜单的布局的时候可以使用XML而不是直接在代码中构造它们。

    Menu资源能被用来定义你应用中的Activitycontext menus,同时你也可以在代码中构造menu项。一旦你在XML定义了,通过MenuInflatorinflate方法menu会被展示到你的应用中,这个一般都在onCreateOptionsMenu方法中调用。在第四章中你可以看到menus的深入探讨。

    每个menu的定义都在res/menu文件中以独立文件的方式存储,每个里边都包含一个menu。文件名会作为资源的标识。使用XML去定义你的menusAndroid中是一个最佳实践。

    一个全方位的阐述menu配置项的说明在下章中被说明,但是 图Listing 3-3 展示一个简单的menu例子。

    图 Listing 3-3


    1.1.2 使用资源

    当你创建完资源的同时,Android提供了一些系统资源,这些你都能在应用中使用。这些资源可以被直接在应用中使用,也可以在其他资源中北引用。

    接下来你将会了解到如何为不同的语言、地区以及硬件定义不同的资源值。有一点你需要知道,使用资源的时候你不能指定某个特定的版本。Android会基于当前硬件和设备的设置去自动的为给定的资源id选择最合适的值。

    在代码中使用资源

    在代码中访问资源可以使用静态类R classR是一个基于你的外部资源的衍生类,当你项目编译的时候被创建。R class针对你已经定义的每种类型的资源对应包含一个静态子类。例如,新创建的项目默认包含R.string R.drawable子类。

    注意:如果你在eclipse中使用ADT插件,当你做任何外部资源的更改时,R  class将会自动的被创建。如果你没有使用插件,只是使用AAPT工具去编译你的项目并产生R classR是一个编译产生的类,所以不要做任何手工的修改,否则当资源文件修改后,他们就会丢失。

    每个R class暴露的子类资源都被认为是变量,变量名和资源标识一一对应。例如:R.string.app_name 或者R.drawable.icon

    这些变量的值是对资源表中的资源位置的一个引用,不是资源实例的本身。

    在一些构造函数或者方法中,例如setContentView,接收一些资源标识,你可以在资源变量中传递,如下代码所示:

    // Inflate a layout resource.

    setContentView(R.layout.main);

    // Display a transient dialog box that displays the

    // error message string resource.

    Toast.makeText(this, R.string.app_error, Toast.LENGTH_LONG).show();

    当你需要资源实例本身,你需要使用helper方法到资源表中抽取他们。在你的应用中,资源表被作为一个Resources class展现。

    因为这些方法的展现基于应用的资源表,这些帮助方法不能是静态的。在你的应用上下文使用getResources方法去访问你应用的资源实例。代码如下:

    Resources myResources = getResources();

    Resources 类包含每个可用资源类型的的getter方法,并且你可以通过传递resource ID获取。下边代码展示了用helper方法去返回一个指定的资源值。

    Resources myResources = getResources();

    CharSequence styledText = myResources.getText(R.string.stop_message);

    Drawable icon = myResources.getDrawable(R.drawable.app_icon);

    int opaqueBlue = myResources.getColor(R.color.opaque_blue);

    float borderWidth = myResources.getDimension(R.dimen.standard_border);

    Animation tranOut;

    tranOut = AnimationUtils.loadAnimation(this, R.anim.spin_shrink_fade);

    String[] stringArray;

    stringArray = myResources.getStringArray(R.array.string_array);

    int[] intArray = myResources.getIntArray(R.array.integer_array);

    帧动画资源被设定为AnimationResources。你可以使用getDrawable获取并且对返回值进行转换。如下代码所示:

    AnimationDrawable rocket;

    rocket = (AnimationDrawable)myResources.getDrawable(R.drawable.frame_by_frame);

    在资源中内部引用资源

    你也可以将资源引用作为属性值放到其他的XML资源中

    这个针对layouts布局和styles风格样式十分有用,允许你针对主题和本地string以及图片创建特定的变量。他也是用来解决不同的屏幕大小和分辨率的最有效的方法。

    引用其他package资源文件中的资源需要使用@标识,如下代码所示。

    attribute="@[packagename:]resourcetype/resourceidentifier"

    备注:Android会假定你正使用同package中的资源,如果你需要使用其他package中的资源,你仅仅需要设定全路径名称。图Listing3-4 展示了一个使用colordimensionstring资源的布局器。

    Listing 3-4


    使用系统资源

    本地原生的Android应用有很多外部化资源,为你提供了stringsimages,动画,styleslayouts在你的应用中使用。

    在代码中访问系统的资源与访问你自己的资源类似。不同的是,你使用原生的Android资源classes是使用android.R类,而不是应用的引用类R。下边的代码展示了应用上下文中使用getString方法从系统资源中获取一个错误信息提示。

    CharSequence httpError = getString(android.R.string.httpErrorBadUrl);

    在XML文件中访问系统资源需要指定Android作为package的名字。如下XML片段所示:

    <EditText

    android:id="@+id/myEditText"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@android:string/httpErrorBadUrl"

    android:textColor="@android:color/darker_gray"

    />

    在当前theme中使用style

    使用themes是一个较好的方法去保证应用UI的流畅。相对于完全定义每一个styleAndroid提供了一个快捷方式让你去使用当前应用的themestyles

    要这样使用需要使用 ?android:而不是标识作为你想使用资源的前缀。下边的例子展示了一个使用当前theme的文本颜色而不是一个外部资源的文本颜色。

    <EditText

    android:id="@+id/myEditText"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/stop_message"

    android:textColor="?android:textColor"

    />

    这个技术让你创建的styles会随着当前theme的改变而变化,不需要你去修改每个style  resource


    1.1.3 资源例子作业

    1.1.4 为不同的语言和硬件创建资源

    外部化资源的一个最令人信服的理由是Android的动态资源选择机制。

    使用下边描述的目录结构,你可以为不同的语言,位置和硬件配置创建不同的资源值。Android将会在运行时动态选择这些值。

    你可以在res文件下通过使用平行的目录结构选择不同的资源值。

    一个(-)连字符被用来区分你提供指定的相关状态信息。

    下边文件夹中的目录结构展示了默认的string值,法语和加拿大法语的变量值的存放方式:

    Project/

       res/

          values/

             strings.xml

          values-fr/

             strings.xml

          values-fr-rCA/

             strings.xml

    下边的列表提供了你可以使用定制的相关资源值

    Mobile Country Code and Mobile Network Code (MCC/MNC):国家和当前设备中的SIM卡的可选择网络。MCC可以通过mcc 加上三个国家代码指定。MNC可以通过mcc加上两个或者三个国家码指定(例如:mcc234-mnc20 or mcc310)。你可以到如下的网站找到MCC/MNC的编码:http://en.wikipedia.org/wiki/Mobile_Network_Code

    · Language and Region:语言可以通过ISO639-1 标准的两个小写字母,配合一个小写的r加上ISO3166-1-ALPHA-2语言编码

    · 指定地区(例如:en,en-rUS,或者en-rGB.

    · Screen Size:可以选择small(HVGA还小)medium(大于HVGA小于VGA),或者large(比VGA大)。

    · Screen Width/Length:特意为宽屏资源设计指定long或者notlong(例如:WVGA longQVGAnotlong)。

    · Screen Width/Length:可以选择portportrait,land(landscape),或者square(square)

    · Screen Pixel Density:以点计算每英寸的像素比重(dpi)。最好的方法是使用ldpi,mdpi或者hdpi去指定low120dpi),medium160dpi),或者high240dpi)。你也可以针对位图资源指定nodpi,这样是在你不想指定支持的准确像素。不像其他的资源类型,Android不需要针对资源的一个精准匹配。当选择合适的文件夹,他就会自动的选择最近的去匹配设备的像素和自动的拓展Drawables的结果。

    · Touchscreen Type:可以选择 notouch,stylus,finger

    · Keyboard Availability:可以选择 keysexposed keyshidden,keyssoft

    · Keyboard Input Type:可以选择 nokeys,qwerty,12key

    · UI Navigation Type:可以选择nonav,dpad,trackball,whell

    你可以为任何资源类型指定多个值,通过一个连接符(-)进行分割。任何组合都是可以被支持的,但是需要有一个先后

    顺序,一次只能有一个被使用。

    下边展示了针对不同的Drawable资源,有效和无效的目录名

    · Valid:

    drawable-en-rUS

    drawable-en-keyshidden

    drawable-long-land-notouch-nokeys

    · Invalid:

    drawable-rUS-en (out of order)

    drawable-rUS-rUK (multiple values for a single qualifier)

    Android在运行时获取资源的时候,他会找到当前可用方法中最匹配的那个。当有一大串的可选资源存在的时候,他会选择一个最匹配的。如果两个资源的匹配度相同,他会基于匹配的顺序选择。

    注意:如果给定的设备上没选中的资源,你的应用访问资源的时候会抛出异常。为了避免这个,最好的方式就是永远为每个资源指定默认值。

    1.1.5 运行时配置变更

    Android是可以通过终止和重启每个应用去加载资源值在运行时更改语言、位置和硬件配置。

    默认设定的行为模式不会总是最方便和最想要的,特别当一些配置变化的时候(例如屏幕分辨率和键盘是否可用)都会发生,就像用户旋转设备或者推出键盘。你需要定制你的应用去感应、检测这些改变,并且做出反馈。

    为了侦听一个Activity在运行时配置的改变,我们可以通过增加一个android:configChange属性到他们的manifest节点,指定配置改变时你想做的处理。

    下边列表描述了配置改变时候你能做的指定:

    · orientation:当屏幕在横竖做旋转的时候

    · keyboardHidden:键盘被展示或者隐藏

    · fontScale:用户改变了字体大小

    · locale:用户改变了语言设置

    · keyboard:键盘类型改变了。例如,电话可以有一个12键的快捷键,也可以变成全键盘

    · touchscreen or navigation:键盘类型或者导航方式发生变化。这些事情都不会正常发生。

    一定情况下,多个事件会同时被触发。例如,当用户推开键盘,很多设备会触发keyboardHiddenorientation 事件。

    你可以选择多个你想处理的时间通过(|)符号进行分割。

    Listing 3-5 展示了一个activity代码声明了他要处理的一些动作,当屏幕旋转或者键盘可见的时候被触发。

    图 Listing 3-5


    增加一个android:configChanges属性禁止特定的配置在重启后变更,而不是在Activity中触发onConfigurationChanged方法。通过覆盖这个方法去处理配置的改变,通过传进来的Configuration对象去确认新的配置值,如图Listing 3-6中显示的那样。确保回调父类的方法重新加载Activity的资源值,以免他们改变。

    Listing 3-6


    onConfigurattionChanged被调用,Activity资源变量值已经更新为最新值,所以他们可以被安全的使用。

    任何你在应用中没声明的配置改变都会导致你的Activity去重启,而不是去调用onConfigurationChanged方法。



    展开全文
  • 最近想自己写一个cms系统,在前台View层展示上,初始版本用jsp,以后用Freemarker优化,包括生成静态页面等。在设计JSP页面时,遇到了最头疼的问题。路径问题。  J2EE学习道路上有两个最为恼火的问题,一是编码...
  • 头文件: 里面是.h文件,包含有函数声明、... 外部依赖项: 不是自己定义,主要包括的是一些外部库 源文件: 主要是.c或.cpp文件,里面包含的是函数实现,变量定义等内容。 资源文件: 图片等程序需要用到的资源 ...
  • Unity 3D--外部加载资源AssetBundles

    千次阅读 2013-04-15 22:01:22
    Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时动态加载,可以指定路径和来源的。其实场景里所有静态的对象也有这么一个加载过程,只是
  • 中url-pattern使用/ ,表示DispatcherServlet处理所有请求,也包括静态资源,这不是我们所希望的。 怎么让DispatcherServlet不去处理静态资源的请求? 方式一:使用web.xml <servlet-name>default *.css ...
  • 1. 将项目打包成JAR包,但是读取资源的时候出错的解决方法:获取class类的根目录的路径:String path =Thread.currentThread().getContextClassLoader().getResource("").getPath();这种情况仅仅适合于资源文件夹...
  • matlab外部接口简介

    千次阅读 2011-09-19 10:47:40
    1、MATLAB外部接口主要包括3部分内容: (1)、MEX文件:外部程序调用接口; MEX文件是MATLAB解释器可以自动加载和运行的动态链接过程,MATLAB可以像调用内部函数一样调用它们。用户通过MEX文件可以完成以下功能: ...
  • 当eclispe java工程中没有引用外部jar包时: 选中工程---->右键,Export...--->Java--->JAR file--->next-->填写jar file的路径及名称-->next-->next---> 填写main class--->finish,然后就在相应的目录下得到jar...
  • C语言中有关外部函数调用的问题

    万次阅读 多人点赞 2016-06-16 21:44:57
    首先指出一点,我们通常所说的编译器并非仅指编译器,确切来说是编译工具链,里面包括了预编译器、编译器、汇编器和连接器。 对于外部函数实体(处于调用函数所在源文件之外的其他源文件中的函数),是在链接过程中...
  • HAWQ技术解析(九) —— 外部数据

    千次阅读 2017-03-23 11:03:51
    HAWQ不但可以读写自身系统中的表,而且能够访问HDFS、Hive、HBase等外部系统的数据。这是通过一个名为PXF的扩展框架实现的。大部分的外部数据是以HAWQ外部表的形式进行访问的,但对于Hive,除外部表方式,PXF还能够...
  • 在Web开发中,我们通过CSS来控制页面元素的样式,一般常用三种方式: ...3. 外部样式表:即写一个独立的.css文件,然后再html页面上引入该文件,然后设置元素的class属性   具体如何操作,这里就不说了。不懂的去百
  • Arduino基础入门篇13—外部中断

    千次阅读 多人点赞 2018-09-03 12:50:36
    本篇介绍Arduino外部中断的使用,通过外部中断检测震动开关的触发来控制LED灯亮灭。
  • html导入外部CCS

    千次阅读 2016-10-24 21:57:36
    一个外部的样式表可以通过HTML的LINK元素连接到HTML文档中: ...层叠样式表--允许浏览器忽略它们...外部样式表不能含有任何像 P { margin: 2em } 组成的文件就可以用作外部样式表了。 screen?(缺省值
  • 时至今日,stata 已经...下面,我们就梳理一下 stata 外部命令的相关资源包括:从哪些地方获取外部命令?哪些外部命令是最常用的,最流行的?哪些是最新发布的?关注一下这些外部命令,可以大幅提高我们的分析效率。
  • Unity资源机制 1、概述  本文意在阐述Unity资源机制相关的信息,以及一些关于个人的理解与试验结果。另外还会提及一些因机制问题可能会出现的异常以及处理建议。大部分机制信息来源于官方文档,另外为自我验证后...
  • getResourceAsStream读取的文件路径只局限与工程的源文件夹中,包括在工程src根目录下,以及类包里面任何位置,但是如果配置文件路径是在除了源文件夹之外的其他文件夹中时,该方法是用不了的。 
  • 闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」; Block是Objective-C对于闭包的实现。 其中,Block: 可以嵌套定义,定义Block方法和定义函数方法相似; Block 可以定义在...
  •  ① 0:系统内存或资源已耗尽。   ② ERROR_BAD_FORMAT:EXE文件无效(非Win32.EXE或.EXE影像错误)。   ③ ERROR_FILE_NOT_FOUND:指定的文件未找到。   ④ ERROR_PATH_NOT_FOUND:指定的路径未找到...
  •  ① 0:系统内存或资源已耗尽。   ② ERROR_BAD_FORMAT:EXE文件无效(非Win32.EXE或.EXE影像错误)。   ③ ERROR_FILE_NOT_FOUND:指定的文件未找到。   ④ ERROR_PATH_NOT_FOUND:指定的路径未...
  • 数据库系统的外部结构

    千次阅读 2016-10-10 20:12:54
    1.5.3 数据库系统的外部体系结构随着计算机体系结构的发展,数据库系统的外部体系结构出现了如下5种结构:单用户结构、主从式结构、分布式结构、客户机/服务器(C/S)结构、浏览器/服务器(B/S)结构。 单用户结构 单...
  • 我只用到了ShellExecute函数,根据下面的示例以及介绍的其中的参数进行了调整,成功实现了对外部exe的调用
  • res里的每一个资源都会在R.java里生成一个对应的Integer类型的id,APP启动时会先把R.java注册到当前的上下文环境,...如何使用插件中的R资源一种解决方式是插件里需要用到的新资源都通过纯Java代码的方式创建(包括XML
  • Email营销是一个广义的概念,既包括企业自行开展建立邮件列表开展的Email营销活动,也包括通过专业服务商投放电子邮件广告。为了进一步说明不同情况下开展Email营销的差别,可按照Email地址的所有权划分为内部Email...
  • VS2013项目添加外部文件

    千次阅读 2018-02-27 17:10:50
    在文件资源管理器中打开文件夹-&gt;将自己需要复制的文件复制文件夹2.点击显示所有文件,会将隐藏得文件显示出来,比如刚复制进来的文件3.右键选中自己复制进来的文件-&gt;包括在项目中...
  • 本文档介绍Android系统其他可定义在代码外部资源,主要包括: Bool型资源: 定义布尔值的XML资源。 Color型资源: 定义颜色值的XML资源(十六进制颜色值)。 Dimension型资源: 定义尺寸的XML资源(带有尺寸...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 345,164
精华内容 138,065
关键字:

外部资源包括