我对ViewPagers和Camera应用程序进行了大量的文档研究,事实上一切都很好,除了GingerBread上的一个主要问题,我还没有发现有关S.O.的任何问题。所以我会试着问这个...
在我的应用程序中有一个ViewPager(支持库v4),它显示了两个片段: 一,将其称为主片段,即活动开始时显示的片段,向用户显示某些信息,包括最初为空且隐藏的imageview。
通过swyping到下一个片段,用户可以看到摄像机预览,该预览在创建活动时创建(即使在swype之前不显示)和按钮也可以拍照。
拍摄照片时,视图以编程方式返回主片段,即 imageview加载了新照片并取消隐藏,因此用户可以看到图像与其他预先存在的信息混合在一起。
如果用户不喜欢图片,他可以再次回到相机片段并再拍一张,然后一直到他对结果满意为止。
出于这个原因,在回到主片段之前,我调用mCamera.restartPreview()并确保在用户重新调整时相机准备就绪。
Android 4.x上的所有内容都运行得很顺畅,但是当我在2.3.3(API级别10)上测试时,当主片段被回调时,相机预览仍保持在前景中,并隐藏视图。您可以在相机片段显示按钮的屏幕部分中查看甚至滚动视图的其余部分,但其余部分则与相机预览重叠。
以下是相关功能的代码:
CameraFragment onPictureTaken()
private PictureCallback mPicture = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
if (pictureFile == null){
Log.d(TAG, "Error creating media file, check storage permissions: ");
return;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
Log.e(TAG, "FILE " +pictureFile.getAbsoluteFile().toString());
Bitmap bitmap = rotated(data);
bitmap.compress(CompressFormat.JPEG, PICTURE_QUALITY, fos);
bitmap.recycle(); //devo davvero chiamarla esplicitamente ??
mediaFile = pictureFile;
mPreview.restartPreview();
// go back to newpin activity to show it
((NewPinActivity) myActivity).newPin.setMedia(mediaFile.getAbsoluteFile().toString());
((NewPinActivity) myActivity).takeBack();
} catch (FileNotFoundException e) {
Log.d(TAG, "File not found: " + e.getMessage());
}
}
};
和mainfragment takeBack()方法
public void takeBack(){
mViewPager.setCurrentItem(0, true);
String mainFragTag = "android:switcher:"+R.id.newpinpager+":0";
Fragment fragMain = this.getSupportFragmentManager().findFragmentByTag(mainFragTag);
try {
((NewPinMainFragment)fragMain).showPhoto(newPin.getMedia());
} catch (NullPointerException e){
}
}
如果这是ViewPager和GingerBread的问题,或者使用CameraPreview和Gingerbread还是什么,有没有人知道?
答案 0 :(得分:0)
我自己找到了答案,我会在这里发布,以防它对别人有用。
显然问题是由setCurrentItem方法的smoothscroll选项引起的。 通过更改
解决了这个问题mViewPager.setCurrentItem(0, true);
到
mViewPager.setCurrentItem(0, false);