钛预载图像

jam*_*mes 1 titanium titanium-mobile

我想知道Titanium如何处理图像.如果我要在图像视图中加载图像,然后将图像视图中的图像更改为本地图像,然后将图像更改回上一个图像,图像视图是否需要再次下载上一个图像?

不确定Titanium如何处理下载的图像,但我认为它不会缓存它们.

我以为我可以创建一些屏幕外图像并将一些其他图像视图设置为他们的图像网址,但这会有用吗?或者图像视图会下载图像吗?

只是想弄清楚图像视图如何在钛合金中工作,以及确保我可以预加载/重复使用图像的最佳方法.

谢谢

Jef*_*nes 7

2015年4月更新:截至Titanium 3.X,根据Gautier的回答,图像中有缓存


默认情况下,ImageView中没有缓存远程图像.在您的方案中,当您切换回远程图像时,将再次重新加载远程图像.

在我的大多数项目中,我创建了一个cachingImageView,它在下载后保存本地图像.这是受到Dawson Toth在https://gist.github.com/938172上的工作的启发.唯一的问题是,如果服务器上的映像在本地缓存后发生更改,则除非文件名更改,否则客户端不会获取更新的映像.代码如下.

exports.createCachingImageView = function(params) {
    var image = Ti.UI.createImageView();

    image.doRemote = function(imageURL) {
        image.remoteImage = imageURL;
        var file = Ti.Filesystem.getFile(somedirectory, image.localFileName(imageURL));

        if(!file.exists()) {
             // cached file does not exist, load the image
            image.addEventListener("load", image.saveImageOnLoad);
            image.image = imageURL;
        } else {
            Ti.API.debug(image.localFileName(imageURL) + ' does exist, just setting image');
            image.image = file.nativePath;
        }
    };

    image.saveImageOnLoad = function(e) {
        Ti.API.debug('saving image ' + image.localFileName(image.remoteImage));
        var f = Ti.Filesystem.getFile(somedirectory, image.localFileName(image.remoteImage));
        if(!f.read()) {
            f.write(e.source.toBlob());
        }
        e.source.removeEventListener('load', image.saveImageOnLoad);
    };

    image.localFileName = function(imageURL) {
        hashedSource = Ti.Utils.md5HexDigest(imageURL + '');
        return hashedSource;
    };
    if(params.image) {
        image.doRemote(params.image);
    }

    for(var v in params) {
        if(v != 'image') {
            image[v] = params[v];
        }
    }

    return image;
};
Run Code Online (Sandbox Code Playgroud)

如果要在不使用imageView的情况下单独下载映像,请使用Ti.Network.httpClient获取映像并将其保存到文件系统,如下所示:

xhr.onload = function(){    
  var file = Ti.Filesystem.getFile(somedirectory, somefilename );
  file.write(this.responseData);
}
Run Code Online (Sandbox Code Playgroud)

我使用它来提前获取图像,因此当客户端使用它们时它们应该立即获取.