本文主要是介绍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源码解析(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!