files=FileOperateUtil.listFiles(thumbFolder, ".jpg");
if(files!=null&&files.size()>0){
Bitmap thumbBitmap=BitmapFactory.decodeFile(files.get(0).getAbsolutePath());
if(thumbBitmap!=null){
mThumbView.setImageBitmap(thumbBitmap);
- //Ƶͼʾͼ
+ //视频缩略图显示播放图案
if(files.get(0).getAbsolutePath().contains("video")){
mVideoIconView.setVisibility(View.VISIBLE);
}else {
@@ -109,16 +106,28 @@ private void initThumbnail() {
@Override
public void onClick(View view) {
- // TODO Auto-generated method stub
switch (view.getId()) {
- case R.id.btn_shutter_camera:
- mCameraShutterButton.setClickable(false);
- mContainer.takePicture(this);
+ case R.id.btn_shutter_camera://拍照按钮
+ if(!mCameraShutterButton.isSelected()){
+ mCameraShutterButton.setClickable(false);
+ mCameraShutterButton.setEnabled(false);
+ mContainer.takePicture(this);//拍摄监听
+ }else{
+ if(!isRecording){
+ isRecording=mContainer.startRecord();
+// if (isRecording) {
+// mRecordShutterButton.setBackgroundResource(R.drawable.btn_shutter_recording);
+// }
+ }else {
+ stopRecord();
+ }
+ }
+
break;
- case R.id.btn_thumbnail:
+ case R.id.btn_thumbnail://相册
startActivity(new Intent(this,AlbumAty.class));
break;
- case R.id.btn_flash_mode:
+ case R.id.btn_flash_mode://闪光灯控制
if(mContainer.getFlashMode()==FlashMode.ON){
mContainer.setFlashMode(FlashMode.OFF);
mFlashView.setImageResource(R.drawable.btn_flash_off);
@@ -138,9 +147,11 @@ else if (mContainer.getFlashMode()==FlashMode.TORCH) {
case R.id.btn_switch_mode:
if(mIsRecordMode){
mSwitchModeButton.setImageResource(R.drawable.ic_switch_camera);
- mCameraShutterButton.setVisibility(View.VISIBLE);
- mRecordShutterButton.setVisibility(View.GONE);
- //ģʽʾ˵
+ mCameraShutterButton.setSelected(false);
+ mCameraShutterButton.setEnabled(false);
+// mCameraShutterButton.setVisibility(View.VISIBLE);
+// mRecordShutterButton.setVisibility(View.GONE);
+ //拍照模式下显示顶部菜单
mHeaderBar.setVisibility(View.VISIBLE);
mIsRecordMode=false;
mContainer.switchMode(0);
@@ -148,28 +159,30 @@ else if (mContainer.getFlashMode()==FlashMode.TORCH) {
}
else {
mSwitchModeButton.setImageResource(R.drawable.ic_switch_video);
- mCameraShutterButton.setVisibility(View.GONE);
- mRecordShutterButton.setVisibility(View.VISIBLE);
- //¼ģʽض˵
+ mCameraShutterButton.setSelected(true);
+ mCameraShutterButton.setEnabled(true);
+// mCameraShutterButton.setVisibility(View.GONE);
+// mRecordShutterButton.setVisibility(View.VISIBLE);
+ //录像模式下隐藏顶部菜单
mHeaderBar.setVisibility(View.GONE);
mIsRecordMode=true;
mContainer.switchMode(5);
}
break;
- case R.id.btn_shutter_record:
- if(!isRecording){
- isRecording=mContainer.startRecord();
- if (isRecording) {
- mRecordShutterButton.setBackgroundResource(R.drawable.btn_shutter_recording);
- }
- }else {
- stopRecord();
- }
- break;
- case R.id.btn_switch_camera:
+// case R.id.btn_shutter_record:
+// if(!isRecording){
+// isRecording=mContainer.startRecord();
+// if (isRecording) {
+// mRecordShutterButton.setBackgroundResource(R.drawable.btn_shutter_recording);
+// }
+// }else {
+// stopRecord();
+// }
+// break;
+ case R.id.btn_switch_camera://相机反转
mContainer.switchCamera();
break;
- case R.id.btn_other_setting:
+ case R.id.btn_other_setting://添加水印
mContainer.setWaterMark();
break;
default:
@@ -181,18 +194,19 @@ else if (mContainer.getFlashMode()==FlashMode.TORCH) {
private void stopRecord() {
mContainer.stopRecord(this);
isRecording=false;
- mRecordShutterButton.setBackgroundResource(R.drawable.btn_shutter_record);
+// mRecordShutterButton.setBackgroundResource(R.drawable.btn_shutter_record);
}
@Override
public void onTakePictureEnd(Bitmap thumBitmap) {
- mCameraShutterButton.setClickable(true);
+ mCameraShutterButton.setClickable(true);
+ mCameraShutterButton.setEnabled(true);
}
@Override
public void onAnimtionEnd(Bitmap bm,boolean isVideo) {
if(bm!=null){
- //ͼ
+ //生成缩略图
Bitmap thumbnail=ThumbnailUtils.extractThumbnail(bm, 213, 213);
mThumbView.setImageBitmap(thumbnail);
if(isVideo)
diff --git a/CameraLibrary/bin/cameralibrary.jar b/CameraLibrary/bin/cameralibrary.jar
index 19ae77e..b981159 100644
Binary files a/CameraLibrary/bin/cameralibrary.jar and b/CameraLibrary/bin/cameralibrary.jar differ
diff --git a/CameraLibrary/bin/classes/com/linj/FileOperateUtil$1.class b/CameraLibrary/bin/classes/com/linj/FileOperateUtil$1.class
index 69bd94a..90c7d9d 100644
Binary files a/CameraLibrary/bin/classes/com/linj/FileOperateUtil$1.class and b/CameraLibrary/bin/classes/com/linj/FileOperateUtil$1.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/FileOperateUtil$2.class b/CameraLibrary/bin/classes/com/linj/FileOperateUtil$2.class
index 22673a6..995d824 100644
Binary files a/CameraLibrary/bin/classes/com/linj/FileOperateUtil$2.class and b/CameraLibrary/bin/classes/com/linj/FileOperateUtil$2.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/FileOperateUtil.class b/CameraLibrary/bin/classes/com/linj/FileOperateUtil.class
index f8410dc..e28e2da 100644
Binary files a/CameraLibrary/bin/classes/com/linj/FileOperateUtil.class and b/CameraLibrary/bin/classes/com/linj/FileOperateUtil.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/album/view/AlbumGridView$AlbumViewAdapter.class b/CameraLibrary/bin/classes/com/linj/album/view/AlbumGridView$AlbumViewAdapter.class
index 37837a1..efcc135 100644
Binary files a/CameraLibrary/bin/classes/com/linj/album/view/AlbumGridView$AlbumViewAdapter.class and b/CameraLibrary/bin/classes/com/linj/album/view/AlbumGridView$AlbumViewAdapter.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/album/view/AlbumGridView$OnCheckedChangeListener.class b/CameraLibrary/bin/classes/com/linj/album/view/AlbumGridView$OnCheckedChangeListener.class
index ce3a119..101aa06 100644
Binary files a/CameraLibrary/bin/classes/com/linj/album/view/AlbumGridView$OnCheckedChangeListener.class and b/CameraLibrary/bin/classes/com/linj/album/view/AlbumGridView$OnCheckedChangeListener.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/album/view/AlbumGridView.class b/CameraLibrary/bin/classes/com/linj/album/view/AlbumGridView.class
index 78c0920..bab59b6 100644
Binary files a/CameraLibrary/bin/classes/com/linj/album/view/AlbumGridView.class and b/CameraLibrary/bin/classes/com/linj/album/view/AlbumGridView.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/album/view/AlbumViewPager$OnPlayVideoListener.class b/CameraLibrary/bin/classes/com/linj/album/view/AlbumViewPager$OnPlayVideoListener.class
index d7ba22d..a9cbe82 100644
Binary files a/CameraLibrary/bin/classes/com/linj/album/view/AlbumViewPager$OnPlayVideoListener.class and b/CameraLibrary/bin/classes/com/linj/album/view/AlbumViewPager$OnPlayVideoListener.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/album/view/AlbumViewPager$ViewPagerAdapter$1.class b/CameraLibrary/bin/classes/com/linj/album/view/AlbumViewPager$ViewPagerAdapter$1.class
index e82fcc6..c8d14a6 100644
Binary files a/CameraLibrary/bin/classes/com/linj/album/view/AlbumViewPager$ViewPagerAdapter$1.class and b/CameraLibrary/bin/classes/com/linj/album/view/AlbumViewPager$ViewPagerAdapter$1.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/album/view/AlbumViewPager$ViewPagerAdapter.class b/CameraLibrary/bin/classes/com/linj/album/view/AlbumViewPager$ViewPagerAdapter.class
index 350f6f7..eec2b1e 100644
Binary files a/CameraLibrary/bin/classes/com/linj/album/view/AlbumViewPager$ViewPagerAdapter.class and b/CameraLibrary/bin/classes/com/linj/album/view/AlbumViewPager$ViewPagerAdapter.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/album/view/AlbumViewPager.class b/CameraLibrary/bin/classes/com/linj/album/view/AlbumViewPager.class
index 709d26d..6bb88ef 100644
Binary files a/CameraLibrary/bin/classes/com/linj/album/view/AlbumViewPager.class and b/CameraLibrary/bin/classes/com/linj/album/view/AlbumViewPager.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/album/view/FilterImageView.class b/CameraLibrary/bin/classes/com/linj/album/view/FilterImageView.class
index 3e53cac..bede65c 100644
Binary files a/CameraLibrary/bin/classes/com/linj/album/view/FilterImageView.class and b/CameraLibrary/bin/classes/com/linj/album/view/FilterImageView.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$1.class b/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$1.class
index 3b943c1..13afd06 100644
Binary files a/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$1.class and b/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$1.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$GestureListener.class b/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$GestureListener.class
index e9c0629..dee3649 100644
Binary files a/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$GestureListener.class and b/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$GestureListener.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$MatrixTouchListener.class b/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$MatrixTouchListener.class
index d0aaeb5..8c4b358 100644
Binary files a/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$MatrixTouchListener.class and b/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$MatrixTouchListener.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$OnMovingListener.class b/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$OnMovingListener.class
index e05124e..d1b5749 100644
Binary files a/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$OnMovingListener.class and b/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$OnMovingListener.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$OnSingleTapListener.class b/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$OnSingleTapListener.class
index 98a4cb1..430ad2f 100644
Binary files a/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$OnSingleTapListener.class and b/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView$OnSingleTapListener.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView.class b/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView.class
index 8cd02aa..6c2b6af 100644
Binary files a/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView.class and b/CameraLibrary/bin/classes/com/linj/album/view/MatrixImageView.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/album/view/ThumbnaiImageView$ViewHolder.class b/CameraLibrary/bin/classes/com/linj/album/view/ThumbnaiImageView$ViewHolder.class
index 657b1d8..d5a260b 100644
Binary files a/CameraLibrary/bin/classes/com/linj/album/view/ThumbnaiImageView$ViewHolder.class and b/CameraLibrary/bin/classes/com/linj/album/view/ThumbnaiImageView$ViewHolder.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/album/view/ThumbnaiImageView.class b/CameraLibrary/bin/classes/com/linj/album/view/ThumbnaiImageView.class
index 71423f9..0fd4fb2 100644
Binary files a/CameraLibrary/bin/classes/com/linj/album/view/ThumbnaiImageView.class and b/CameraLibrary/bin/classes/com/linj/album/view/ThumbnaiImageView.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$1.class b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$1.class
index 44c6f29..94bbb05 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$1.class and b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$1.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$2$1.class b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$2$1.class
index 5b1420d..d286534 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$2$1.class and b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$2$1.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$2.class b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$2.class
index cdf9111..a38050e 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$2.class and b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$2.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$3.class b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$3.class
index 9917784..fe6a47b 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$3.class and b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$3.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$4.class b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$4.class
index 14edc2c..1aea3cb 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$4.class and b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$4.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$DataHandler.class b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$DataHandler.class
index 7549599..cc323cb 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$DataHandler.class and b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$DataHandler.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$TakePictureListener.class b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$TakePictureListener.class
index 0be973e..38f6fb3 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$TakePictureListener.class and b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$TakePictureListener.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$TouchListener$1.class b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$TouchListener$1.class
index 362b9bd..6e60367 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$TouchListener$1.class and b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$TouchListener$1.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$TouchListener.class b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$TouchListener.class
index 109176d..0c94536 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$TouchListener.class and b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer$TouchListener.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer.class b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer.class
index 5d88a64..9c51233 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer.class and b/CameraLibrary/bin/classes/com/linj/camera/view/CameraContainer.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/CameraOperation.class b/CameraLibrary/bin/classes/com/linj/camera/view/CameraOperation.class
index 8af33df..952cb97 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/CameraOperation.class and b/CameraLibrary/bin/classes/com/linj/camera/view/CameraOperation.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/CameraView$1.class b/CameraLibrary/bin/classes/com/linj/camera/view/CameraView$1.class
index 78839e1..e0b6abd 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/CameraView$1.class and b/CameraLibrary/bin/classes/com/linj/camera/view/CameraView$1.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/CameraView$2.class b/CameraLibrary/bin/classes/com/linj/camera/view/CameraView$2.class
index e57e6f1..c800371 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/CameraView$2.class and b/CameraLibrary/bin/classes/com/linj/camera/view/CameraView$2.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/CameraView$FlashMode.class b/CameraLibrary/bin/classes/com/linj/camera/view/CameraView$FlashMode.class
index 2555025..440cf85 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/CameraView$FlashMode.class and b/CameraLibrary/bin/classes/com/linj/camera/view/CameraView$FlashMode.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/CameraView.class b/CameraLibrary/bin/classes/com/linj/camera/view/CameraView.class
index 4f2def4..8e5abe4 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/CameraView.class and b/CameraLibrary/bin/classes/com/linj/camera/view/CameraView.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/FocusImageView$1.class b/CameraLibrary/bin/classes/com/linj/camera/view/FocusImageView$1.class
index a79a378..0ccd884 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/FocusImageView$1.class and b/CameraLibrary/bin/classes/com/linj/camera/view/FocusImageView$1.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/FocusImageView$2.class b/CameraLibrary/bin/classes/com/linj/camera/view/FocusImageView$2.class
index 6ca6fe0..21163b7 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/FocusImageView$2.class and b/CameraLibrary/bin/classes/com/linj/camera/view/FocusImageView$2.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/FocusImageView$3.class b/CameraLibrary/bin/classes/com/linj/camera/view/FocusImageView$3.class
index bf64d2d..065700f 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/FocusImageView$3.class and b/CameraLibrary/bin/classes/com/linj/camera/view/FocusImageView$3.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/FocusImageView.class b/CameraLibrary/bin/classes/com/linj/camera/view/FocusImageView.class
index 84018bc..6a1b8b0 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/FocusImageView.class and b/CameraLibrary/bin/classes/com/linj/camera/view/FocusImageView.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/camera/view/TempImageView.class b/CameraLibrary/bin/classes/com/linj/camera/view/TempImageView.class
index deb52e7..244f884 100644
Binary files a/CameraLibrary/bin/classes/com/linj/camera/view/TempImageView.class and b/CameraLibrary/bin/classes/com/linj/camera/view/TempImageView.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/cameralibrary/BuildConfig.class b/CameraLibrary/bin/classes/com/linj/cameralibrary/BuildConfig.class
index 5d511ca..c827b89 100644
Binary files a/CameraLibrary/bin/classes/com/linj/cameralibrary/BuildConfig.class and b/CameraLibrary/bin/classes/com/linj/cameralibrary/BuildConfig.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$anim.class b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$anim.class
index 104a5c5..ff27f73 100644
Binary files a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$anim.class and b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$anim.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$attr.class b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$attr.class
index 85d0a97..f24e91a 100644
Binary files a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$attr.class and b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$attr.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$color.class b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$color.class
index c974a07..b08bbab 100644
Binary files a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$color.class and b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$color.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$dimen.class b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$dimen.class
index f01679e..2163a09 100644
Binary files a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$dimen.class and b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$dimen.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$drawable.class b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$drawable.class
index f92871e..f0c031a 100644
Binary files a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$drawable.class and b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$drawable.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$id.class b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$id.class
index 1c9286e..e424971 100644
Binary files a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$id.class and b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$id.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$layout.class b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$layout.class
index 10cd88e..bcb1a77 100644
Binary files a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$layout.class and b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$layout.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$menu.class b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$menu.class
index 08bd52c..d59b736 100644
Binary files a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$menu.class and b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$menu.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$string.class b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$string.class
index 0b11d56..c92e1da 100644
Binary files a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$string.class and b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$string.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$style.class b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$style.class
index 38a1bdb..e9ed8c9 100644
Binary files a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$style.class and b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$style.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$styleable.class b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$styleable.class
index 3772330..cfa5049 100644
Binary files a/CameraLibrary/bin/classes/com/linj/cameralibrary/R$styleable.class and b/CameraLibrary/bin/classes/com/linj/cameralibrary/R$styleable.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/cameralibrary/R.class b/CameraLibrary/bin/classes/com/linj/cameralibrary/R.class
index 4555b53..c299a41 100644
Binary files a/CameraLibrary/bin/classes/com/linj/cameralibrary/R.class and b/CameraLibrary/bin/classes/com/linj/cameralibrary/R.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/imageloader/DisplayImageOptions$Builder.class b/CameraLibrary/bin/classes/com/linj/imageloader/DisplayImageOptions$Builder.class
index 20ba1ee..e97d7c7 100644
Binary files a/CameraLibrary/bin/classes/com/linj/imageloader/DisplayImageOptions$Builder.class and b/CameraLibrary/bin/classes/com/linj/imageloader/DisplayImageOptions$Builder.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/imageloader/DisplayImageOptions.class b/CameraLibrary/bin/classes/com/linj/imageloader/DisplayImageOptions.class
index e8ebdb3..a5ae01a 100644
Binary files a/CameraLibrary/bin/classes/com/linj/imageloader/DisplayImageOptions.class and b/CameraLibrary/bin/classes/com/linj/imageloader/DisplayImageOptions.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/imageloader/DownloadImgUtils.class b/CameraLibrary/bin/classes/com/linj/imageloader/DownloadImgUtils.class
index aefed1b..3154ff2 100644
Binary files a/CameraLibrary/bin/classes/com/linj/imageloader/DownloadImgUtils.class and b/CameraLibrary/bin/classes/com/linj/imageloader/DownloadImgUtils.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$1.class b/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$1.class
index b7fe02c..809ae3e 100644
Binary files a/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$1.class and b/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$1.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$2.class b/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$2.class
index 9f8e477..53430d6 100644
Binary files a/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$2.class and b/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$2.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$3.class b/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$3.class
index 63f77af..68646d1 100644
Binary files a/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$3.class and b/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$3.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$4.class b/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$4.class
index 88ef5a0..99c3bff 100644
Binary files a/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$4.class and b/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$4.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$ImgBeanHolder.class b/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$ImgBeanHolder.class
index e7b15f6..3a9d098 100644
Binary files a/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$ImgBeanHolder.class and b/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$ImgBeanHolder.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$Type.class b/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$Type.class
index bb6e3b2..be7a8ad 100644
Binary files a/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$Type.class and b/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader$Type.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader.class b/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader.class
index 8604179..0aa4971 100644
Binary files a/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader.class and b/CameraLibrary/bin/classes/com/linj/imageloader/ImageLoader.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/imageloader/ImageSizeUtil$ImageSize.class b/CameraLibrary/bin/classes/com/linj/imageloader/ImageSizeUtil$ImageSize.class
index b959797..d6a9bae 100644
Binary files a/CameraLibrary/bin/classes/com/linj/imageloader/ImageSizeUtil$ImageSize.class and b/CameraLibrary/bin/classes/com/linj/imageloader/ImageSizeUtil$ImageSize.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/imageloader/ImageSizeUtil.class b/CameraLibrary/bin/classes/com/linj/imageloader/ImageSizeUtil.class
index 8c33b1c..2a6ba3b 100644
Binary files a/CameraLibrary/bin/classes/com/linj/imageloader/ImageSizeUtil.class and b/CameraLibrary/bin/classes/com/linj/imageloader/ImageSizeUtil.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/imageloader/displayer/BitmapDisplayer.class b/CameraLibrary/bin/classes/com/linj/imageloader/displayer/BitmapDisplayer.class
index bf91af6..76f189f 100644
Binary files a/CameraLibrary/bin/classes/com/linj/imageloader/displayer/BitmapDisplayer.class and b/CameraLibrary/bin/classes/com/linj/imageloader/displayer/BitmapDisplayer.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/imageloader/displayer/MatrixBitmapDisplayer.class b/CameraLibrary/bin/classes/com/linj/imageloader/displayer/MatrixBitmapDisplayer.class
index 6c2fe45..493d659 100644
Binary files a/CameraLibrary/bin/classes/com/linj/imageloader/displayer/MatrixBitmapDisplayer.class and b/CameraLibrary/bin/classes/com/linj/imageloader/displayer/MatrixBitmapDisplayer.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/imageloader/displayer/RoundedBitmapDisplayer$RoundedDrawable.class b/CameraLibrary/bin/classes/com/linj/imageloader/displayer/RoundedBitmapDisplayer$RoundedDrawable.class
index 8b37bdd..e3ca3b4 100644
Binary files a/CameraLibrary/bin/classes/com/linj/imageloader/displayer/RoundedBitmapDisplayer$RoundedDrawable.class and b/CameraLibrary/bin/classes/com/linj/imageloader/displayer/RoundedBitmapDisplayer$RoundedDrawable.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/imageloader/displayer/RoundedBitmapDisplayer.class b/CameraLibrary/bin/classes/com/linj/imageloader/displayer/RoundedBitmapDisplayer.class
index eee5e8e..8bb882b 100644
Binary files a/CameraLibrary/bin/classes/com/linj/imageloader/displayer/RoundedBitmapDisplayer.class and b/CameraLibrary/bin/classes/com/linj/imageloader/displayer/RoundedBitmapDisplayer.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerContainer$1.class b/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerContainer$1.class
index 6ca5291..b84c3a2 100644
Binary files a/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerContainer$1.class and b/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerContainer$1.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerContainer$2.class b/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerContainer$2.class
index 7fa7015..33af7f4 100644
Binary files a/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerContainer$2.class and b/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerContainer$2.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerContainer.class b/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerContainer.class
index 7cf70eb..c06acc6 100644
Binary files a/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerContainer.class and b/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerContainer.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerOperation.class b/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerOperation.class
index 8e7c543..a764541 100644
Binary files a/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerOperation.class and b/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerOperation.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerView$1.class b/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerView$1.class
index 443874e..5843e5f 100644
Binary files a/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerView$1.class and b/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerView$1.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerView$PlayerListener.class b/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerView$PlayerListener.class
index 6f403ef..7632d2e 100644
Binary files a/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerView$PlayerListener.class and b/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerView$PlayerListener.class differ
diff --git a/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerView.class b/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerView.class
index 5e6a501..e95500c 100644
Binary files a/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerView.class and b/CameraLibrary/bin/classes/com/linj/video/view/VideoPlayerView.class differ
diff --git a/CameraLibrary/bin/res/crunch/drawable-hdpi/focus_focus_failed.9.png b/CameraLibrary/bin/res/crunch/drawable-hdpi/focus_focus_failed.9.png
index 5642580..19035f2 100644
Binary files a/CameraLibrary/bin/res/crunch/drawable-hdpi/focus_focus_failed.9.png and b/CameraLibrary/bin/res/crunch/drawable-hdpi/focus_focus_failed.9.png differ
diff --git a/CameraLibrary/bin/res/crunch/drawable-hdpi/focus_focused.9.png b/CameraLibrary/bin/res/crunch/drawable-hdpi/focus_focused.9.png
index 9944fe6..55f5a34 100644
Binary files a/CameraLibrary/bin/res/crunch/drawable-hdpi/focus_focused.9.png and b/CameraLibrary/bin/res/crunch/drawable-hdpi/focus_focused.9.png differ
diff --git a/CameraLibrary/bin/res/crunch/drawable-hdpi/focus_focusing.9.png b/CameraLibrary/bin/res/crunch/drawable-hdpi/focus_focusing.9.png
index d84bdda..af0b80e 100644
Binary files a/CameraLibrary/bin/res/crunch/drawable-hdpi/focus_focusing.9.png and b/CameraLibrary/bin/res/crunch/drawable-hdpi/focus_focusing.9.png differ
diff --git a/CameraLibrary/gen/com/linj/cameralibrary/R.java b/CameraLibrary/gen/com/linj/cameralibrary/R.java
index c40bde1..eda9723 100644
--- a/CameraLibrary/gen/com/linj/cameralibrary/R.java
+++ b/CameraLibrary/gen/com/linj/cameralibrary/R.java
@@ -226,7 +226,7 @@ theme attribute (in the form
containing a value of this type.
@attr name com.linj.cameralibrary:focus_fail_id
*/
- public static final int FocusImageView_focus_fail_id = 2;
+ public static int FocusImageView_focus_fail_id = 2;
/**
This symbol is the offset where the {@link com.linj.cameralibrary.R.attr#focus_focusing_id}
attribute's value can be found in the {@link #FocusImageView} array.
@@ -240,7 +240,7 @@ theme attribute (in the form
containing a value of this type.
@attr name com.linj.cameralibrary:focus_focusing_id
*/
- public static final int FocusImageView_focus_focusing_id = 0;
+ public static int FocusImageView_focus_focusing_id = 0;
/**
This symbol is the offset where the {@link com.linj.cameralibrary.R.attr#focus_success_id}
attribute's value can be found in the {@link #FocusImageView} array.
@@ -254,7 +254,7 @@ theme attribute (in the form
containing a value of this type.
@attr name com.linj.cameralibrary:focus_success_id
*/
- public static final int FocusImageView_focus_success_id = 1;
+ public static int FocusImageView_focus_success_id = 1;
/** Attributes that can be used with a TempImageView.
Includes the following attributes:
@@ -281,6 +281,6 @@ theme attribute (in the form
containing a value of this type.
@attr name com.linj.cameralibrary:animat_id
*/
- public static final int TempImageView_animat_id = 0;
+ public static int TempImageView_animat_id = 0;
};
}
diff --git a/CameraLibrary/res/layout-port/cameracontainer.xml b/CameraLibrary/res/layout-port/cameracontainer.xml
index 91e2aa4..c71f7ce 100644
--- a/CameraLibrary/res/layout-port/cameracontainer.xml
+++ b/CameraLibrary/res/layout-port/cameracontainer.xml
@@ -40,8 +40,6 @@
android:id="@+id/waterMark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_alignParentRight="true"
android:src="@drawable/thumb_guide_tips_new"
android:visibility="gone" />
diff --git a/CameraLibrary/src/com/linj/FileOperateUtil.java b/CameraLibrary/src/com/linj/FileOperateUtil.java
index 401e62f..1b68442 100644
--- a/CameraLibrary/src/com/linj/FileOperateUtil.java
+++ b/CameraLibrary/src/com/linj/FileOperateUtil.java
@@ -1,10 +1,7 @@
package com.linj;
import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.FilenameFilter;
-import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -15,45 +12,72 @@
import java.util.List;
import java.util.Locale;
-import com.linj.cameralibrary.R;
-
-import android.app.Activity;
import android.content.Context;
-import android.os.Environment;
+import android.text.TextUtils;
+
+import com.linj.cameralibrary.R;
/**
* @ClassName: FileOperateUtil
- * @Description: ļ
+ * @Description: 文件操作工具类
* @author LinJ
- * @date 2014-12-31 9:44:38
+ * @date 2014-12-31 上午9:44:38
*
*/
public class FileOperateUtil {
public final static String TAG="FileOperateUtil";
- public final static int ROOT=0;//Ŀ¼
- public final static int TYPE_IMAGE=1;//ͼƬ
- public final static int TYPE_THUMBNAIL=2;//ͼ
- public final static int TYPE_VIDEO=3;//Ƶ
+ public final static int ROOT=0;//根目录
+ public final static int TYPE_IMAGE=1;//图片
+ public final static int TYPE_THUMBNAIL=2;//缩略图
+ public final static int TYPE_VIDEO=3;//视频
/**
- *ȡļ·
- * @param type ļ
- * @param rootPath Ŀ¼ļ Ϊҵˮ
+ *获取文件夹路径
+ * @param type 文件夹类别
+ * @param rootPath 根目录文件夹名字 为业务流水号
* @return
*/
- public static String getFolderPath(Context context,int type,String rootPath) {
- //ҵļĿ¼
+ public static String getExternalFolderPath(Context context,int type,String rootPath) {
+ //本业务文件主目录
StringBuilder pathBuilder=new StringBuilder();
- //Ӧô洢·
+ //添加应用存储路径
pathBuilder.append(context.getExternalFilesDir(null).getAbsolutePath());
pathBuilder.append(File.separator);
- //ļĿ¼
+ //添加文件总目录
pathBuilder.append(context.getString(R.string.Files));
pathBuilder.append(File.separator);
- //ӵȻļ·
- pathBuilder.append(rootPath);
- pathBuilder.append(File.separator);
+ //添加当然文件类别的路径
+ if(!TextUtils.isEmpty(rootPath)){
+ pathBuilder.append(rootPath);
+ pathBuilder.append(File.separator);
+ }
+ switch (type) {
+ case TYPE_IMAGE:
+ pathBuilder.append(context.getString(R.string.Image));
+ break;
+ case TYPE_VIDEO:
+ pathBuilder.append(context.getString(R.string.Video));
+ break;
+ case TYPE_THUMBNAIL:
+ pathBuilder.append(context.getString(R.string.Thumbnail));
+ break;
+ default:
+ break;
+ }
+ return pathBuilder.toString();
+ }
+ public static String getFolderPath(Context context,int type,String rootPath) {
+ if(TextUtils.isEmpty(rootPath)){
+ return getExternalFolderPath(context, type, rootPath);
+ }
+ //本业务文件主目录
+ StringBuilder pathBuilder=new StringBuilder();
+ //添加当然文件类别的路径
+ if(!TextUtils.isEmpty(rootPath)){
+ pathBuilder.append(rootPath);
+ pathBuilder.append(File.separator);
+ }
switch (type) {
case TYPE_IMAGE:
pathBuilder.append(context.getString(R.string.Image));
@@ -71,10 +95,10 @@ public static String getFolderPath(Context context,int type,String rootPath) {
}
/**
- * ȡĿļָļ,
- * @param file Ŀļ·
- * @param extension ָ
- * @param content ,ԲƵͼ
+ * 获取目标文件夹内指定后缀名的文件数组,按照修改日期排序
+ * @param file 目标文件夹路径
+ * @param extension 指定后缀名
+ * @param content 包含的内容,用以查找视频缩略图
* @return
*/
public static List listFiles(String file,final String format,String content){
@@ -84,10 +108,10 @@ public static List listFiles(String file,final String format){
return listFiles(new File(file), format,null);
}
/**
- * ȡĿļָļ,
- * @param file Ŀļ
- * @param extension ָ
- * @param content ,ԲƵͼ
+ * 获取目标文件夹内指定后缀名的文件数组,按照修改日期排序
+ * @param file 目标文件夹
+ * @param extension 指定后缀名
+ * @param content 包含的内容,用以查找视频缩略图
* @return
*/
public static List listFiles(File file,final String extension,final String content){
@@ -115,12 +139,12 @@ public boolean accept(File arg0, String arg1) {
}
/**
- * ʱΪļб
- * @param list ļб
- * @param asc Ƿ trueΪ falseΪ
+ * 根据修改时间为文件列表排序
+ * @param list 排序的文件列表
+ * @param asc 是否升序排序 true为升序 false为降序
*/
public static void sortList(List list,final boolean asc){
- //
+ //按修改日期排序
Collections.sort(list, new Comparator() {
public int compare(File file, File newFile) {
if (file.lastModified() > newFile.lastModified()) {
@@ -145,62 +169,62 @@ public int compare(File file, File newFile) {
/**
*
- * @param extension ".jpg"
+ * @param extension 后缀名 如".jpg"
* @return
*/
public static String createFileNmae(String extension){
DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss",Locale.getDefault());
- // תΪַ
+ // 转换为字符串
String formatDate = format.format(new Date());
- //鿴Ƿ"."
+ //查看是否带"."
if(!extension.startsWith("."))
extension="."+extension;
return formatDate+extension;
}
/**
- * ɾͼ ͬʱɾԴͼԴƵ
- * @param thumbPath ͼ·
+ * 删除缩略图 同时删除源图或源视频
+ * @param thumbPath 缩略图路径
* @return
*/
public static boolean deleteThumbFile(String thumbPath,Context context) {
boolean flag = false;
File file = new File(thumbPath);
- if (!file.exists()) { // ļֱӷ
+ if (!file.exists()) { // 文件不存在直接返回
return flag;
}
flag = file.delete();
- //Դļ·
+ //源文件路径
String sourcePath=thumbPath.replace(context.getString(R.string.Thumbnail),
context.getString(R.string.Image));
file = new File(sourcePath);
- if (!file.exists()) { // ļֱӷ
+ if (!file.exists()) { // 文件不存在直接返回
return flag;
}
flag = file.delete();
return flag;
}
/**
- * ɾԴͼԴƵ ͬʱɾͼ
- * @param sourcePath ͼ·
+ * 删除源图或源视频 同时删除缩略图
+ * @param sourcePath 缩略图路径
* @return
*/
public static boolean deleteSourceFile(String sourcePath,Context context) {
boolean flag = false;
File file = new File(sourcePath);
- if (!file.exists()) { // ļֱӷ
+ if (!file.exists()) { // 文件不存在直接返回
return flag;
}
flag = file.delete();
- //ͼļ·
+ //缩略图文件路径
String thumbPath=sourcePath.replace(context.getString(R.string.Image),
context.getString(R.string.Thumbnail));
file = new File(thumbPath);
- if (!file.exists()) { // ļֱӷ
+ if (!file.exists()) { // 文件不存在直接返回
return flag;
}
flag = file.delete();
diff --git a/CameraLibrary/src/com/linj/album/view/AlbumGridView.java b/CameraLibrary/src/com/linj/album/view/AlbumGridView.java
index 011b6d0..f1cae45 100644
--- a/CameraLibrary/src/com/linj/album/view/AlbumGridView.java
+++ b/CameraLibrary/src/com/linj/album/view/AlbumGridView.java
@@ -24,24 +24,24 @@
/**
* @ClassName: AlbumView
- * @Description: View̳GridViewװAdapterͼƬط
+ * @Description: 相册View,继承于GridView,封装了Adapter和图片加载方法
* @author LinJ
- * @date 2015-1-5 5:09:08
+ * @date 2015-1-5 下午5:09:08
*
*/
public class AlbumGridView extends GridView{
public final static String TAG="AlbumView";
- /** ͼƬ Ż˻ */
+ /** 图片加载器 优化了了缓存 */
private ImageLoader mImageLoader;
- /** ͼƬò */
+ /** 加载图片配置参数 */
private DisplayImageOptions mOptions;
- /** ǰǷڱ༭״̬ trueΪ༭ */
+ /** 当前是否处于编辑状态 true为编辑 */
private boolean mEditable;
public AlbumGridView(Context context, AttributeSet attrs) {
super(context, attrs);
mImageLoader= ImageLoader.getInstance(context);
- //ͼƬز
+ //设置网络图片加载参数
DisplayImageOptions.Builder builder= new DisplayImageOptions.Builder();
builder =builder
.showImageOnLoading(R.drawable.ic_stub)
@@ -51,39 +51,39 @@ public AlbumGridView(Context context, AttributeSet attrs) {
.displayer(new RoundedBitmapDisplayer(20));
mOptions=builder.build();
setBackgroundColor(Color.WHITE);
- //شֱ
+ //隐藏垂直滚动条
setVerticalScrollBarEnabled(false);
}
/**
- * ȫѡͼƬ
- * @param listener ѡͼƬִеĻص
+ * 全选图片
+ * @param listener 选择图片后执行的回调函数
*/
public void selectAll(AlbumGridView.OnCheckedChangeListener listener){
((AlbumViewAdapter)getAdapter()).selectAll(listener);
}
/**
- * ȡȫѡͼƬ
- * @param listener ѡͼƬִеĻص
+ * 取消全选图片
+ * @param listener 选择图片后执行的回调函数
*/
public void unSelectAll(AlbumGridView.OnCheckedChangeListener listener){
((AlbumViewAdapter)getAdapter()).unSelectAll(listener);
}
/**
- * ÿɱ༭״̬
- * @param editable Ƿɱ༭
+ * 设置可编辑状态
+ * @param editable 是否可编辑
*/
public void setEditable(boolean editable){
mEditable=editable;
((AlbumViewAdapter)getAdapter()).notifyDataSetChanged(null);
}
/**
- * ÿɱ༭״̬
- * @param editable Ƿɱ༭
- * @param listener ѡͼƬִеĻص
+ * 设置可编辑状态
+ * @param editable 是否可编辑
+ * @param listener 选择图片后执行的回调函数
*/
public void setEditable(boolean editable,AlbumGridView.OnCheckedChangeListener listener){
mEditable=editable;
@@ -91,7 +91,7 @@ public void setEditable(boolean editable,AlbumGridView.OnCheckedChangeListener l
}
/**
- * ȡɱ༭״̬
+ * 获取可编辑状态
* @return
*/
public boolean getEditable(){
@@ -99,7 +99,7 @@ public boolean getEditable(){
}
/**
- * ȡǰѡͼƬ·
+ * 获取当前选择的图片路径集合
* @return
*/
public Set getSelectedItems(){
@@ -113,9 +113,9 @@ public void notifyDataSetChanged() {
/**
* @ClassName: OnCheckedChangeListener
- * @Description: ͼƬѡкļӿڣactivityص
+ * @Description: 图片选中后的监听接口,用以在activity内做回调处理
* @author LinJ
- * @date 2015-1-5 5:13:43
+ * @date 2015-1-5 下午5:13:43
*
*/
public interface OnCheckedChangeListener{
@@ -125,21 +125,21 @@ public interface OnCheckedChangeListener{
/**
* @ClassName: AlbumViewAdapter
- * @Description: GridView
+ * @Description: 相册GridView适配器
* @author LinJ
- * @date 2015-1-5 5:14:14
+ * @date 2015-1-5 下午5:14:14
*
*/
public class AlbumViewAdapter extends BaseAdapter implements OnClickListener,CompoundButton.OnCheckedChangeListener
{
- /** صļ· */
+ /** 加载的文件路径集合 */
List mPaths;
- /** ǰѡеļļ */
+ /** 当前选中的文件的集合 */
Set itemSelectedSet=new HashSet();
- /** ѡͼƬִеĻص */
+ /** 选中图片后执行的回调函数 */
AlbumGridView.OnCheckedChangeListener listener=null;
@@ -149,17 +149,17 @@ public AlbumViewAdapter(List paths) {
this.mPaths = paths;
}
/**
- * ݸıʱ»
+ * 适配器内容改变时,重新绘制
* @param listener
*/
public void notifyDataSetChanged(AlbumGridView.OnCheckedChangeListener listener) {
- //map
+ //重置map
itemSelectedSet=new HashSet();
this.listener=listener;
super.notifyDataSetChanged();
}
/**
- * ѡļ
+ * 选中所有文件
* @param listener
*/
public void selectAll(AlbumGridView.OnCheckedChangeListener listener){
@@ -172,7 +172,7 @@ public void selectAll(AlbumGridView.OnCheckedChangeListener listener){
}
/**
- * ȡѡļ
+ * 取消选中所有文件
* @param listener
*/
public void unSelectAll(AlbumGridView.OnCheckedChangeListener listener){
@@ -180,7 +180,7 @@ public void unSelectAll(AlbumGridView.OnCheckedChangeListener listener){
if(listener!=null) listener.onCheckedChanged(itemSelectedSet);
}
/**
- * ȡǰѡļļ
+ * 获取当前选中文件的集合
* @return
*/
public Set getSelectedItems(){
@@ -213,7 +213,7 @@ public View getView(int position, View convertView, ViewGroup parent) {
ThumbnaiImageView albumItemView = (ThumbnaiImageView)convertView;
if (albumItemView == null) albumItemView = new ThumbnaiImageView(getContext(),mImageLoader,mOptions);
albumItemView.setOnCheckedChangeListener(this);
- //õ¼ItemClick¼תΪAlbumItemViewClick¼
+ //设置点击事件,将ItemClick事件转化为AlbumItemView的Click事件
albumItemView.setOnClickListener(this);
String path=getItem(position);
albumItemView.setTags(path,position, mEditable, itemSelectedSet.contains(path));
@@ -223,7 +223,7 @@ public View getView(int position, View convertView, ViewGroup parent) {
@Override
public void onClick(View v) {
if(getOnItemClickListener()!=null){
- //ȡ㸸࣬ΪonClickFilterImageView
+ //这里取了上两层父类,因为真正触onClick的是FilterImageView
ThumbnaiImageView view=(ThumbnaiImageView)v.getParent().getParent();
getOnItemClickListener().onItemClick(AlbumGridView.this, view, view.getPosition(), 0L);
}
diff --git a/CameraLibrary/src/com/linj/album/view/AlbumViewPager.java b/CameraLibrary/src/com/linj/album/view/AlbumViewPager.java
index 18e667c..36e5807 100644
--- a/CameraLibrary/src/com/linj/album/view/AlbumViewPager.java
+++ b/CameraLibrary/src/com/linj/album/view/AlbumViewPager.java
@@ -1,18 +1,8 @@
package com.linj.album.view;
-import java.io.File;
-import java.util.ArrayList;
import java.util.List;
-
-import com.linj.FileOperateUtil;
-import com.linj.album.view.MatrixImageView.OnMovingListener;
-import com.linj.album.view.MatrixImageView.OnSingleTapListener;
-import com.linj.cameralibrary.R;
-import com.linj.imageloader.DisplayImageOptions;
-import com.linj.imageloader.ImageLoader;
-import com.linj.imageloader.displayer.MatrixBitmapDisplayer;
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
@@ -21,37 +11,44 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
-import android.widget.TextView;
import android.widget.Toast;
+import com.linj.FileOperateUtil;
+import com.linj.album.view.MatrixImageView.OnMovingListener;
+import com.linj.album.view.MatrixImageView.OnSingleTapListener;
+import com.linj.cameralibrary.R;
+import com.linj.imageloader.DisplayImageOptions;
+import com.linj.imageloader.ImageLoader;
+import com.linj.imageloader.displayer.MatrixBitmapDisplayer;
+
/**
* @ClassName: AlbumViewPager
- * @Description: Զviewpager ݼ
+ * @Description: 自定义viewpager 优化了事件拦截
* @author LinJ
- * @date 2015-1-9 5:33:33
+ * @date 2015-1-9 下午5:33:33
*
*/
public class AlbumViewPager extends ViewPager implements OnMovingListener {
public final static String TAG="AlbumViewPager";
- /** ͼƬ Ż˻ */
+ /** 图片加载器 优化了了缓存 */
private ImageLoader mImageLoader;
- /** ͼƬò */
+ /** 加载图片配置参数 */
private DisplayImageOptions mOptions;
- /** ǰӿؼǷ϶״̬ */
+ /** 当前子控件是否处理拖动状态 */
private boolean mChildIsBeingDragged=false;
- /** 浥¼ ʾز˵ */
+ /** 界面单击事件 用以显示和隐藏菜单栏 */
private OnSingleTapListener onSingleTapListener;
- /** Űť¼ */
+ /** 播放按钮点击事件 */
private OnPlayVideoListener onPlayVideoListener;
public AlbumViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
mImageLoader= ImageLoader.getInstance(context);
- //ͼƬز
+ //设置网络图片加载参数
DisplayImageOptions.Builder builder= new DisplayImageOptions.Builder();
builder =builder
.showImageOnLoading(R.drawable.ic_stub)
@@ -66,10 +63,13 @@ public AlbumViewPager(Context context, AttributeSet attrs) {
/**
- * ɾǰ
- * @return ǰλ/
+ * 删除当前项
+ * @return “当前位置/总数量”
*/
public String deleteCurrentPath(){
+ if(getAdapter()==null){
+ return "";
+ }
return ((ViewPagerAdapter)getAdapter()).deleteCurrentItem(getCurrentItem());
}
@@ -106,7 +106,7 @@ public interface OnPlayVideoListener{
}
public class ViewPagerAdapter extends PagerAdapter {
- private List paths;//ͼַ ΪͼƬ Ϊͼurl
+ private List paths;//大图地址 如果为网络图片 则为大图url
public ViewPagerAdapter(List paths){
this.paths=paths;
}
@@ -118,8 +118,8 @@ public int getCount() {
@Override
public Object instantiateItem(ViewGroup viewGroup, int position) {
- //ע⣬ﲻԼinflateʱֱӵviewGroup£ҪaddView
- //ΪֱӼӵviewGroup»ᵼ·صviewΪviewGroup
+ //注意,这里不可以加inflate的时候直接添加到viewGroup下,而需要用addView重新添加
+ //因为直接加到viewGroup下会导致返回的view为viewGroup
View imageLayout = inflate(getContext(),R.layout.item_album_pager, null);
viewGroup.addView(imageLayout);
assert imageLayout != null;
@@ -163,7 +163,7 @@ public void onClick(View v) {
@Override
public int getItemPosition(Object object) {
- //notifyDataSetChangedʱNone»
+ //在notifyDataSetChanged时返回None,重新绘制
return POSITION_NONE;
}
@@ -177,8 +177,11 @@ public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
- //Զȡǰview
+ //自定义获取当前view方法
public String deleteCurrentItem(int position) {
+ if(paths==null||paths.size()<=0){
+ return "";
+ }
String path=paths.get(position);
if(path!=null) {
FileOperateUtil.deleteSourceFile(path, getContext());
diff --git a/CameraLibrary/src/com/linj/album/view/FilterImageView.java b/CameraLibrary/src/com/linj/album/view/FilterImageView.java
index b3b4330..377c49b 100644
--- a/CameraLibrary/src/com/linj/album/view/FilterImageView.java
+++ b/CameraLibrary/src/com/linj/album/view/FilterImageView.java
@@ -14,14 +14,14 @@
/**
* @ClassName: FilterImageView
- * @Description: ʱʾ仯(˾Ч)ImageViewViewTouch¼ᵼClick¼
+ * @Description: 点击时显示明暗变化(滤镜效果)的ImageView,该View捕获了Touch事件,会导致容器的Click事件无法触发
* @author LinJ
- * @date 2015-1-6 2:13:46
+ * @date 2015-1-6 下午2:13:46
*
*/
public class FilterImageView extends ImageView implements GestureDetector.OnGestureListener{
public static final String TAG="FilterImageView";
- /** */
+ /** 监听手势*/
private GestureDetector mGestureDetector;
public FilterImageView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -31,8 +31,8 @@ public FilterImageView(Context context, AttributeSet attrs) {
@Override
public boolean onTouchEvent(MotionEvent event) {
- //cancelォ˾ȡעⲻҪcacncel¼,mGestureDetectorжcancelIJ
- //ڻGridViewʱAbsListViewصMoveUP¼ֱӸӿؼCancel
+ //在cancel里将滤镜取消,注意不要捕获cacncel事件,mGestureDetector里有对cancel的捕获操作
+ //在滑动GridView时,AbsListView会拦截掉Move和UP事件,直接给子控件返回Cancel
if(event.getActionMasked()== MotionEvent.ACTION_CANCEL
||event.getActionMasked()== MotionEvent.ACTION_UP){
removeFilter();
@@ -41,32 +41,32 @@ public boolean onTouchEvent(MotionEvent event) {
}
/**
- * ˾
+ * 设置滤镜
*/
private void setFilter() {
- //ȻȡõsrcͼƬ
+ //先获取设置的src图片
Drawable drawable=getDrawable();
- //srcͼƬΪNullȡͼƬ
+ //当src图片为Null,获取背景图片
if (drawable==null) {
drawable=getBackground();
}
if(drawable!=null){
- //˾
+ //设置滤镜
drawable.setColorFilter(Color.GRAY,PorterDuff.Mode.MULTIPLY);;
}
}
/**
- * ˾
+ * 清除滤镜
*/
private void removeFilter() {
- //ȻȡõsrcͼƬ
+ //先获取设置的src图片
Drawable drawable=getDrawable();
- //srcͼƬΪNullȡͼƬ
+ //当src图片为Null,获取背景图片
if (drawable==null) {
drawable=getBackground();
}
if(drawable!=null){
- //˾
+ //清除滤镜
drawable.clearColorFilter();
}
}
@@ -74,7 +74,7 @@ private void removeFilter() {
@Override
public boolean onDown(MotionEvent e) {
setFilter();
- //뷵trueʾtouch¼
+ //这里必须返回true,表示捕获本次touch事件
return true;
}
@@ -100,7 +100,7 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
@Override
public void onLongPress(MotionEvent e) {
- //ʱֶ¼
+ //长按时,手动触发长安事件
performLongClick();
}
diff --git a/CameraLibrary/src/com/linj/album/view/MatrixImageView.java b/CameraLibrary/src/com/linj/album/view/MatrixImageView.java
index b12d480..7fcc898 100644
--- a/CameraLibrary/src/com/linj/album/view/MatrixImageView.java
+++ b/CameraLibrary/src/com/linj/album/view/MatrixImageView.java
@@ -16,21 +16,21 @@
/**
* @ClassName: MatrixImageView
- * @Description: ŴСƶЧImageView
+ * @Description: 带放大、缩小、移动效果的ImageView
* @author LinJ
- * @date 2015-1-7 11:15:07
+ * @date 2015-1-7 上午11:15:07
*
*/
public class MatrixImageView extends ImageView{
public final static String TAG="MatrixImageView";
private GestureDetector mGestureDetector;
- /** ģMatrixԳʼ */
+ /** 模板Matrix,用以初始化 */
private Matrix mMatrix=new Matrix();
- /** ͼƬ*/
+ /** 图片长度*/
private float mImageWidth;
- /** ͼƬ߶ */
+ /** 图片高度 */
private float mImageHeight;
- /** ԭʼż */
+ /** 原始缩放级别 */
private float mScale
;
private OnMovingListener moveListener;
@@ -41,9 +41,9 @@ public MatrixImageView(Context context, AttributeSet attrs) {
MatrixTouchListener mListener=new MatrixTouchListener();
setOnTouchListener(mListener);
mGestureDetector=new GestureDetector(getContext(), new GestureListener(mListener));
- //Ϊbalck
+ //背景设置为balck
setBackgroundColor(Color.BLACK);
- //ΪCENTER_INSIDEʾͼƬʾ,ҿֵΪؼ
+ //将缩放类型设置为CENTER_INSIDE,表示把图片居中显示,并且宽高最大值为控件宽高
setScaleType(ScaleType.FIT_CENTER);
}
public MatrixImageView(Context context) {
@@ -51,9 +51,9 @@ public MatrixImageView(Context context) {
MatrixTouchListener mListener=new MatrixTouchListener();
setOnTouchListener(mListener);
mGestureDetector=new GestureDetector(getContext(), new GestureListener(mListener));
- //Ϊbalck
+ //背景设置为balck
setBackgroundColor(Color.BLACK);
- //ΪCENTER_INSIDEʾͼƬʾ,ҿֵΪؼ
+ //将缩放类型设置为CENTER_INSIDE,表示把图片居中显示,并且宽高最大值为控件宽高
setScaleType(ScaleType.FIT_CENTER);
}
public void setOnMovingListener(OnMovingListener listener){
@@ -66,7 +66,7 @@ public void setOnSingleTapListener(OnSingleTapListener onSingleTapListener) {
public void setImageBitmap(Bitmap bm) {
// TODO Auto-generated method stub
super.setImageBitmap(bm);
- //СΪ0 ʾǰؼСδ ü ڻǰֵ
+ //大小为0 表示当前控件大小未测量 设置监听函数 在绘制前赋值
if(getWidth()==0){
ViewTreeObserver vto = getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener()
@@ -74,7 +74,7 @@ public void setImageBitmap(Bitmap bm) {
public boolean onPreDraw()
{
initData();
- //ֵƳü
+ //赋值结束后,移除该监听函数
MatrixImageView.this.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
@@ -85,42 +85,42 @@ public boolean onPreDraw()
}
/**
- * ʼģMatrixͼƬ
+ * 初始化模板Matrix和图片的其他数据
*/
private void initData() {
- //ͼƬȡͼƬ任
+ //设置完图片后,获取该图片的坐标变换矩阵
mMatrix.set(getImageMatrix());
float[] values=new float[9];
mMatrix.getValues(values);
- //ͼƬΪĻȳű
+ //图片宽度为屏幕宽度除缩放倍数
mImageWidth=getWidth()/values[Matrix.MSCALE_X];
mImageHeight=(getHeight()-values[Matrix.MTRANS_Y]*2)/values[Matrix.MSCALE_Y];
mScale=values[Matrix.MSCALE_X];
}
public class MatrixTouchListener implements OnTouchListener{
- /** Ƭģʽ */
+ /** 拖拉照片模式 */
private static final int MODE_DRAG = 1;
- /** ŴСƬģʽ */
+ /** 放大缩小照片模式 */
private static final int MODE_ZOOM = 2;
- /** ֧Matrix */
+ /** 不支持Matrix */
private static final int MODE_UNABLE=3;
- /** ż*/
+ /** 最大缩放级别*/
float mMaxScale=6;
- /** ˫ʱż*/
+ /** 双击时的缩放级别*/
float mDobleClickScale=2;
private int mMode = 0;//
- /** ſʼʱָ */
+ /** 缩放开始时的手指间距 */
private float mStartDis;
- /** ǰMatrix*/
+ /** 当前Matrix*/
private Matrix mCurrentMatrix = new Matrix();
- /** ڼ¼ʼʱλ */
+ /** 用于记录开始时候的坐标位置 */
- /** ViewPagerأжϵǰǷơ */
+ /** 和ViewPager交互相关,判断当前是否可以左移、右移 */
boolean mLeftDragable;
boolean mRightDragable;
- /** Ƿһƶ */
+ /** 是否第一次移动 */
boolean mFirstMove=false;
private PointF mStartPoint = new PointF();
@Override
@@ -128,7 +128,7 @@ public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
- //϶ģʽ
+ //设置拖动模式
mMode=MODE_DRAG;
mStartPoint.set(event.getX(), event.getY());
isMatrixEnable();
@@ -164,21 +164,21 @@ public boolean onTouch(View v, MotionEvent event) {
}
/**
- * ӿؼʼƶ״̬ViewPagerضӿؼTouch¼
+ * 子控件开始进入移动状态,令ViewPager无法拦截对子控件的Touch事件
*/
private void startDrag(){
if(moveListener!=null) moveListener.startDrag();
}
/**
- * ӿؼʼֹͣƶ״̬ViewPagerضӿؼTouch¼
+ * 子控件开始停止移动状态,ViewPager将拦截对子控件的Touch事件
*/
private void stopDrag(){
if(moveListener!=null) moveListener.stopDrag();
}
/**
- * ݵǰͼƬұԵÿק״̬
+ * 根据当前图片左右边缘设置可拖拽状态
*/
private void checkDragable() {
mLeftDragable=true;
@@ -186,27 +186,27 @@ private void checkDragable() {
mFirstMove=true;
float[] values=new float[9];
getImageMatrix().getValues(values);
- //ͼƬԵ뿪߽磬ʾ
+ //图片左边缘离开左边界,表示不可右移
if(values[Matrix.MTRANS_X]>=0)
mRightDragable=false;
- //ͼƬұԵ뿪ұ߽磬ʾ
+ //图片右边缘离开右边界,表示不可左移
if((mImageWidth)*values[Matrix.MSCALE_X]+values[Matrix.MTRANS_X]<=getWidth()){
mLeftDragable=false;
}
}
/**
- * ק״̬µMatrix
+ * 设置拖拽状态下的Matrix
* @param event
*/
public void setDragMatrix(MotionEvent event) {
if(isZoomChanged()){
- float dx = event.getX() - mStartPoint.x; // õxƶ
- float dy = event.getY() - mStartPoint.y; // õxƶ
- //˫ͻ,10f϶
+ float dx = event.getX() - mStartPoint.x; // 得到x轴的移动距离
+ float dy = event.getY() - mStartPoint.y; // 得到x轴的移动距离
+ //避免和双击冲突,大于10f才算是拖动
if(Math.sqrt(dx*dx+dy*dy)>10f){
mStartPoint.set(event.getX(), event.getY());
- //ڵǰƶ
+ //在当前基础上移动
mCurrentMatrix.set(getImageMatrix());
float[] values=new float[9];
mCurrentMatrix.getValues(values);
@@ -222,20 +222,20 @@ public void setDragMatrix(MotionEvent event) {
}
/**
- * жżǷǸı
- * @return trueʾdzʼֵ,falseʾʼֵ
+ * 判断缩放级别是否是改变过
+ * @return true表示非初始值,false表示初始值
*/
private boolean isZoomChanged() {
float[] values=new float[9];
getImageMatrix().getValues(values);
- //ȡǰXż
+ //获取当前X轴缩放级别
float scale=values[Matrix.MSCALE_X];
- //ȡģXżȽ
+ //获取模板的X轴缩放级别,两者做比较
return scale!=mScale;
}
/**
- * ͵ǰԱȣdyʹͼƶᳬImageView߽
+ * 和当前矩阵对比,检验dy,使图像移动后不会超出ImageView边界
* @param values
* @param dy
* @return
@@ -252,7 +252,7 @@ else if(values[Matrix.MTRANS_Y]+dy<-(mImageHeight*values[Matrix.MSCALE_Y]-height
}
/**
- * ͵ǰԱȣdxʹͼƶᳬImageView߽
+ * 和当前矩阵对比,检验dx,使图像移动后不会超出ImageView边界
* @param values
* @param dx
* @return
@@ -260,14 +260,14 @@ else if(values[Matrix.MTRANS_Y]+dy<-(mImageHeight*values[Matrix.MSCALE_Y]-height
private float checkDxBound(float[] values,float dx,float dy) {
float width=getWidth();
if(!mLeftDragable&&dx<0){
- //yĶԱȣʾڼֱʱлItem
+ //加入和y轴的对比,表示在监听到垂直方向的手势时不切换Item
if(Math.abs(dx)*0.4f>Math.abs(dy)&&mFirstMove){
stopDrag();
}
return 0;
}
if(!mRightDragable&&dx>0){
- //yĶԱȣʾڼֱʱлItem
+ //加入和y轴的对比,表示在监听到垂直方向的手势时不切换Item
if(Math.abs(dx)*0.4f>Math.abs(dy)&&mFirstMove){
stopDrag();
}
@@ -290,17 +290,17 @@ else if(values[Matrix.MTRANS_X]+dx<-(mImageWidth*values[Matrix.MSCALE_X]-width))
}
/**
- * Matrix
+ * 设置缩放Matrix
* @param event
*/
private void setZoomMatrix(MotionEvent event) {
- //ֻͬʱʱִ
+ //只有同时触屏两个点的时候才执行
if(event.getPointerCount()<2) return;
- float endDis = distance(event);//
- if (endDis > 10f) { // ָ£һʱش10
- float scale = endDis / mStartDis;// õű
- mStartDis=endDis;//þ
- mCurrentMatrix.set(getImageMatrix());//ʼMatrix
+ float endDis = distance(event);// 结束距离
+ if (endDis > 10f) { // 两个手指并拢在一起的时候像素大于10
+ float scale = endDis / mStartDis;// 得到缩放倍数
+ mStartDis=endDis;//重置距离
+ mCurrentMatrix.set(getImageMatrix());//初始化Matrix
float[] values=new float[9];
mCurrentMatrix.getValues(values);
scale = checkMaxScale(scale, values);
@@ -311,29 +311,29 @@ private void setZoomMatrix(MotionEvent event) {
}
/**
- * ȡŵĵ㡣
+ * 获取缩放的中心点。
* @param scale
* @param values
* @return
*/
private PointF getCenter(float scale,float[] values) {
- //żСԭʼżʱΪŴ״̬ʱImageViewĵΪĵ
+ //缩放级别小于原始缩放级别时或者为放大状态时,返回ImageView中心点作为缩放中心点
if(scale*values[Matrix.MSCALE_X]=1){
return new PointF(getWidth()/2,getHeight()/2);
}
float cx=getWidth()/2;
float cy=getHeight()/2;
- //ImageViewĵΪģжźͼƬԵǷ뿪ImageViewԵǵĻԵΪX
+ //以ImageView中心点为缩放中心,判断缩放后的图片左边缘是否会离开ImageView左边缘,是的话以左边缘为X轴中心
if((getWidth()/2-values[Matrix.MTRANS_X])*scale0){
mZoomSeekBar.setMax(maxZoom);
mZoomSeekBar.setOnSeekBarChangeListener(onSeekBarChangeListener);
}
+ mWaterMarkImageView.setTag("IMAGE_TAG");
+ mWaterMarkImageView.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ ClipData.Item item = new ClipData.Item((CharSequence)v.getTag());
+
+ String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};
+// ClipData d = new ClipData(description, new Item(""));
+ ClipData dragData = new ClipData(v.getTag().toString(),
+ mimeTypes, item);
+
+ // Instantiates the drag shadow builder.
+ View.DragShadowBuilder myShadow = new DragShadowBuilder(mWaterMarkImageView);
+
+ // Starts the drag
+ v.startDrag(dragData, // the data to be dragged
+ myShadow, // the drag shadow builder
+ null, // no need to use local data
+ 0 // flags (not currently used, set to 0)
+ );
+ return true;
+ }
+ });
+ }
+
+ /**
+ * 设置录制视频的尺寸
+ * @param quality {@link CamcorderProfile#QUALITY_480P}
+ * {@link CamcorderProfile#QUALITY_720P }
+ * {@link CamcorderProfile#QUALITY_1080P}
+ * {@link CamcorderProfile#QUALITY_QVGA}
+ * {@link CamcorderProfile#QUALITY_TIME_LAPSE_QCIF}
+ * {@link CamcorderProfile#QUALITY_TIME_LAPSE_CIF}
+ * {@link CamcorderProfile#QUALITY_TIME_LAPSE_480P}
+ * {@link CamcorderProfile#QUALITY_TIME_LAPSE_720P}
+ * {@link CamcorderProfile#QUALITY_TIME_LAPSE_1080P}
+ * {@link CamcorderProfile#QUALITY_TIME_LAPSE_QVGA}
+ */
+ public void setProfile(int quality){
+ mCameraView.setProfile(quality);
}
@@ -164,20 +273,18 @@ public Bitmap stopRecord(){
}
/**
- * ıģʽ ģʽ¼ģʽл ģʽijʼżͬ
- * @param zoom ż
+ * 改变相机模式 在拍照模式和录像模式间切换 两个模式的初始缩放级别不同
+ * @param zoom 缩放级别
*/
public void switchMode(int zoom){
mZoomSeekBar.setProgress(zoom);
mCameraView.setZoom(zoom);
- //ԶԽ
+ //自动对焦
mCameraView.onFocus(new Point(getWidth()/2, getHeight()/2), autoFocusCallback);
- //ˮӡ
+ //隐藏水印
mWaterMarkImageView.setVisibility(View.GONE);
}
-
-
public void setWaterMark(){
if (mWaterMarkImageView.getVisibility()==View.VISIBLE) {
mWaterMarkImageView.setVisibility(View.GONE);
@@ -187,14 +294,14 @@ public void setWaterMark(){
}
/**
- * ǰáͷת
+ * 前置、后置摄像头转换
*/
@Override
public void switchCamera(){
mCameraView.switchCamera();
}
/**
- * ȡǰ
+ * 获取当前闪光灯类型
* @return
*/
@Override
@@ -203,7 +310,7 @@ public FlashMode getFlashMode() {
}
/**
- *
+ * 设置闪光灯类型
* @param flashMode
*/
@Override
@@ -212,18 +319,39 @@ public void setFlashMode(FlashMode flashMode) {
}
/**
- * ļ·
+ * 设置文件保存路径
* @param rootPath
*/
public void setRootPath(String rootPath){
this.mSavePath=rootPath;
}
-
-
+ /**
+ * 设置图片保存位置
+ * @param imagePath 图位置
+ * @param thumbPath 缩略图位置
+ */
+ public void setSavePath(String imagePath,String thumbPath){
+ imgName = FileOperateUtil.createFileNmae(".jpg");
+ if(!TextUtils.isEmpty(imagePath)){
+ mImageFolder = FileOperateUtil.getFolderPath(getContext(), FileOperateUtil.TYPE_IMAGE, thumbPath);
+ this.imagePath = mImageFolder+File.separator + imgName;
+ }
+ if(!TextUtils.isEmpty(thumbPath)){
+ mThumbnailFolder = FileOperateUtil.getFolderPath(getContext(), FileOperateUtil.TYPE_THUMBNAIL, thumbPath);
+ this.thumbPath = mThumbnailFolder + File.separator + imgName;
+ }
+ }
+ /**
+ * 视频保存路径
+ */
+ public void setSaveVideoPath(String path){
+ mCameraView.setSaveVideoPath(path);
+ }
+
/**
- * շ
+ * 拍照方法
* @param callback
*/
public void takePicture(){
@@ -231,8 +359,8 @@ public void takePicture(){
}
/**
- * @Description: շ
- * @param @param listener ռӿ
+ * @Description: 拍照方法
+ * @param @param listener 拍照监听接口
* @return void
* @throws
*/
@@ -274,7 +402,7 @@ public void onProgressChanged(SeekBar seekBar, int progress,
// TODO Auto-generated method stub
mCameraView.setZoom(progress);
mHandler.removeCallbacksAndMessages(mZoomSeekBar);
- //ZOOMģʽ ڽseekbar tokenΪmZoomSeekBarʱƳǰһʱ
+ //ZOOM模式下 在结束两秒后隐藏seekbar 设置token为mZoomSeekBar用以在连续点击时移除前一个定时任务
mHandler.postAtTime(new Runnable() {
@Override
@@ -301,101 +429,134 @@ public void onStopTrackingTouch(SeekBar seekBar) {
}
};
-
+ /**
+ * 设置相机的自动对焦,监听
+ */
private final AutoFocusCallback autoFocusCallback=new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
- //۽֮ݽͼƬ
+ //聚焦之后根据结果修改图片
if (success) {
mFocusImageView.onFocusSuccess();
+ camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦。
+// camera.startPreview();
}else {
- //۽ʧʾͼƬδҵʵԴʾͬһͼƬ
+ //聚焦失败显示的图片,由于未找到合适的资源,这里仍显示同一张图片
mFocusImageView.onFocusFailed();
}
}
};
-
+ /**
+ * 压缩后的图片最大值 单位KB
+ * @param maxSize
+ */
+ public void setMaxSize(int maxSize){
+ this.maxSize = maxSize;
+ }
+ /**
+ * 调用保存时的监听
+ */
private final PictureCallback pictureCallback=new PictureCallback() {
@Override
- public void onPictureTaken(byte[] data, Camera camera) {
+ public void onPictureTaken(final byte[] data, Camera camera) {
if(mSavePath==null) throw new RuntimeException("mSavePath is null");
- if(mDataHandler==null) mDataHandler=new DataHandler();
- mDataHandler.setMaxSize(200);
- Bitmap bm=mDataHandler.save(data);
- mTempImageView.setListener(mListener);
- mTempImageView.isVideo(false);
- mTempImageView.setImageBitmap(bm);
- mTempImageView.startAnimation(R.anim.tempview_show);
- //´Ԥͼһε
+ if(mDataHandler==null) mDataHandler=new DataHandler();
+ new AsyncTask() {
+ @Override
+ protected void onPostExecute(Bitmap bm) {
+ mTempImageView.setListener(mListener);
+ mTempImageView.isVideo(false);
+ mTempImageView.setImageBitmap(bm);
+ mTempImageView.startAnimation(R.anim.tempview_show);
+ //重新打开预览图,进行下一次的拍照准备
+
+ if(mListener!=null) mListener.onTakePictureEnd(bm);
+ super.onPostExecute(bm);
+ }
+ @Override
+ protected Bitmap doInBackground(Bitmap... params) {
+ Bitmap bm=mDataHandler.handerSave(data);//添加水印/并保存
+ return bm;
+ }
+ }.execute();
+// at.execute(Void);
camera.startPreview();
- if(mListener!=null) mListener.onTakePictureEnd(bm);
+// mTempImageView.setListener(mListener);
+// mTempImageView.isVideo(false);
+// mTempImageView.setImageBitmap(bm);
+// mTempImageView.startAnimation(R.anim.tempview_show);
+// //重新打开预览图,进行下一次的拍照准备
+// camera.startPreview();
+// if(mListener!=null) mListener.onTakePictureEnd(bm);
}
};
+ private DisplayMetrics displayMetrics;
+
private final class TouchListener implements OnTouchListener {
- /** ¼ƬģʽǷŴСƬģʽ */
+ /** 记录是拖拉照片模式还是放大缩小照片模式 */
private static final int MODE_INIT = 0;
- /** ŴСƬģʽ */
+ /** 放大缩小照片模式 */
private static final int MODE_ZOOM = 1;
- private int mode = MODE_INIT;// ʼ״̬
+ private int mode = MODE_INIT;// 初始状态
- /** ڼ¼ͼƬƶλ */
+ /** 用于记录拖拉图片移动的坐标位置 */
private float startDis;
@Override
public boolean onTouch(View v, MotionEvent event) {
- /** ͨ㱣λ MotionEvent.ACTION_MASK = 255 */
+ /** 通过与运算保留最后八位 MotionEvent.ACTION_MASK = 255 */
switch (event.getAction() & MotionEvent.ACTION_MASK) {
- // ָѹĻ
+ // 手指压下屏幕
case MotionEvent.ACTION_DOWN:
mode = MODE_INIT;
break;
case MotionEvent.ACTION_POINTER_DOWN:
- //mZoomSeekBarΪnull ʾ豸֧ ֱmode MoveָҲִ
+ //如果mZoomSeekBar为null 表示该设备不支持缩放 直接跳过设置mode Move指令也无法执行
if(mZoomSeekBar==null) return true;
- //ƳtokenΪmZoomSeekBarʱ
+ //移除token对象为mZoomSeekBar的延时任务
mHandler.removeCallbacksAndMessages(mZoomSeekBar);
mZoomSeekBar.setVisibility(View.VISIBLE);
mode = MODE_ZOOM;
- /** ָľ */
+ /** 计算两个手指间的距离 */
startDis = distance(event);
break;
case MotionEvent.ACTION_MOVE:
if (mode == MODE_ZOOM) {
- //ֻͬʱʱִ
+ //只有同时触屏两个点的时候才执行
if(event.getPointerCount()<2) return true;
- float endDis = distance(event);//
- //ÿ仯10f zoom1
+ float endDis = distance(event);// 结束距离
+ //每变化10f zoom变1
int scale=(int) ((endDis-startDis)/10f);
if(scale>=1||scale<=-1){
int zoom=mCameraView.getZoom()+scale;
- //zoomܳΧ
+ //zoom不能超出范围
if(zoom>mCameraView.getMaxZoom()) zoom=mCameraView.getMaxZoom();
if(zoom<0) zoom=0;
mCameraView.setZoom(zoom);
mZoomSeekBar.setProgress(zoom);
- //һεľΪǰ
+ //将最后一次的距离设为当前距离
startDis=endDis;
}
}
break;
- // ָ뿪Ļ
+ // 手指离开屏幕
case MotionEvent.ACTION_UP:
if(mode!=MODE_ZOOM){
- //þ۽
+ //设置聚焦
Point point=new Point((int)event.getX(), (int)event.getY());
mCameraView.onFocus(point,autoFocusCallback);
mFocusImageView.startFocus(point);
}else {
- //ZOOMģʽ ڽseekbar tokenΪmZoomSeekBarʱƳǰһʱ
+ //ZOOM模式下 在结束两秒后隐藏seekbar 设置token为mZoomSeekBar用以在连续点击时移除前一个定时任务
mHandler.postAtTime(new Runnable() {
@Override
@@ -409,32 +570,36 @@ public void run() {
}
return true;
}
- /** ָľ */
+ /** 计算两个手指间的距离 */
private float distance(MotionEvent event) {
float dx = event.getX(1) - event.getX(0);
float dy = event.getY(1) - event.getY(0);
- /** ʹùɶ֮ľ */
+ /** 使用勾股定理返回两点之间的距离 */
return (float) Math.sqrt(dx * dx + dy * dy);
}
}
-
+ /** 压缩后的图片最大值 单位KB*/
+ private int maxSize=200;
/**
- * շصbyteݴ
+ * 拍照返回的byte数据处理类
* @author linj
*
*/
- private final class DataHandler{
- /** ͼ· */
- private String mThumbnailFolder;
- /** Сͼ· */
- private String mImageFolder;
- /** ѹͼƬֵ λKB*/
- private int maxSize=200;
+ /** 大图存放路径 */
+ private String mThumbnailFolder;
+ /** 小图存放路径 */
+ private String mImageFolder;
+ private String imgName;
+
+ private String imagePath;
+
+ private String thumbPath;
+ private final class DataHandler{
+
public DataHandler(){
- mImageFolder=FileOperateUtil.getFolderPath(getContext(), FileOperateUtil.TYPE_IMAGE, mSavePath);
- mThumbnailFolder=FileOperateUtil.getFolderPath(getContext(), FileOperateUtil.TYPE_THUMBNAIL, mSavePath);
+
File folder=new File(mImageFolder);
if(!folder.exists()){
folder.mkdirs();
@@ -446,33 +611,35 @@ public DataHandler(){
}
/**
- * ͼƬ
- * @param صļ
- * @return ɵͼ
+ * 保存图片
+ * @param 相机返回的文件流
+ * @return 解析流生成的缩略图
*/
- public Bitmap save(byte[] data){
+ public Bitmap handerSave(byte[] data){
if(data!=null){
- //صͼƬ
+ //解析生成相机返回的图片
Bitmap bm=BitmapFactory.decodeByteArray(data, 0, data.length);
- //ȡˮӡͼƬ
+// Matrix m = new Matrix();
+// m.setRotate(bitmepRotateAngle, bm.getWidth(), bm.getHeight());
+// bm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true);
+ //获取加水印的图片
bm=getBitmapWithWaterMark(bm);
- //ͼ
+ //生成缩略图
Bitmap thumbnail=ThumbnailUtils.extractThumbnail(bm, 213, 213);
- //µļ
- String imgName=FileOperateUtil.createFileNmae(".jpg");
- String imagePath=mImageFolder+File.separator+imgName;
- String thumbPath=mThumbnailFolder+File.separator+imgName;
+ //产生新的文件名
+
File file=new File(imagePath);
File thumFile=new File(thumbPath);
try{
- //ͼƬͼ
+ //存图片大图
FileOutputStream fos=new FileOutputStream(file);
- ByteArrayOutputStream bos=compress(bm);
+ ByteArrayOutputStream bos=compress(bm);//压缩要保存的图片
fos.write(bos.toByteArray());
fos.flush();
fos.close();
- //ͼƬСͼ
+ Log.w(TAG, "bitmap--> path:"+imagePath+" fileSize: "+maxSize);
+ //存图片小图
BufferedOutputStream bufferos=new BufferedOutputStream(new FileOutputStream(thumFile));
thumbnail.compress(Bitmap.CompressFormat.JPEG, 50, bufferos);
bufferos.flush();
@@ -480,20 +647,28 @@ public Bitmap save(byte[] data){
return bm;
}catch(Exception e){
Log.e(TAG, e.toString());
- Toast.makeText(getContext(), "ʧ", Toast.LENGTH_SHORT).show();
+ Toast.makeText(getContext(), "解析相机返回流失败", Toast.LENGTH_SHORT).show();
}
}else{
- Toast.makeText(getContext(), "ʧܣ", Toast.LENGTH_SHORT).show();
+ Toast.makeText(getContext(), "拍照失败,请重试", Toast.LENGTH_SHORT).show();
}
return null;
}
-
+ /**
+ * 设置上水印
+ * @param bm
+ * @return
+ */
private Bitmap getBitmapWithWaterMark(Bitmap bm) {
// TODO Auto-generated method stub
if(!(mWaterMarkImageView.getVisibility()==View.VISIBLE)){
return bm;
}
+ //计算图片和屏幕的比例
+ int zoom = displayMetrics.widthPixels/bm.getWidth();
+
+
Drawable mark=mWaterMarkImageView.getDrawable();
Bitmap wBitmap=drawableToBitmap(mark);
int w = bm.getWidth();
@@ -504,18 +679,31 @@ private Bitmap getBitmapWithWaterMark(Bitmap bm) {
int wh = wBitmap.getHeight();
Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );
+ Matrix matrix = new Matrix();
+
+ Bitmap b = Bitmap.createBitmap( w/zoom, h/zoom, Config.ARGB_8888 );
+ wBitmap = Bitmap.createBitmap(wBitmap, 0, 0, mWaterMarkImageView.getWidth(), mWaterMarkImageView.getHeight());
Canvas canvas=new Canvas(newb);
//draw src into
- canvas.drawBitmap( bm, 0, 0, null );// 00꿪ʼsrc
- canvas.drawBitmap( wBitmap, w - ww + 5, h - wh + 5, null );//src½ǻˮӡ
+ canvas.drawBitmap( bm, 0, 0, null );//在 0,0坐标开始画入src
+ wBitmap = ThumbnailUtils.extractThumbnail(wBitmap, w/zoom, h/zoom,ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
+
+// canvas.drawBitmap( wBitmap, w - ww + 5, h - wh + 5, null );//在src的右下角画入水印
+ float x2 = mWaterMarkImageView.getX();
+ float y2 = mWaterMarkImageView.getY();
+ System.out.println(x2);
+ System.out.println(y2);
+ System.out.println(b.getWidth());
+ canvas.drawBitmap( wBitmap, 0, 0, null );//在src的右下角画入水印
+// canvas.drawBitmap( wBitmap, 0, 0, null );//在src的右下角画入水印
//save all clip
- canvas.save( Canvas.ALL_SAVE_FLAG );//
+ canvas.save( Canvas.ALL_SAVE_FLAG );//保存
//store
- canvas.restore();//洢
+ canvas.restore();//存储
bm.recycle();
bm=null;
wBitmap.recycle();
@@ -535,58 +723,55 @@ public Bitmap drawableToBitmap(Drawable drawable) {
return bitmap;
}
/**
- * ͼƬѹ
- * @param bitmap ͼƬļ
- * @param max ļСֵ
- * @return ѹֽ
+ * 图片压缩方法
+ * @param bitmap 图片文件
+ * @param max 文件大小最大值
+ * @return 压缩后的字节流
* @throws Exception
*/
public ByteArrayOutputStream compress(Bitmap bitmap){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
- bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);// ѹ100ʾѹѹݴŵbaos
+ bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
int options = 99;
- while ( baos.toByteArray().length / 1024 > maxSize) { // ѭжѹͼƬǷ100kb,ڼѹ
- options -= 3;// ÿζ10
- //ѹС0ѹ
+ while ( baos.toByteArray().length / 1024 > maxSize) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩
+ options -= 3;// 每次都减少10
+ //压缩比小于0,不再压缩
if (options<0) {
break;
}
Log.i(TAG,baos.toByteArray().length / 1024+"");
- baos.reset();// baosbaos
- bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);// ѹoptions%ѹݴŵbaos
+ baos.reset();// 重置baos即清空baos
+ bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中
}
return baos;
}
- public void setMaxSize(int maxSize) {
- this.maxSize = maxSize;
- }
}
/**
* @ClassName: TakePictureListener
- * @Description: ռӿڣտʼͽִӦ
+ * @Description: 拍照监听接口,用以在拍照开始和结束后执行相应操作
* @author LinJ
- * @date 2014-12-31 9:50:33
+ * @date 2014-12-31 上午9:50:33
*
*/
public static interface TakePictureListener{
/**
- *սִеĶ÷onPictureTakenִк
- * @param bm ɵͼƬ
+ *拍照结束执行的动作,该方法会在onPictureTaken函数执行后触发
+ * @param bm 拍照生成的图片
*/
public void onTakePictureEnd(Bitmap bm);
- /** ʱͼƬ
- * @param bm ɵͼƬ
- * @param isVideo trueǰΪ¼ͼ false:Ϊͼ
+ /** 临时图片动画结束后触发
+ * @param bm 拍照生成的图片
+ * @param isVideo true:当前为录像缩略图 false:为拍照缩略图
* */
public void onAnimtionEnd(Bitmap bm,boolean isVideo);
}
/**
- * dipתpx
+ * dip转px
* @param dipValue
* @return
*/
diff --git a/CameraLibrary/src/com/linj/camera/view/CameraOperation.java b/CameraLibrary/src/com/linj/camera/view/CameraOperation.java
index 84b23c4..4bf42ab 100644
--- a/CameraLibrary/src/com/linj/camera/view/CameraOperation.java
+++ b/CameraLibrary/src/com/linj/camera/view/CameraOperation.java
@@ -8,55 +8,55 @@
/**
* @ClassName: CameraOperation
- * @Description:ӿڣͳһCameraContainerCameraViewĹ
+ * @Description:相机操作接口,用以统一CameraContainer和CameraView的功能
* @author LinJ
- * @date 2015-1-26 2:41:31
+ * @date 2015-1-26 下午2:41:31
*
*/
public interface CameraOperation {
/**
- * ʼ¼
- * @return Ƿɹʼ¼
+ * 开始录像
+ * @return 是否成功开始录像
*/
public boolean startRecord();
/**
- * ֹͣ¼
- * @return ¼ͼ
+ * 停止录像
+ * @return 录像缩略图
*/
public Bitmap stopRecord();
/**
- * лǰúͺ
+ * 切换前置和后置相机
*/
public void switchCamera();
/**
- * ȡǰģʽ
+ * 获取当前闪光灯模式
* @return
*/
public FlashMode getFlashMode();
/**
- * ģʽ
+ * 设置闪光灯模式
* @param flashMode
*/
public void setFlashMode(FlashMode flashMode);
/**
- *
- * @param callback ջص
- * @param listener ն
+ * 拍照
+ * @param callback 拍照回调函数
+ * @param listener 拍照动作监听函数
*/
public void takePicture(PictureCallback callback,TakePictureListener listener);
/**
- * ż
+ * 相机最大缩放级别
* @return
*/
public int getMaxZoom();
/**
- * õǰż
+ * 设置当前缩放级别
* @param zoom
*/
public void setZoom(int zoom);
/**
- * ȡǰż
+ * 获取当前缩放级别
* @return
*/
public int getZoom();
diff --git a/CameraLibrary/src/com/linj/camera/view/CameraView.java b/CameraLibrary/src/com/linj/camera/view/CameraView.java
index 88a7d2a..9b36a99 100644
--- a/CameraLibrary/src/com/linj/camera/view/CameraView.java
+++ b/CameraLibrary/src/com/linj/camera/view/CameraView.java
@@ -6,80 +6,69 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
-import com.linj.cameralibrary.R;
-import com.linj.FileOperateUtil;
-import com.linj.camera.view.CameraContainer.TakePictureListener;
-
-import android.R.integer;
import android.content.Context;
-import android.content.res.Configuration;
import android.graphics.Bitmap;
-import android.graphics.ImageFormat;
-import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.Camera;
import android.hardware.Camera.Area;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.CameraInfo;
-import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
-import android.hardware.Camera.Size;
import android.media.CamcorderProfile;
import android.media.MediaMetadataRetriever;
import android.media.MediaRecorder;
-import android.media.ThumbnailUtils;
-import android.media.MediaRecorder.OnInfoListener;
-import android.net.Uri;
-import android.os.Handler;
-import android.provider.MediaStore.Video.Thumbnails;
import android.util.AttributeSet;
import android.util.Log;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
import android.view.OrientationEventListener;
-import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
-import android.view.View;
import android.widget.Toast;
+import com.linj.FileOperateUtil;
+import com.linj.camera.view.CameraContainer.TakePictureListener;
+
/**
* @ClassName: CameraView
- * @Description: SurfaceView װշ
+ * @Description: 和相机绑定的SurfaceView 封装了拍照方法
* @author LinJ
- * @date 2014-12-31 9:44:56
+ * @date 2014-12-31 上午9:44:56
*
*/
public class CameraView extends SurfaceView implements CameraOperation{
public final static String TAG="CameraView";
- /** ViewCamera */
+ /** 和该View绑定的Camera对象 */
private Camera mCamera;
- /** ǰͣĬΪر */
- private FlashMode mFlashMode=FlashMode.ON;
+ /** 当前闪光灯类型,默认为关闭 */
+ private FlashMode mFlashMode=FlashMode.AUTO;
- /** ǰż ĬΪ0*/
+ /** 当前缩放级别 默认为0*/
private int mZoom=0;
- /** ǰĻתǶ*/
+ /** 当前屏幕旋转角度*/
private int mOrientation=0;
- /** Ƿǰ,trueΪǰ,falseΪ */
+ /** 是否打开前置相机,true为前置,false为后置 */
private boolean mIsFrontCamera;
- /** ¼ */
+ /** 录像类 */
private MediaRecorder mMediaRecorder;
- /** ã¼ǰ¼¼ָԭ */
+ /** 相机配置,在录像前记录,用以录像结束后恢复原配置 */
private Camera.Parameters mParameters;
- /** ¼· ͼ*/
+ /** 录像存放路径 ,用以生成缩略图*/
private String mRecordPath=null;
+ /** 设置默认自动对焦 */
+ private AutoFocusCallback autoFocus;
+ /** 录视频保存路径 */
+ private String videoSavePath;
+ /** 录视频时的尺寸 */
+ private int videoMode = CamcorderProfile.QUALITY_1080P;
public CameraView(Context context){
super(context);
- //ʼ
+ //初始化容器
getHolder().addCallback(callback);
openCamera();
mIsFrontCamera=false;
@@ -87,7 +76,7 @@ public CameraView(Context context){
public CameraView(Context context, AttributeSet attrs) {
super(context, attrs);
- //ʼ
+ //初始化容器
getHolder().addCallback(callback);
openCamera();
mIsFrontCamera=false;
@@ -104,21 +93,24 @@ public void surfaceCreated(SurfaceHolder holder) {
setCameraParameters();
mCamera.setPreviewDisplay(getHolder());
} catch (Exception e) {
- Toast.makeText(getContext(), "ʧ", Toast.LENGTH_SHORT).show();
+ Toast.makeText(getContext(), "打开相机失败", Toast.LENGTH_SHORT).show();
Log.e(TAG,e.getMessage());
}
mCamera.startPreview();
+ mCamera.cancelAutoFocus();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
+ mCamera.autoFocus(autoFocus);
+ setCameraParameters();
updateCameraOrientation();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
- //ֹͣ¼
+ //停止录像
stopRecord();
if (mCamera != null) {
mCamera.stopPreview();
@@ -132,10 +124,26 @@ public void surfaceDestroyed(SurfaceHolder holder) {
protected boolean isRecording(){
return mMediaRecorder!=null;
}
-
+ /**
+ *
+ * @param quality {@link CamcorderProfile#QUALITY_480P}
+ * {@link CamcorderProfile#QUALITY_720P }
+ * {@link CamcorderProfile#QUALITY_1080P}
+ * {@link CamcorderProfile#QUALITY_QVGA}
+ * {@link CamcorderProfile#QUALITY_TIME_LAPSE_QCIF}
+ * {@link CamcorderProfile#QUALITY_TIME_LAPSE_CIF}
+ * {@link CamcorderProfile#QUALITY_TIME_LAPSE_480P}
+ * {@link CamcorderProfile#QUALITY_TIME_LAPSE_720P}
+ * {@link CamcorderProfile#QUALITY_TIME_LAPSE_1080P}
+ * {@link CamcorderProfile#QUALITY_TIME_LAPSE_QVGA}
+ */
+ public void setProfile(int quality){
+ this.videoMode = quality;
+ }
+
/**
- * ʼ¼
- * @return ʼ¼Ƿɹ
+ * 开始录像
+ * @return 开始录像是否成功
*/
@Override
public boolean startRecord(){
@@ -155,11 +163,11 @@ public boolean startRecord(){
.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder
.setAudioSource(MediaRecorder.AudioSource.MIC);
- //¼ӦҪ˴ȡһСʽƵ
- mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_480P));
- //Ƶڲʶ¼ƣҪת90
+ //设置录像参数,由于应用需要此处取一个较小格式的视频
+ mMediaRecorder.setProfile(CamcorderProfile.get(videoMode));
+ //设置输出视频朝向,便于播放器识别。由于是竖屏录制,需要正转90°
mMediaRecorder.setOrientationHint(90);
- String path=FileOperateUtil.getFolderPath(getContext(), FileOperateUtil.TYPE_VIDEO, "test");
+ String path=FileOperateUtil.getFolderPath(getContext(), FileOperateUtil.TYPE_VIDEO, videoSavePath);
File directory=new File(path);
if(!directory.exists())
directory.mkdirs();
@@ -171,7 +179,9 @@ public boolean startRecord(){
.getAbsolutePath());
mMediaRecorder.prepare();
mMediaRecorder.start();
+ Log.w(TAG, "video path"+mRecordPath);
} catch (Exception e) {
+ e.printStackTrace();
return false;
}
return true;
@@ -179,6 +189,7 @@ public boolean startRecord(){
@Override
public Bitmap stopRecord(){
+ Log.w(TAG, "video stopRecord"+mRecordPath);
Bitmap bitmap=null;
try {
if(mMediaRecorder!=null){
@@ -186,17 +197,17 @@ public Bitmap stopRecord(){
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder=null;
- //Ƶͼ
+ //保存视频的缩略图
bitmap=saveThumbnail();
}
if(mParameters!=null&&mCamera!=null){
- //
+ //重新连接相机
mCamera.reconnect();
- //ֹͣԤעȵֹͣԤòЧ
+ //停止预览,注意这里必须先调用停止预览再设置参数才有效
mCamera.stopPreview();
- //òΪ¼ǰIJȻ¼ǵ䣬¼ƺԤЧǵ仭
+ //设置参数为录像前的参数,不然如果录像是低配,结束录制后预览效果还是低配画面
mCamera.setParameters(mParameters);
- //´
+ //重新打开
mCamera.startPreview();
mParameters=null;
}
@@ -209,19 +220,19 @@ public Bitmap stopRecord(){
private Bitmap saveThumbnail() throws FileNotFoundException, IOException {
if(mRecordPath!=null){
- //ͼ,÷ֻܻȡ384X512ͼʹԴеĻȡͼ
+ //创建缩略图,该方法只能获取384X512的缩略图,舍弃,使用源码中的获取缩略图方法
// Bitmap bitmap=ThumbnailUtils.createVideoThumbnail(mRecordPath, Thumbnails.MINI_KIND);
Bitmap bitmap=getVideoThumbnail(mRecordPath);
if(bitmap!=null){
- String mThumbnailFolder=FileOperateUtil.getFolderPath(getContext(), FileOperateUtil.TYPE_THUMBNAIL, "test");
+ String mThumbnailFolder=FileOperateUtil.getFolderPath(getContext(), FileOperateUtil.TYPE_THUMBNAIL, videoSavePath);
File folder=new File(mThumbnailFolder);
if(!folder.exists()){
folder.mkdirs();
}
File file=new File(mRecordPath);
file=new File(folder+File.separator+file.getName().replace("3gp", "jpg"));
- //ͼƬСͼ
+ //存图片小图
BufferedOutputStream bufferos=new BufferedOutputStream(new FileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG,100, bufferos);
bufferos.flush();
@@ -234,7 +245,7 @@ private Bitmap saveThumbnail() throws FileNotFoundException, IOException {
}
/**
- * ȡ֡ͼĸ߿
+ * 获取帧缩略图,根据容器的高宽进行缩放
* @param filePath
* @return
*/
@@ -265,10 +276,10 @@ public Bitmap getVideoThumbnail(String filePath) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
Log.i(TAG, "bitmap:"+width+" "+height);
- int pWidth=getWidth();//
- int pHeight=getHeight();//߶
+ int pWidth=getWidth();// 容器宽度
+ int pHeight=getHeight();//容器高度
Log.i(TAG, "parent:"+pWidth+" "+pHeight);
- //ȡ߸ȽСıԴΪ
+ //获取宽高跟容器宽高相比较小的倍数,以此为标准进行缩放
float scale = Math.min((float)width/pWidth, (float)height/pHeight);
Log.i(TAG, scale+"");
int w = Math.round(scale * pWidth);
@@ -279,7 +290,7 @@ public Bitmap getVideoThumbnail(String filePath) {
}
/**
- * תǰúͺ
+ * 转换前置和后置照相机
*/
@Override
public void switchCamera(){
@@ -299,7 +310,7 @@ public void switchCamera(){
}
/**
- * ݵǰ״̬(ǰû)Ӧ
+ * 根据当前照相机状态(前置或后置),打开对应相机
*/
private boolean openCamera() {
if (mCamera != null) {
@@ -307,7 +318,6 @@ private boolean openCamera() {
mCamera.release();
mCamera = null;
}
-
if(mIsFrontCamera){
Camera.CameraInfo cameraInfo=new CameraInfo();
for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
@@ -335,7 +345,7 @@ private boolean openCamera() {
}
/**
- * ȡǰ
+ * 获取当前闪光灯类型
* @return
*/
@Override
@@ -344,7 +354,7 @@ public FlashMode getFlashMode() {
}
/**
- *
+ * 设置闪光灯类型
* @param flashMode
*/
@Override
@@ -374,12 +384,13 @@ public void takePicture(PictureCallback callback,TakePictureListener listener){
}
/**
- * ֶ۽
- * @param point
+ * 手动聚焦
+ * @param point 触屏坐标
*/
protected void onFocus(Point point,AutoFocusCallback callback){
+ this.autoFocus = callback;
Camera.Parameters parameters=mCamera.getParameters();
- //֧Զ۽ʹԶ۽
+ //不支持设置自定义聚焦,则使用自动聚焦,返回
if (parameters.getMaxNumFocusAreas()<=0) {
mCamera.autoFocus(callback);
return;
@@ -396,8 +407,8 @@ protected void onFocus(Point point,AutoFocusCallback callback){
areas.add(new Area(new Rect(left,top,right,bottom), 100));
parameters.setFocusAreas(areas);
try {
- //ʹõСֻþ۽ʱ쳣־ǿַܲתintʱˣ
- //ĿС˿ܲ뵼£ڴtryʵʾ۽ЧûӰ
+ //本人使用的小米手机在设置聚焦区域的时候经常会出异常,看日志发现是框架层的字符串转int的时候出错了,
+ //目测是小米修改了框架层代码导致,在此try掉,对实际聚焦效果没影响
mCamera.setParameters(parameters);
} catch (Exception e) {
// TODO: handle exception
@@ -407,7 +418,7 @@ protected void onFocus(Point point,AutoFocusCallback callback){
}
/**
- * ȡżΪ40
+ * 获取最大缩放级别,最大为40
* @return
*/
@Override
@@ -418,15 +429,15 @@ public int getMaxZoom(){
return parameters.getMaxZoom()>40?40:parameters.getMaxZoom();
}
/**
- * ż
+ * 设置相机缩放级别
* @param zoom
*/
@Override
public void setZoom(int zoom){
if(mCamera==null) return;
Camera.Parameters parameters;
- //ע˴Ϊ¼ģʽµsetZoomʽCamera.unlock֮getParametersandroidܵײ쳣
- //stackoverflowϿĽڶ߳ͬʱCameraµijͻڴʹ¼ǰmParameters
+ //注意此处为录像模式下的setZoom方式。在Camera.unlock之后,调用getParameters方法会引起android框架底层的异常
+ //stackoverflow上看到的解释是由于多线程同时访问Camera导致的冲突,所以在此使用录像前保存的mParameters。
if(mParameters!=null)
parameters=mParameters;
else {
@@ -444,48 +455,52 @@ public int getZoom(){
}
/**
- *
+ * 设置照相机参数
*/
private void setCameraParameters(){
Camera.Parameters parameters = mCamera.getParameters();
- // ѡʵԤߴ
- List sizeList = parameters.getSupportedPreviewSizes();
- if (sizeList.size()>0) {
- Size cameraSize=sizeList.get(0);
- //ԤͼƬС
- parameters.setPreviewSize(cameraSize.width, cameraSize.height);
- }
-
- //ɵͼƬС
- sizeList = parameters.getSupportedPictureSizes();
- if (sizeList.size()>0) {
- Size cameraSize=sizeList.get(0);
- for (Size size : sizeList) {
- //С100W
- if (size.width*size.height<100*10000) {
- cameraSize=size;
- break;
- }
- }
- parameters.setPictureSize(cameraSize.width, cameraSize.height);
+ // 选择合适的预览尺寸
+// List sizeList = parameters.getSupportedPreviewSizes();
+// if (sizeList.size()>0) {
+// Size cameraSize=sizeList.get(0);
+// //预览图片大小
+// parameters.setPreviewSize(cameraSize.width, cameraSize.height);
+// }
+//
+// //设置生成的图片大小
+// sizeList = parameters.getSupportedPictureSizes();
+// if (sizeList.size()>0) {
+// Size cameraSize=sizeList.get(0);
+// for (Size size : sizeList) {
+// //小于100W像素
+// if (size.width*size.height<100*10000) {
+// cameraSize=size;
+// break;
+// }
+// }
+// parameters.setPictureSize(cameraSize.width, cameraSize.height);
+// }
+// //设置图片格式
+// parameters.setPictureFormat(ImageFormat.JPEG);
+// parameters.setJpegQuality(100);
+// parameters.setJpegThumbnailQuality(100);
+// //自动聚焦模式
+ if(mIsFrontCamera){
+ parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
+ }else{
+ parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);//前摄像头会崩溃
}
- //ͼƬʽ
- parameters.setPictureFormat(ImageFormat.JPEG);
- parameters.setJpegQuality(100);
- parameters.setJpegThumbnailQuality(100);
- //Զ۽ģʽ
- parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
mCamera.setParameters(parameters);
- //ģʽ˴Ҫݻٺؽ֮ǰ״̬
- setFlashMode(mFlashMode);
- //ż
+ //设置闪光灯模式。此处主要是用于在相机摧毁后又重建,保持之前的状态
+// setFlashMode(mFlashMode);
+ //设置缩放级别
setZoom(mZoom);
- //Ļ
+ //开启屏幕朝向监听
startOrientationChangeListener();
}
/**
- * Ļı Ļлʱı䱣ͼƬķ
+ * 启动屏幕朝向改变监听函数 用于在屏幕横竖屏切换时改变保存的图片的方向
*/
private void startOrientationChangeListener() {
OrientationEventListener mOrEventListener = new OrientationEventListener(getContext()) {
@@ -515,36 +530,50 @@ else if((rotation > 225) && (rotation <= 315)) {
}
/**
- * ݵǰıͼƬתǶ
+ * 根据当前朝向修改保存图片的旋转角度
*/
private void updateCameraOrientation(){
if(mCamera!=null){
Camera.Parameters parameters = mCamera.getParameters();
- //rotationΪ 090180270ˮƽΪ0
+ //rotation参数为 0、90、180、270。水平方向为0。
int rotation=90+mOrientation==360?0:90+mOrientation;
- //ǰͷҪԴֱ任Ƭǵߵ
+ //前置摄像头需要对垂直方向做变换,否则照片是颠倒的
if(mIsFrontCamera){
if(rotation==90) rotation=270;
else if (rotation==270) rotation=90;
}
- parameters.setRotation(rotation);//ɵͼƬת90
- //ԤͼƬת90
- mCamera.setDisplayOrientation(90);//Ԥת90
+ parameters.setRotation(rotation);//生成的图片转90°
+ //预览图片旋转90°
+ mCamera.setDisplayOrientation(90);//预览转90°
mCamera.setParameters(parameters);
}
}
/**
- * @Description: ö ĬΪر
+ * @Description: 闪光灯类型枚举 默认为关闭
*/
public enum FlashMode{
- /** ON:ʱ */
+ /** ON:拍照时打开闪光灯 */
ON,
- /** OFF */
+ /** OFF:不打开闪光灯 */
OFF,
- /** AUTOϵͳǷ */
+ /** AUTO:系统决定是否打开闪光灯 */
AUTO,
- /** TORCHһֱ */
+ /** TORCH:一直打开闪光灯 */
TORCH
}
+
+ public void setAutoFocus(AutoFocusCallback autoFocusCallback) {
+ this.autoFocus = autoFocusCallback;
+
+ }
+ /**
+ * 设置视频保存路径
+ * @param videoSavePath
+ */
+ public void setSaveVideoPath(String videoSavePath) {
+ this.videoSavePath = videoSavePath;
+ }
+
+
}
\ No newline at end of file
diff --git a/CameraLibrary/src/com/linj/camera/view/FocusImageView.java b/CameraLibrary/src/com/linj/camera/view/FocusImageView.java
index b9340fd..3332f4b 100644
--- a/CameraLibrary/src/com/linj/camera/view/FocusImageView.java
+++ b/CameraLibrary/src/com/linj/camera/view/FocusImageView.java
@@ -2,29 +2,25 @@
-import com.linj.cameralibrary.R;
-
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Point;
import android.os.Handler;
-import android.os.SystemClock;
import android.util.AttributeSet;
+import android.util.DisplayMetrics;
import android.view.View;
-import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
-import android.view.animation.Animation.AnimationListener;
-import android.widget.FrameLayout;
import android.widget.ImageView;
-import android.widget.FrameLayout.LayoutParams;
import android.widget.RelativeLayout;
+import com.linj.cameralibrary.R;
+
/**
* @ClassName: FocusImageView
- * @Description:۽ʱʾImagView
+ * @Description:聚焦时显示的ImagView
* @author LinJ
- * @date 2015-1-4 2:55:34
+ * @date 2015-1-4 下午2:55:34
*
*/
public class FocusImageView extends ImageView {
@@ -53,29 +49,29 @@ public FocusImageView(Context context, AttributeSet attrs) {
mFocusFailedImg=a.getResourceId(R.styleable.FocusImageView_focus_fail_id, NO_ID);
a.recycle();
- //۽ͼƬΪ
+ //聚焦图片不能为空
if (mFocusImg==NO_ID||mFocusSucceedImg==NO_ID||mFocusFailedImg==NO_ID)
throw new RuntimeException("Animation is null");
}
/**
- * ʾ۽ͼ
- * @param x x
- * @param y y
+ * 显示聚焦图案
+ * @param x 触屏的x坐标
+ * @param y 触屏的y坐标
*/
public void startFocus(Point point){
if (mFocusImg==NO_ID||mFocusSucceedImg==NO_ID||mFocusFailedImg==NO_ID)
throw new RuntimeException("focus image is null");
- //ݴþ۽ͼλ
+ //根据触摸的坐标设置聚焦图案的位置
RelativeLayout.LayoutParams params=(RelativeLayout.LayoutParams) getLayoutParams();
params.topMargin= point.y-getHeight()/2;
params.leftMargin=point.x-getWidth()/2;
setLayoutParams(params);
- //ÿؼɼʼ
+ //设置控件可见,并开始动画
setVisibility(View.VISIBLE);
setImageResource(mFocusImg);
startAnimation(mAnimation);
- //3Viewڴ˴ڿܾ۽¼ܲ
+ //3秒后隐藏View。在此处设置是由于可能聚焦事件可能不触发。
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
@@ -86,11 +82,18 @@ public void run() {
}
/**
- * ۽ɹص
+ * 聚焦成功回调
*/
public void onFocusSuccess(){
+ RelativeLayout.LayoutParams params=(RelativeLayout.LayoutParams) getLayoutParams();
+ if(params.topMargin==0&¶ms.leftMargin==0){
+ DisplayMetrics metrics = getResources().getDisplayMetrics();
+ params.topMargin= metrics.heightPixels/2-getHeight()/2;
+ params.leftMargin=metrics.widthPixels/2-getWidth()/2;
+ setLayoutParams(params);
+ }
setImageResource(mFocusSucceedImg);
- //ƳstartFocusõcallback1ظÿؼ
+ //移除在startFocus中设置的callback,1秒后隐藏该控件
mHandler.removeCallbacks(null, null);
mHandler.postDelayed(new Runnable() {
@Override
@@ -103,11 +106,18 @@ public void run() {
}
/**
- * ۽ʧܻص
+ * 聚焦失败回调
*/
public void onFocusFailed(){
+ RelativeLayout.LayoutParams params=(RelativeLayout.LayoutParams) getLayoutParams();
+ if(params.topMargin==0&¶ms.leftMargin==0){
+ DisplayMetrics metrics = getResources().getDisplayMetrics();
+ params.topMargin= metrics.heightPixels/2-getHeight()/2;
+ params.leftMargin=metrics.widthPixels/2-getWidth()/2;
+ setLayoutParams(params);
+ }
setImageResource(mFocusFailedImg);
- //ƳstartFocusõcallback1ظÿؼ
+ //移除在startFocus中设置的callback,1秒后隐藏该控件
mHandler.removeCallbacks(null, null);
mHandler.postDelayed(new Runnable() {
@Override
@@ -119,7 +129,7 @@ public void run() {
}
/**
- * ÿʼ۽ʱͼƬ
+ * 设置开始聚焦时的图片
* @param focus
*/
public void setFocusImg(int focus) {
@@ -127,7 +137,7 @@ public void setFocusImg(int focus) {
}
/**
- * þ۽ɹʾͼƬ
+ * 设置聚焦成功显示的图片
* @param focusSucceed
*/
public void setFocusSucceedImg(int focusSucceed) {
diff --git a/CameraLibrary/src/com/linj/camera/view/TempImageView.java b/CameraLibrary/src/com/linj/camera/view/TempImageView.java
index 7bc5a5c..fe3774e 100644
--- a/CameraLibrary/src/com/linj/camera/view/TempImageView.java
+++ b/CameraLibrary/src/com/linj/camera/view/TempImageView.java
@@ -19,9 +19,9 @@
/**
* @ClassName: TempImageView
- * @Description: ʱImageViewִһԶ
+ * @Description: 临时ImageView,在执行完一个动画后自动隐藏
* @author LinJ
- * @date 2014-12-31 9:45:34
+ * @date 2014-12-31 上午9:45:34
*
*/
public class TempImageView extends ImageView implements AnimationListener{
@@ -29,15 +29,15 @@ public class TempImageView extends ImageView implements AnimationListener{
public final static String TAG="TempImageView";
/**
- * ڵĶID
+ * 不存在的动画ID
*/
public static final int NO_ID=-1;
/**
- * õĶЧID
+ * 设置的动画效果ID
*/
private int mAnimationID=NO_ID;
- /** նӿ */
+ /** 拍照动作监听接口 */
private TakePictureListener mListener;
private boolean mIsVideo;
@@ -67,7 +67,7 @@ public void onAnimationEnd(Animation animation) {
Bitmap bm = null;
if(drawable!=null&&drawable instanceof BitmapDrawable)
bm=((BitmapDrawable)drawable).getBitmap();
- //ӿڲΪգִս
+ //相机监听接口不为空,则执行拍照结束操作
if (mListener!=null) mListener.onAnimtionEnd(bm,mIsVideo);
}
@@ -79,7 +79,7 @@ public void onAnimationRepeat(Animation animation) {
/**
- * @Description: ʼ
+ * @Description: 开始动画
* @param
* @return void
* @throws
@@ -90,8 +90,8 @@ public void startAnimation(){
/**
- * @Description: ʼ
- * @param @param resourceID ԴID
+ * @Description: 开始动画
+ * @param @param resourceID 动画资源的ID
* @return void
* @throws
*/
diff --git a/CameraLibrary/src/com/linj/imageloader/DisplayImageOptions.java b/CameraLibrary/src/com/linj/imageloader/DisplayImageOptions.java
index c4bd0d0..b5ea8ac 100644
--- a/CameraLibrary/src/com/linj/imageloader/DisplayImageOptions.java
+++ b/CameraLibrary/src/com/linj/imageloader/DisplayImageOptions.java
@@ -5,9 +5,9 @@
/**
* @ClassName: DisplayImageOptions
-* @Description: ͼƬز
+* @Description: 图片加载参数
* @author LinJ
-* @date 2015-1-8 9:47:04
+* @date 2015-1-8 上午9:47:04
*
*/
public class DisplayImageOptions {
@@ -36,8 +36,8 @@ public static class Builder{
private BitmapDisplayer displayer;
private boolean fromNet;
/**
- * ͼƬʾͼƬ
- * @param imageRes ͼƬID
+ * 设置 加载图片中显示的图片
+ * @param imageRes 图片ID
* @return
*/
public Builder showImageOnLoading(int imageRes) {
@@ -45,8 +45,8 @@ public Builder showImageOnLoading(int imageRes) {
return this;
}
/**
- * üͼƬʧʾͼƬ
- * @param imageRes ͼƬID
+ * 设置加载图片失败显示的图片
+ * @param imageRes 图片ID
* @return
*/
public Builder showImageOnFail(int imageRes) {
@@ -54,7 +54,7 @@ public Builder showImageOnFail(int imageRes) {
return this;
}
/**
- * Ƿڴл
+ * 设置是否在内存中缓存
* @param cacheInMemory
* @return
*/
@@ -63,7 +63,7 @@ public Builder cacheInMemory(boolean cacheInMemory) {
return this;
}
/**
- * Ƿsdϻ
+ * 设置是否在sd卡上缓存
* @param cacheOnDisk
* @return
*/
@@ -72,7 +72,7 @@ public Builder cacheOnDisk(boolean cacheOnDisk) {
return this;
}
/**
- * ͼƬʾ
+ * 图片显示器
* @param displayer
* @return
*/
@@ -82,7 +82,7 @@ public Builder displayer(BitmapDisplayer displayer) {
return this;
}
/**
- * ǷͼƬ
+ * 设置是否加载网络图片
* @param fromNet
* @return
*/
@@ -91,11 +91,11 @@ public Builder setFromNet(boolean fromNet) {
return this;
}
/**
- * DisplayImageOptions
+ * 创建DisplayImageOptions对象
* @return
*/
public DisplayImageOptions build() {
- //builderֶεķǿж
+ //在这里做builder所有字段的非空判断
return new DisplayImageOptions(this);
}
diff --git a/CameraLibrary/src/com/linj/imageloader/DownloadImgUtils.java b/CameraLibrary/src/com/linj/imageloader/DownloadImgUtils.java
index 5cbeb86..5556f12 100644
--- a/CameraLibrary/src/com/linj/imageloader/DownloadImgUtils.java
+++ b/CameraLibrary/src/com/linj/imageloader/DownloadImgUtils.java
@@ -25,7 +25,7 @@ public class DownloadImgUtils
{
/**
- * urlͼƬָļ
+ * 根据url下载图片在指定的文件
*
* @param urlStr
* @param file
@@ -78,7 +78,7 @@ public static boolean downloadImgByUrl(String urlStr, File file)
}
/**
- * urlͼƬָļ
+ * 根据url下载图片在指定的文件
*
* @param urlStr
* @param file
@@ -99,7 +99,7 @@ public static Bitmap downloadImgByUrl(String urlStr, ImageView imageview)
opts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeStream(is, null, opts);
- //ȡimageviewҪʾĿ
+ //获取imageview想要显示的宽和高
ImageSize imageViewSize = ImageSizeUtil.getImageViewSize(imageview);
opts.inSampleSize = ImageSizeUtil.caculateInSampleSize(opts,
imageViewSize.width, imageViewSize.height);
diff --git a/CameraLibrary/src/com/linj/imageloader/ImageLoader.java b/CameraLibrary/src/com/linj/imageloader/ImageLoader.java
index 75bd18c..85a98c6 100644
--- a/CameraLibrary/src/com/linj/imageloader/ImageLoader.java
+++ b/CameraLibrary/src/com/linj/imageloader/ImageLoader.java
@@ -28,46 +28,46 @@
/**
* @ClassName: ImageLoader
- * @Description: ͼƬ
+ * @Description: 图片加载器
* @author LinJ
- * @date 2015-1-8 9:02:25
+ * @date 2015-1-8 上午9:02:25
*
*/
public class ImageLoader {
private static final String TAG = "ImageLoader";
/**
- *
+ * 单例对象
*/
private static ImageLoader mInstance;
/**
- * Ϣ
+ * 消息队列
*/
private LinkedBlockingDeque mTaskQueue;
/**
- * ͼƬĺĶ
+ * 图片缓存的核心对象
*/
private LruCache mLruCache;
/**
- * ̳߳
+ * 线程池
*/
private ExecutorService mThreadPool;
private static final int DEAFULT_THREAD_COUNT = 1;
/**
- * еĵȷʽ
+ * 队列的调度方式
*/
private Type mType = Type.LIFO;
/**
- * ̨ѯ߳
+ * 后台轮询线程
*/
private Thread mPoolThread;
/**
- * UI߳еHandler
+ * UI线程中的Handler
*/
private Handler mUIHandler;
- /** źſ*/
+ /** 信号控制*/
private Semaphore mSemaphoreThreadPool;
private Context mContext;
@@ -111,29 +111,29 @@ public static ImageLoader getInstance(int threadCount, Type type,Context context
}
/**
- * ʼ
+ * 初始化
*
* @param threadCount
* @param type
*/
private void init(int threadCount, Type type,Context context)
{
- // ȡӦõڴ
+ // 获取我们应用的最大可用内存
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int cacheMemory = maxMemory / 8;
- //ע˴ҪȡȫContextActivityԴͷ
+ //注意此处要获取全局Context,避免引用Activity造成资源无法释放
mContext=context.getApplicationContext();
mLruCache = new LruCache(cacheMemory){
@Override
protected int sizeOf(String key, Bitmap value)
{
// return value.getAllocationByteCount();
- return value.getRowBytes() * value.getHeight(); //ɰ汾
+ return value.getRowBytes() * value.getHeight(); //旧版本方法
}
};
- // ̳߳
+ // 创建线程池
mThreadPool = Executors.newFixedThreadPool(threadCount);
mType = type;
mSemaphoreThreadPool = new Semaphore(threadCount,true);
@@ -141,11 +141,11 @@ protected int sizeOf(String key, Bitmap value)
initBackThread();
}
/**
- * ʼ̨ѯ߳
+ * 初始化后台轮询线程
*/
private void initBackThread()
{
- // ̨ѯ߳
+ // 后台轮询线程
mPoolThread = new Thread()
{
@Override
@@ -153,11 +153,11 @@ public void run()
{
while(true){
try {
- // ȡһźţźţ߳
+ // 获取一个信号,若无可用信号,阻塞线程
mSemaphoreThreadPool.acquire();
- // ̳߳ȥȡһִУΪʱ߳
+ // 线程池去取出一个任务进行执行,当任务队列为空时,阻塞线程
Runnable runnable=getTask();
- //ʹִ̳߳
+ //使用线程池执行任务
mThreadPool.execute(runnable);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
@@ -173,11 +173,11 @@ public void run()
}
/**
- * pathΪimageviewͼƬ
+ * 根据path为imageview设置图片
*
- * @param path ͼƬ·
- * @param imageView ͼƬImageView
- * @param options ͼƬز
+ * @param path 图片路径
+ * @param imageView 加载图片的ImageView
+ * @param options 图片加载参数
* @throws InterruptedException
*/
public void loadImage( String path, ImageView imageView, DisplayImageOptions options)
@@ -189,7 +189,7 @@ public void loadImage( String path, ImageView imageView, DisplayImageOptions op
{
public void handleMessage(Message msg)
{
- // ȡõͼƬΪimageviewصͼƬ
+ // 获取得到图片,为imageview回调设置图片
ImgBeanHolder holder = (ImgBeanHolder) msg.obj;
Bitmap bm = holder.bitmap;
ImageView view = holder.imageView;
@@ -204,7 +204,7 @@ public void handleMessage(Message msg)
};
}
- // pathڻлȡbitmap
+ // 根据path在缓存中获取bitmap
Bitmap bm = getBitmapFromLruCache(path);
if (bm != null)
@@ -217,7 +217,7 @@ public void handleMessage(Message msg)
}
/**
- * ݴIJ½һ
+ * 根据传入的参数,新建一个任务
*
* @param path
* @param imageView
@@ -234,15 +234,15 @@ public void run()
Bitmap bm = null;
if (options.fromNet)
{
- //ȥļв
+ //先去缓存文件夹查找
File file = getDiskCacheDir(imageView.getContext(),
md5(path));
- // ڻļз
+ // 如果在缓存文件中发现
if (file.exists()){
bm = loadImageFromLocal(file.getAbsolutePath(),
imageView);
} else{
- // ǷӲ̻
+ // 检测是否开启硬盘缓存
if (options.cacheOnDisk){
boolean downloadState = DownloadImgUtils
.downloadImgByUrl(path, file);
@@ -258,13 +258,13 @@ public void run()
} else{
bm = loadImageFromLocal(path, imageView);
}
- // Ƿڴл
+ // 是否开启内存中缓存
if (options.cacheInMemory) {
addBitmapToLruCache(path, bm);
}
- //ϢUI߳
+ //发送消息至UI线程
refreashBitmap(path, imageView, bm,options);
- //ͷź
+ //释放信号
mSemaphoreThreadPool.release();
}
@@ -276,11 +276,11 @@ private Bitmap loadImageFromLocal(final String path,
final ImageView imageView)
{
Bitmap bm;
- // ͼƬ
- // ͼƬѹ
- // 1ͼƬҪʾĴС
+ // 加载图片
+ // 图片的压缩
+ // 1、获得图片需要显示的大小
ImageSize imageSize = ImageSizeUtil.getImageViewSize(imageView);
- // 2ѹͼƬ
+ // 2、压缩图片
bm = decodeSampledBitmapFromPath(path, imageSize.width,
imageSize.height);
return bm;
@@ -288,7 +288,7 @@ private Bitmap loadImageFromLocal(final String path,
/**
- * ǩַֽ࣬
+ * 利用签名辅助类,将字符串字节数组
*
* @param str
* @return
@@ -310,7 +310,7 @@ public String md5(String str)
}
/**
- * ʽ
+ * 方式二
*
* @param bytes
* @return
@@ -321,9 +321,9 @@ public String bytes2hex02(byte[] bytes)
String tmp = null;
for (byte b : bytes)
{
- // ÿֽ0xFF㣬ȻתΪ10ƣȻIntegerתΪ16
+ // 将每个字节与0xFF进行与运算,然后转化为10进制,然后借助于Integer再转化为16进制
tmp = Integer.toHexString(0xFF & b);
- if (tmp.length() == 1)// ÿֽ8ΪתΪ16Ʊ־216λ
+ if (tmp.length() == 1)// 每个字节8为,转为16进制标志,2个16进制位
{
tmp = "0" + tmp;
}
@@ -347,7 +347,7 @@ private void refreashBitmap(String path, ImageView imageView,
}
/**
- * ͼƬLruCache
+ * 将图片加入LruCache
*
* @param path
* @param bm
@@ -361,7 +361,7 @@ protected void addBitmapToLruCache(String path, Bitmap bm)
}
/**
- * ͼƬҪʾĿ߶ͼƬѹ
+ * 根据图片需要显示的宽和高对图片进行压缩
*
* @param path
* @param width
@@ -371,7 +371,7 @@ protected void addBitmapToLruCache(String path, Bitmap bm)
protected Bitmap decodeSampledBitmapFromPath(String path, int width,
int height)
{
- // ͼƬĿߣͼƬصڴ
+ // 获得图片的宽和高,并不把图片加载到内存中
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
@@ -379,7 +379,7 @@ protected Bitmap decodeSampledBitmapFromPath(String path, int width,
options.inSampleSize = ImageSizeUtil.caculateInSampleSize(options,
width, height);
- // ʹûõInSampleSizeٴνͼƬ
+ // 使用获得到的InSampleSize再次解析图片
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(path, options);
return bitmap;
@@ -388,7 +388,7 @@ protected Bitmap decodeSampledBitmapFromPath(String path, int width,
/**
- * ûͼƬĵַ
+ * 获得缓存图片的地址
*
* @param context
* @param uniqueName
@@ -409,7 +409,7 @@ public File getDiskCacheDir(Context context, String uniqueName)
}
/**
- * pathڻлȡbitmap
+ * 根据path在缓存中获取bitmap
*
* @param key
* @return
@@ -421,7 +421,7 @@ private Bitmap getBitmapFromLruCache(String key)
/**
- * ȡһΪʱ÷
+ * 从任务队列取出一个方法,当队列为空时,将阻塞该方法
*
* @return
* @throws InterruptedException
@@ -437,7 +437,7 @@ private Runnable getTask() throws InterruptedException
}
}
/**
- *
+ * 将任务添加入队列
* @param runnable
* @throws InterruptedException
*/
diff --git a/CameraLibrary/src/com/linj/imageloader/ImageSizeUtil.java b/CameraLibrary/src/com/linj/imageloader/ImageSizeUtil.java
index 81623f0..b3cdb62 100644
--- a/CameraLibrary/src/com/linj/imageloader/ImageSizeUtil.java
+++ b/CameraLibrary/src/com/linj/imageloader/ImageSizeUtil.java
@@ -14,7 +14,7 @@
public class ImageSizeUtil
{
/**
- * ĿԼͼƬʵʵĿSampleSize
+ * 根据需求的宽和高以及图片实际的宽和高计算SampleSize
*
* @param options
* @param width
@@ -41,7 +41,7 @@ public static int caculateInSampleSize(Options options, int reqWidth,
}
/**
- * ImageViewʵѹĿ
+ * 根据ImageView获适当的压缩的宽和高
*
* @param imageView
* @return
@@ -56,14 +56,14 @@ public static ImageSize getImageViewSize(ImageView imageView)
LayoutParams lp = imageView.getLayoutParams();
- int width = imageView.getWidth();// ȡimageviewʵʿ
+ int width = imageView.getWidth();// 获取imageview的实际宽度
if (width <= 0)
{
- width = lp.width;// ȡimageviewlayoutĿ
+ width = lp.width;// 获取imageview在layout中声明的宽度
}
if (width <= 0)
{
- //width = imageView.getMaxWidth();// ֵ
+ //width = imageView.getMaxWidth();// 检查最大值
width = getImageViewFieldValue(imageView, "mMaxWidth");
}
if (width <= 0)
@@ -71,14 +71,14 @@ public static ImageSize getImageViewSize(ImageView imageView)
width = displayMetrics.widthPixels;
}
- int height = imageView.getHeight();// ȡimageviewʵʸ߶
+ int height = imageView.getHeight();// 获取imageview的实际高度
if (height <= 0)
{
- height = lp.height;// ȡimageviewlayoutĿ
+ height = lp.height;// 获取imageview在layout中声明的宽度
}
if (height <= 0)
{
- height = getImageViewFieldValue(imageView, "mMaxHeight");// ֵ
+ height = getImageViewFieldValue(imageView, "mMaxHeight");// 检查最大值
}
if (height <= 0)
{
@@ -97,7 +97,7 @@ public static class ImageSize
}
/**
- * ͨȡimageviewijֵ
+ * 通过反射获取imageview的某个属性值
*
* @param object
* @param fieldName
diff --git a/CameraLibrary/src/com/linj/imageloader/displayer/MatrixBitmapDisplayer.java b/CameraLibrary/src/com/linj/imageloader/displayer/MatrixBitmapDisplayer.java
index 0c35a21..27945b2 100644
--- a/CameraLibrary/src/com/linj/imageloader/displayer/MatrixBitmapDisplayer.java
+++ b/CameraLibrary/src/com/linj/imageloader/displayer/MatrixBitmapDisplayer.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright 2011-2013 Sergey Tarasevich, Daniel Mart
+ * Copyright 2011-2013 Sergey Tarasevich, Daniel Martí
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,9 +22,9 @@
/**
* @ClassName: MatrixBitmapDisplayer
-* @Description: MatrixЧBitmapDisplayer
+* @Description: Matrix效果的BitmapDisplayer
* @author LinJ
-* @date 2015-1-8 9:54:22
+* @date 2015-1-8 上午9:54:22
*
*/
public class MatrixBitmapDisplayer implements BitmapDisplayer {
@@ -35,14 +35,14 @@ public MatrixBitmapDisplayer() {
@Override
public void display(Bitmap bitmap, ImageView imageView) {
- //ͼƬΪFIT_CENTER
+ //正常的图片设置为FIT_CENTER
imageView.setScaleType(ScaleType.FIT_CENTER);
imageView.setImageBitmap(bitmap);
}
@Override
public void display(int resouceID, ImageView imageView) {
- // ǰͳĵͼƬԶ
+ // 加载前和出错的的图片不自动拉伸
imageView.setScaleType(ScaleType.CENTER);
imageView.setImageResource(resouceID);
}
diff --git a/CameraLibrary/src/com/linj/imageloader/displayer/RoundedBitmapDisplayer.java b/CameraLibrary/src/com/linj/imageloader/displayer/RoundedBitmapDisplayer.java
index 09c472d..7f6d7c6 100644
--- a/CameraLibrary/src/com/linj/imageloader/displayer/RoundedBitmapDisplayer.java
+++ b/CameraLibrary/src/com/linj/imageloader/displayer/RoundedBitmapDisplayer.java
@@ -27,9 +27,9 @@
/**
* @ClassName: RoundedBitmapDisplayer
-* @Description: ԲͼƬ
+* @Description: 圆形图片
* @author LinJ
-* @date 2015-1-8 9:47:31
+* @date 2015-1-8 上午9:47:31
*
*/
public class RoundedBitmapDisplayer implements BitmapDisplayer {
diff --git a/CameraLibrary/src/com/linj/video/view/VideoPlayerContainer.java b/CameraLibrary/src/com/linj/video/view/VideoPlayerContainer.java
index dc5c20f..bf6b58b 100644
--- a/CameraLibrary/src/com/linj/video/view/VideoPlayerContainer.java
+++ b/CameraLibrary/src/com/linj/video/view/VideoPlayerContainer.java
@@ -31,9 +31,9 @@
/**
* @ClassName: VideoContainer
- * @Description: ƵƵһЩؼƵSurfaceView
+ * @Description: 视频播放器容器,包含了视频操作的一些控件和视频播放SurfaceView
* @author LinJ
- * @date 2015-1-21 4:49:31
+ * @date 2015-1-21 下午4:49:31
*
*/
public class VideoPlayerContainer extends LinearLayout implements OnClickListener
@@ -97,7 +97,7 @@ public void playVideo(String path) throws IllegalArgumentException, SecurityExce
@Override
public void onCompletion(MediaPlayer mp) {
- // Žظÿؼ
+ // 播放结束,隐藏该控件
setVisibility(View.GONE);
mProgressBar.setProgress(0);
mCurrentTimeView.setText("00:00");
@@ -106,21 +106,21 @@ public void onCompletion(MediaPlayer mp) {
@Override
public void onSeekComplete(MediaPlayer mp) {
- // תָʱָ
+ // 跳转至指定时间后,恢复播放
resumePlay();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
- // ʹframelayout֣Ϊ˷ֹ¼··viewڴ˴¼
+ // 由于在使用了framelayout布局,为了防止点击事件下发给下方的view,在此处捕获掉点击事件。
return true;
}
@Override
public void onPrepared(MediaPlayer mp) {
- //ţʾÿؼ
+ //准备播放,显示该控件
setVisibility(View.VISIBLE);
int duration=mp.getDuration();
- //¼λ
+ //设置最大事件,单位秒
mDurationView.setText(mTimeFormat.format(new Date(duration)));
mProgressBar.setMax((int) Math.floor(duration/1000));
mp.start();
@@ -149,7 +149,7 @@ public void onClick(View v) {
}
}
/**
- * ָ
+ * 恢复播放
*/
@Override
public void resumePlay() {
@@ -160,7 +160,7 @@ public void resumePlay() {
}
/**
- * ͣ
+ * 暂停播放
*/
@Override
public void pausedPlay() {
diff --git a/CameraLibrary/src/com/linj/video/view/VideoPlayerOperation.java b/CameraLibrary/src/com/linj/video/view/VideoPlayerOperation.java
index 330299c..741984b 100644
--- a/CameraLibrary/src/com/linj/video/view/VideoPlayerOperation.java
+++ b/CameraLibrary/src/com/linj/video/view/VideoPlayerOperation.java
@@ -4,9 +4,9 @@
/**
* @ClassName: VideoPlayerOperation
-* @Description: Ƶӿ
+* @Description: 视频播放器操作接口
* @author LinJ
-* @date 2015-1-27 1:59:38
+* @date 2015-1-27 下午1:59:38
*
*/
public interface VideoPlayerOperation {
diff --git a/CameraLibrary/src/com/linj/video/view/VideoPlayerView.java b/CameraLibrary/src/com/linj/video/view/VideoPlayerView.java
index e849da0..686e00e 100644
--- a/CameraLibrary/src/com/linj/video/view/VideoPlayerView.java
+++ b/CameraLibrary/src/com/linj/video/view/VideoPlayerView.java
@@ -21,9 +21,9 @@
/**
* @ClassName: VideoSurfaceView
- * @Description: MediaPlayerSurfaceViewԲƵ
+ * @Description: 和MediaPlayer绑定的SurfaceView,用以播放视频
* @author LinJ
- * @date 2015-1-21 2:38:53
+ * @date 2015-1-21 下午2:38:53
*
*/
public class VideoPlayerView extends SurfaceView implements VideoPlayerOperation {
@@ -39,15 +39,15 @@ public VideoPlayerView(Context context, AttributeSet attrs) {
}
/**
- * ʼ
+ * 初始化
*/
private void init() {
mMediaPlayer=new MediaPlayer();
- //ʼ
+ //初始化容器
getHolder().addCallback(callback);
}
/**
- * ò
+ * 设置播放器监听函数
* @param listener
*/
protected void setPalyerListener(PlayerListener listener){
@@ -56,7 +56,7 @@ protected void setPalyerListener(PlayerListener listener){
mMediaPlayer.setOnPreparedListener(listener);
}
/**
- * ȡǰǷڲ״̬
+ * 获取当前播放器是否在播放状态
* @return
*/
@Override
@@ -65,7 +65,7 @@ public boolean isPlaying(){
}
/**
- * ȡǰʱ䣬λ
+ * 获取当前播放时间,单位毫秒
* @return
*/
@Override
@@ -88,23 +88,23 @@ public void resumePlay() {
}
/**
- * õǰλ
+ * 设置当前播放位置
*/
@Override
public void seekPosition(int position){
if(isPlaying())
mMediaPlayer.pause();
- //õʱֵƵʱֹͣ
+ //当设置的时间值大于视频最大长度时,停止播放
if(position<0||position>mMediaPlayer.getDuration()){
mMediaPlayer.stop();
return;
}
- //ʱ
+ //设置时间
mMediaPlayer.seekTo(position);
}
/**
- * ֹͣ
+ * 停止播放
*/
@Override
public void stopPlay() {
@@ -138,16 +138,16 @@ public void playVideo(String path) throws IllegalArgumentException, SecurityExce
if(mMediaPlayer!=null&&mMediaPlayer.isPlaying()){
mMediaPlayer.stop();
}
- mMediaPlayer.reset(); //resetò
+ mMediaPlayer.reset(); //reset重新设置播放器引擎
mMediaPlayer.setDataSource(path);
mMediaPlayer.prepare();
}
/**
* @ClassName: PlayerListener
- * @Description: Ͻӿڣcontainerʵָýӿ
+ * @Description: 集合接口,container实现该接口
* @author LinJ
- * @date 2015-1-23 3:09:15
+ * @date 2015-1-23 下午3:09:15
*
*/
public interface PlayerListener extends OnCompletionListener,