系统应用篇(六)--Gallery篇

目录

一、图库应用的作用和重要性

二、图库应用的类型和功能

三、图库应用的架构和组件

四、图库应用的定制和扩展


一、图库应用的作用和重要性

下表介绍了图库应用的作用和重要性:

作用和重要性 说明
浏览和管理照片和视频 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. 为Gallery中的图片添加长按弹出菜单的功能
  2. 为Gallery添加缩放图片的功能
  3. 为Gallery添加触屏滑动上/下一张图片的功能
  4. 新需求:统一图库界面弹出菜单的大小
  5. 修改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",
}

本文仅代表个人观点和经验,难免存在不足之处。如果有任何错误或改进的建议,欢迎指正和交流,共同进步。

你可能感兴趣的:(android基础,Java基础,android,智能手机)