目录
一、图库应用的作用和重要性
二、图库应用的类型和功能
三、图库应用的架构和组件
四、图库应用的定制和扩展
下表介绍了图库应用的作用和重要性:
作用和重要性 | 说明 |
---|---|
浏览和管理照片和视频 | Gallery应用允许用户浏览、管理和共享手机中的照片和视频文件。它提供了直观的界面和丰富的功能,让用户能够方便地查看、分类、编辑和删除媒体文件。 |
媒体文件管理 | Gallery应用充当了一个中心化的媒体文件管理器,允许用户在手机内存或SD卡中查找、组织和管理媒体文件夹和相册。用户可以创建新的相册、重命名、移动或删除相册、添加或移动照片和视频文件。 |
分享和共享媒体文件 | Gallery应用提供了多种分享和共享媒体文件的方式。用户可以通过Gallery应用将照片和视频分享到社交媒体平台、发送给朋友或通过其他应用进行处理。 |
编辑和调整媒体文件 | Gallery应用提供了基本的图像和视频编辑功能,如裁剪、旋转、调整亮度和对比度、应用滤镜效果等。用户可以在Gallery应用中对媒体文件进行简单的编辑和优化,而无需依赖第三方应用。 |
相册同步和备份 | 一些Gallery应用还支持相册同步和备份功能。它们可以与云存储服务(如Google相册)集成,自动将用户的照片和视频备份到云端,以便在不同设备之间同步和恢复。 |
个性化和自定义 | Gallery应用通常允许用户进行个性化和自定义设置,如更改照片展示方式、设置默认媒体文件夹、创建幻灯片播放等。这样用户可以根据自己的喜好和需求,定制Gallery应用的外观和功能。 |
图库应用在Android设备中扮演着重要角色,为用户提供了方便的媒体文件管理和浏览体验,并提供了一系列功能来编辑、分享和备份照片和视频。
下表介绍了图库应用的类型和功能:
类型 | 功能 |
---|---|
系统默认Gallery应用 | 系统默认的Gallery应用是Android设备预装的官方应用,提供了基本的媒体文件浏览、管理和分享功能,包括查看照片和视频、创建相册、编辑照片、分享到社交媒体等。 |
第三方Gallery应用 | 第三方Gallery应用是由开发者独立开发的媒体文件管理应用,通常提供更丰富的功能和个性化设置选项,如更多的编辑工具、滤镜效果、私密相册、云同步等。 |
云存储相册应用 | 云存储相册应用允许用户将照片和视频备份到云端,并在多个设备之间同步和访问。它们通常与云服务(如Google相册、iCloud相册等)集成,提供了自动备份、相册同步、共享相册等功能。 |
社交媒体相册应用 | 社交媒体相册应用是专门用于分享和展示照片和视频的应用,如Instagram、Facebook等。它们提供了社交化的功能,如上传照片、添加标签、浏览朋友的相片等,同时支持多种滤镜和特效。 |
专业摄影相册应用 | 专业摄影相册应用针对摄影爱好者和专业摄影师,提供了更高级的图像处理和编辑功能,如RAW格式支持、高级调色、图层编辑、批量处理等,以满足专业摄影需求。 |
个人定制相册应用 | 个人定制相册应用是一类由用户自定义和定制的媒体文件管理应用,用户可以根据自己的喜好和需求,选择相应的功能和界面样式,如幻灯片播放、照片墙展示、时间轴查看等。 |
Android中存在多种不同类型的图库应用,从系统默认的应用到第三方开发的应用,以及特定功能和用途的应用。每种类型的图库应用都提供了不同的功能和特点,以满足用户的不同需求和喜好。
下表是图库应用的架构和组件:
架构 | 组件 |
---|---|
MVC架构 | - Model: 数据层,负责管理和处理媒体文件的数据,如照片和视频的存储、读取、编辑等。 - View: 视图层,负责展示媒体文件的界面和交互,如相册界面、照片浏览界面等。 - Controller: 控制层,负责协调Model和View之间的交互,处理用户的操作事件和业务逻辑。 |
MVP架构 | - Model: 数据层,负责管理和处理媒体文件的数据,如照片和视频的存储、读取、编辑等。 - View: 视图层,负责展示媒体文件的界面和交互,如相册界面、照片浏览界面等,同时将用户的操作事件传递给Presenter。 - Presenter: 表现层,负责处理View层和Model层之间的交互,包括数据的获取和更新、业务逻辑的处理等。 |
MVVM架构 | - Model: 数据层,负责管理和处理媒体文件的数据,如照片和视频的存储、读取、编辑等。 - View: 视图层,负责展示媒体文件的界面和交互,如相册界面、照片浏览界面等,通过数据绑定将界面与ViewModel关联。 - ViewModel: 视图模型层,负责管理和处理与界面相关的数据和逻辑,提供数据绑定和事件驱动的方式更新界面。 |
在Android中,图库应用可以使用不同的架构来组织和管理代码,常见的有MVC、MVP和MVVM架构。这些架构都分离了数据、界面和业务逻辑,使得应用的开发和维护更加模块化和可扩展。不同的架构在组件的划分和交互方式上略有不同,但都旨在实现代码的解耦和可测试性。
以gallery应用的需求为例:
解决方案:
1.在ViewImage类的setupOnTouchListeners()实现onLongPress()方法,并添加弹出菜单的逻辑:
@Override
public void onLongPress(MotionEvent e) {
mImageView.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
mImageMenuRunnable = MenuHelper.addImageMenuItems(
menu,
MenuHelper.INCLUDE_ALL,
ViewImage.this,
mHandler,
mDeletePhotoRunnable,
new MenuHelper.MenuInvoker() {
public void run(final MenuHelper.MenuCallback cb) {
if (mPaused) return;
setMode(MODE_NORMAL);
IImage image = mAllImages.getImageAt(mCurrentPosition);
Uri uri = image.fullSizeImageUri();
cb.run(uri, image);
// We might have deleted all images in the callback, so
// call setImage() only if we still have some images.
if (mAllImages.getCount() > 0) {
mImageView.clear();
setImage(mCurrentPosition, false);
}
}
});
}
});
}
2.自定义内部类MyScaleGestureDetector 并继承ScaleGestureDetector.SimpleOnScaleGestureListener,实现onScale()缩放方法:
private class MyScaleGestureDetector extends
ScaleGestureDetector.SimpleOnScaleGestureListener{
@Override
public boolean onScale(ScaleGestureDetector detector) {
ImageViewTouch imageView = mImageView;
if (null != imageView){
mMatrix.set(imageView.getImageMatrix());
mScaleFactor = detector.getCurrentSpan() / mStartDis;
mMatrix.postScale(mScaleFactor,mScaleFactor,detector.getFocusX(),detector.getFocusY());
imageView.setImageMatrix(mMatrix);
mStartDis = detector.getCurrentSpan();
}
return true;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
mStartDis = detector.getCurrentSpan();
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
}
}
3.在MyGestureListener 类中实现GestureDetector.SimpleOnGestureListener的onFling()方法,添加缩放图片的逻辑代码:
private class MyGestureListener extends
GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//return super.onFling(e1, e2, velocityX, velocityY);
float flingToLeft = e1.getRawX() - e2.getRawX();
float flingToRight = e2.getRawX() - e1.getRawX();
if (flingToLeft > 100 /*&& Math.abs(velocityX) > 100*/){
//Fling left
moveNextOrPrevious(1);
}else if (flingToRight > 100 /*&& Math.abs(velocityX) > 100*/){
//Fling right
moveNextOrPrevious(-1);
}
try {
if (Math.abs(e2.getRawX() - e1.getRawX()) > 100){
return true;
}
if (Math.abs(velocityX) < 100){
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
...
}
4.在GalleryPicker类中自定义一个弹出PopupWindow()的方法,并在主线程中调用该方法:
public void showPopupWindow(){
View contentView = LayoutInflater.from(GalleryPicker.this).inflate(R.layout.popup_layout,null);
mPopWindow = new PopupWindow(contentView, 420, 190, true);
mPopWindow.setContentView(contentView);
mPopSlide = contentView.findViewById(R.id.pop_slide);
mPopView = contentView.findViewById(R.id.pop_view);
mPopSlide.setOnClickListener((View.OnClickListener) this);
mPopView.setOnClickListener((View.OnClickListener) this);
View rootView = LayoutInflater.from(GalleryPicker.this).inflate(R.layout.gallerypicker,null);
mPopWindow.showAtLocation(rootView, Gravity.CENTER,0,0);
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id){
case R.id.pop_title:
break;
case R.id.pop_slide:
mPopSlide.setBackgroundResource(R.drawable.image_select_list_item);
Item item = mAdapter.mItems.get(0);
Uri targetUri = item.mFirstImageUri;
Log.d(TAG,"test touch1");
if (targetUri != null && item.mBucketId != null) {
Log.d(TAG,"test touch2");
targetUri = targetUri.buildUpon()
.appendQueryParameter("bucketId", item.mBucketId)
.build();
}
Intent intent = new Intent(Intent.ACTION_VIEW, targetUri);
intent.putExtra("slideshow", true);
startActivity(intent);
break;
case R.id.pop_view:
mPopView.setBackgroundResource(R.drawable.image_select_list_item);
launchFolderGallery(1);
break;
default:
break;
}
}
5.在overrides中去掉"Gallery",就可以解决Gallery不编译的问题
android_app {
name: "Gallery2",
static_libs: [
"androidx.fragment_fragment",
"androidx.legacy_legacy-support-core-ui",
"androidx.core_core",
"androidx.legacy_legacy-support-v13",
"com.android.gallery3d.common2",
"xmp_toolkit",
"mp4parser",
],
srcs: [
"src/**/*.java",
"src_pd/**/*.java",
],
resource_dirs: ["res"],
product_specific: true,
overrides: [
"Gallery",
"Gallery3D",
"GalleryNew3D",
],
sdk_version: "current",
jni_libs: [
"libjni_eglfence",
"libjni_filtershow_filters",
"libjni_jpegstream",
],
optimize: {
proguard_flags_files: ["proguard.flags"],
},
libs: ["org.apache.http.legacy"],
jarjar_rules: "jarjar-rules.txt",
}
本文仅代表个人观点和经验,难免存在不足之处。如果有任何错误或改进的建议,欢迎指正和交流,共同进步。