Android进阶 -- 知乎Matisse源码解析(二)

2023-12-24 12:18

本文主要是介绍Android进阶 -- 知乎Matisse源码解析(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇分析了启动MatissActivity之前的逻辑,接下来看MatissActivity。

 

一、实现接口

public class MatisseActivity extends AppCompatActivity implementsAlbumCollection.AlbumCallbacks, AdapterView.OnItemSelectedListener,MediaSelectionFragment.SelectionProvider, View.OnClickListener,AlbumMediaAdapter.CheckStateListener, AlbumMediaAdapter.OnMediaClickListener,AlbumMediaAdapter.OnPhotoCapture 

进入MatissActivity后,首先看到的是实现了茫茫多的接口,我们先明确这些接口的含义,这样会对MatissActivity有一个感性的认识。

(1)AlbumCollection.AlbumCallbacks:这个接口提供了两个方法,onAlbumLoad返回了一个相册成功读取之后的Cursor,onAlbumReset相册重置的回调,通过这个接口,可以知道MatisseActivity有了读取相册的能力。

public interface AlbumCallbacks {void onAlbumLoad(Cursor cursor);void onAlbumReset();}

(2)MediaSelectionFragment.SelectionProvider:这个接口返回了选定内容集合SelectedItemCollection,这个接口,让MatissActivity具有了将选定数据交互出去的能力。

public interface SelectionProvider {SelectedItemCollection provideSelectedItemCollection();}

(3)AlbumMediaAdpter.CheckStateListener:这个接口用来更新选中非选中的状态,用来刷新UI显示

public interface SelectionProvider {SelectedItemCollection provideSelectedItemCollection();}

(4)AlbumMediaAdpter.OnMediaClickListener:这个接口用来响应媒体的点击事件,打开AlbumPreViewActivity进行媒体的预览

public interface OnMediaClickListener {void onMediaClick(Album album, Item item, int adapterPosition);}

(5)AlbumMediaAdpter.OnPhotoCapture:这个接口用来响应拍照的回调

public interface OnPhotoCapture {void capture();}

(6)AdapterView.OnItemSelectedListener和View.OnClickListener小伙伴们都很熟悉了,这里就不再赘述啦。

 

二、执行流程

先来看onCreate

 @Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {// programmatically set theme before super.onCreate()mSpec = SelectionSpec.getInstance();setTheme(mSpec.themeId);super.onCreate(savedInstanceState);if (!mSpec.hasInited) {setResult(RESULT_CANCELED);finish();return;}setContentView(R.layout.activity_matisse);if (mSpec.needOrientationRestriction()) {setRequestedOrientation(mSpec.orientation);}if (mSpec.capture) {mMediaStoreCompat = new MediaStoreCompat(this);if (mSpec.captureStrategy == null)throw new RuntimeException("Don't forget to set CaptureStrategy.");mMediaStoreCompat.setCaptureStrategy(mSpec.captureStrategy);}Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(toolbar);ActionBar actionBar = getSupportActionBar();actionBar.setDisplayShowTitleEnabled(false);actionBar.setDisplayHomeAsUpEnabled(true);Drawable navigationIcon = toolbar.getNavigationIcon();TypedArray ta = getTheme().obtainStyledAttributes(new int[]{R.attr.album_element_color});int color = ta.getColor(0, 0);ta.recycle();navigationIcon.setColorFilter(color, PorterDuff.Mode.SRC_IN);mButtonPreview = (TextView) findViewById(R.id.button_preview);mButtonApply = (TextView) findViewById(R.id.button_apply);mButtonPreview.setOnClickListener(this);mButtonApply.setOnClickListener(this);mContainer = findViewById(R.id.container);mEmptyView = findViewById(R.id.empty_view);mOriginalLayout = findViewById(R.id.originalLayout);mOriginal = findViewById(R.id.original);mOriginalLayout.setOnClickListener(this);mSelectedCollection.onCreate(savedInstanceState);if (savedInstanceState != null) {mOriginalEnable = savedInstanceState.getBoolean(CHECK_STATE);}updateBottomToolbar();mAlbumsAdapter = new AlbumsAdapter(this, null, false);mAlbumsSpinner = new AlbumsSpinner(this);mAlbumsSpinner.setOnItemSelectedListener(this);mAlbumsSpinner.setSelectedTextView((TextView) findViewById(R.id.selected_album));mAlbumsSpinner.setPopupAnchorView(findViewById(R.id.toolbar));mAlbumsSpinner.setAdapter(mAlbumsAdapter);mAlbumCollection.onCreate(this, this);mAlbumCollection.onRestoreInstanceState(savedInstanceState);mAlbumCollection.loadAlbums();}

onCreate里主要做的事情有,获取在Matisse里设置的配置类SelectionSpec实例、设置主题、设置Toolbar、ActionBar、初始化页面的一些按钮、初始化AlbumsAdapter、初始化媒体文件夹分类选取的AlbumsSpinner以及存储一些状态信息等。

看到这里,MatisseActivity的整体流程还是比较简单的,因为底层代码封装的很好,所以MatisseActivity只需要注重逻辑实现,不需要去关心底层的实现细节。不过我们是为了学习源码,下一篇就看看Matisse里的自定义View实现。

这篇关于Android进阶 -- 知乎Matisse源码解析(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/531744

相关文章

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧