我希望创建一个应用程序,其中半透明图像覆盖在相机预览上。我知道他们在本机Phonegap相机api中不支持这个。我想知道是否有人在编写Phonegap插件方面有一些经验可以给我任何关于这是否可以使用插件的建议。我想我已经看到这种技术可以通过本机代码实现,所以在我看来,可以编写一个Phonegap插件来访问这个功能,我对Phonegap插件没有任何经验。
答案 0 :(得分:7)
我知道,这有点太晚了,但有办法(仅限iPad)。您可以使用标准org.apache.cordova.camera
- 插件。但你必须稍微调整一下
首先将CDVCameraPicker
子类化,以便您可以通过cordova-api切换叠加层:
CDVCameraPicker + Overlay.h:
#import "CDVCamera.h"
@interface CDVCameraPicker (Overlay)
@property (nonatomic, strong) id showOverlay;
@end
CDVCameraPicker + Overlay.m:
#import "CDVCameraPicker+Overlay.h"
#import <objc/runtime.h>
static void *overlayKey;
@implementation CDVCameraPicker (Overlay)
@dynamic showOverlay;
- (void) setShowOverlay:(id)showOverlay {
objc_setAssociatedObject(self, overlayKey, showOverlay, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (id) showOverlay {
return objc_getAssociatedObject(self, overlayKey);
}
@end
然后在检查ImagePickerSourceType(第132行)后立即将这些行添加到CDVCamera.m
if ([cameraPicker.showOverlay intValue] == 1) {
UIImageView *overlay = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 768, 1024)];
overlay.contentMode = UIViewContentModeScaleAspectFill;
overlay.image = [UIImage imageNamed:@"overlay.png"];
}
不要忘记在CDVCamera.m中导入子类CameraPicker
#import "CDVCameraPicker+Overlay.h"
不,你必须编辑Camera.js
- 文件
在其他选项
var showOverlay = getValue(options.showOverlay, false);
然后在最后一个索引处将var
添加到args
- 数组。就是这样。现在,您可以像这样切换叠加层:
navigator.camera.getPicture(onSuccess, onFail, { quality: 40,
destinationType: Camera.DestinationType.FILE_URI,
sourceType: Camera.PictureSourceType.CAMERA,
encodingType: Camera.EncodingType.JPEG,
correctOrientation: true,
saveToPhotoAlbum: true,
showOverlay: false
});
答案 1 :(得分:2)
我尝试了接受的答案,但不幸的是对我不起作用。
相反,我找到了一个更简单的解决方案。在CDVCamera.m
:
+ (instancetype) createFromPictureOptions(CDVPictureOptions*)pictureOptions;{
CDVCameraPicker* cameraPicker = [[CDVCameraPicker alloc] init];
cameraPicker.pictureOptions = pictureOptions;
cameraPicker.sourceType = pictureOptions.sourceType;
cameraPicker.allowsEditing = pictureOptions.allowsEditing;
if (cameraPicker.sourceType == UIImagePickerControllerSourceTypeCamera) {
// More code...
// Here is where you place your overlay.
dispatch_async(dispatch_get_main_queue(), ^{
UIImageView *overlayImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
overlayImage.frame = CGRectMake(0, 0, 768, 1024);
[cameraPicker.cameraOverlayView addSubview:overlayImage];
[cameraPicker setCameraOverlayView:overlayImage];
});
// Code left out for brevity
}
}
使用Grand Central Dispatch执行叠加非常重要。