我即将创建一个简单的应用程序,从相机捕捉照片并将其附加到imageView:
视图
<Alloy>
<Window id="wCustomEvent" class="container">
<View layout="vertical" top="100dp">
<Label onClick='readF' id="lien" text='Image path' />
<View id="imageContainer" />
</View>
</Window>
控制器:
function writeToFile(data) {
app = {};
app.writeToFile = function(filedata) {
file = Titanium.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, 'avatar.txt');
if (!file.exists) {
file.createFile();
}
file.write(filedata, false);
Ti.App.fireEvent('datachanged', {
newdata : filedata
});
};
Ti.App.addEventListener('datachanged', function(evt) {
Ti.API.info('datachanged event' + JSON.stringify(evt));
});
//source = evt.source;
//data = source.dataText;
app.writeToFile(data);
}
function readF() {
file = Titanium.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, 'avatar.txt');
if (file.exists) {
var content = file.read();
return content.text;
}
//Ti.App.fireEvent('datachanged', {newdata:'tet'});
}
/* Android Camera */
var win = Titanium.UI.currentWindow;
$.imageContainer.addEventListener("click", function(_event) {
Titanium.Media.showCamera({
success : function(event) {
var image = event.media;
// I TRY TO RESIZE IMAGE HERE
var img = image.imageAsResized(80,80);
Ti.API.debug('Our type was: ' + event.mediaType);
Ti.Media.hideCamera();
if (event.mediaType == Ti.Media.MEDIA_TYPE_PHOTO) {
// THE IMAGE PATH
imagePath = img.nativePath;
/* Write image path to file */
writeToFile(imagePath);
/* Get image path from file */
fichier = readF();
if( $.wCustomEvent.avatarPlaceholder ){
$.wCustomEvent.remove(avatarPlaceholder);
}
var avatar = Ti.UI.createImageView({
id:'avatarPlaceholder',
width: 80,
height:80,
borderRadius:40,
backgroundColor:'red',
image : fichier
});
$.imageContainer.add(avatar);
$.imageContainer.backgroundImage = fichier;
} else {
alert("got the wrong type back =" + event.mediaType);
}
},
cancel : function() {
alert('You canceled the action.');
},
error : function(error) {
// create alert
var a = Titanium.UI.createAlertDialog({
title : 'Camera'
});
// set message
if (error.code == Titanium.Media.NO_CAMERA) {
a.setMessage('Please run this test on device');
} else {
a.setMessage('Unexpected error: ' + error.code);
}
// show alert
a.show();
},
saveToPhotoGallery : false,
showControls : true, // don't show system controls
mediaTypes : Ti.Media.MEDIA_TYPE_PHOTO,
autohide : false
});
});
当我运行它时,我可以拍摄照片,附加到视图但我收到此消息:
art: Throwing OutOfMemoryError "Failed to allocate a 38340876 byte allocation with 7738667 free bytes and 7MB until OOM"
[错误]:TiUIHelper :(主要)[65,159991]无法加载位图。内存不足:无法分配38340876字节分配7738667空闲字节和7MB直到OOM
当我尝试拍摄第二张图像时,它无效。
这里有钛gourou吗?谢谢你的帮助。
答案 0 :(得分:1)
您面临的问题不是Titanium问题,而是Android问题(例如:Android:java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free bytes and 2MB until OOM)。
Android会将图像作为位图加载,需要根据图像分辨率(图像大小)分配内存 - 对于真正的大图像 - 它不能 - 并且实际上不需要按顺序在屏幕上显示它们。因此,为了显示图像需要做的是在显示图像之前使它们变小 - 而ImageView控件将为您做到这一点。
您正在尝试将图片显示为backgroundImage
控件的View
。相反,请使用ImageView
并将其设置为image
属性。