Gallery 相册分享底层实现
来源:互联网 发布:天刀好看的捏脸数据 编辑:程序博客网 时间:2024/06/01 07:43
以Gallery的第一个界面,长按一个文件或这文件夹,会弹出分享的按钮,点击分享按钮,会弹出popupWindow,里面列出可以分享的应用,下面详细的分析下这个过程:
1)首先界面对应的相关文件为SlotView.java,当长按点击的时候,会进入
private class MyGestureListener implements GestureDetector.OnGestureListener { ... ... @Override public void onLongPress(MotionEvent e) { Log.i("frank"," SlotView onLongPress "); cancelDown(true); if (mDownInScrolling) return; lockRendering(); try { int index = mLayout.getSlotIndexByPosition(e.getX(), e.getY()); if (index != INDEX_NONE) mListener.onLongTap(index); } finally { unlockRendering(); } }}从而进入长按的调用流程
2) 接下来进入updateSupportedOperation,在这里面会调用 updateSelectionMenu去计算选中的count
at com.android.gallery3d.ui.ActionModeHandler.updateSupportedOperation(ActionModeHandler.java:515) at com.android.gallery3d.ui.ActionModeHandler.updateSupportedOperation(ActionModeHandler.java:511) at com.android.gallery3d.app.AlbumSetPage.onSelectionChange(AlbumSetPage.java:746) at com.android.gallery3d.ui.SelectionManager.toggle(SelectionManager.java:160) at com.android.gallery3d.app.AlbumSetPage.onLongTap(AlbumSetPage.java:339) at com.android.gallery3d.app.AlbumSetPage$4.onLongTap(AlbumSetPage.java:574) at com.android.gallery3d.ui.SlotView$MyGestureListener.onLongPress(SlotView.java:712)接下来会在handler中,
public void updateSupportedOperation() {... updateSelectionMenu();... mMenuTask = mActivity.getThreadPool().submit(new Job<Void>() { @Override public Void run(final JobContext jc) { mMainHandler.post(new Runnable() {@Overridepublic void run() {if (!jc.isCancelled()) { MenuExecutor.updateMenuOperation(mMenu, operation); // M: re-enable menu after compute and update finished MenuExecutor.updateSupportedMenuEnabled(mMenu, MediaObject.SUPPORT_ALL, true); if (mShareMenuItem != null) { if(selected == null || selected.size() == 0) { mShareMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); mShareActionProvider.setShareIntent(null);...}setShowAsAction()将会触发Acionbar的View的创建和数据的准备
3) MenuBuilder将会对创建ActionBar做一系列的准备,最后会调用到ShareActionProvider.onCreateActionView,这里会去创建ActionBar的View,
at android.widget.ActivityChooserView.<init>(ActivityChooserView.java:238) at android.widget.ActivityChooserView.<init>(ActivityChooserView.java:194) at android.widget.ActivityChooserView.<init>(ActivityChooserView.java:184) at android.widget.ShareActionProvider.onCreateActionView(ShareActionProvider.java:170) at android.view.ActionProvider.onCreateActionView(ActionProvider.java:98) at com.android.internal.view.menu.MenuItemImpl.getActionView(MenuItemImpl.java:580) at com.android.internal.view.menu.ActionMenuPresenter.getItemView(ActionMenuPresenter.java:171) at com.android.internal.view.menu.ActionMenuPresenter.flagActionItems(ActionMenuPresenter.java:449) at com.android.internal.view.menu.MenuBuilder.flagActionItems(MenuBuilder.java:1048) at com.android.internal.view.menu.BaseMenuPresenter.updateMenuView(BaseMenuPresenter.java:87) at com.android.internal.view.menu.ActionMenuPresenter.updateMenuView(ActionMenuPresenter.java:204) at com.android.internal.view.menu.MenuBuilder.dispatchPresenterUpdate(MenuBuilder.java:244) at com.android.internal.view.menu.MenuBuilder.onItemsChanged(MenuBuilder.java:946) at com.android.internal.view.menu.MenuBuilder.onItemActionRequestChanged(MenuBuilder.java:990) at com.android.internal.view.menu.MenuItemImpl.setShowAsAction(MenuItemImpl.java:556) at com.android.gallery3d.ui.ActionModeHandler$2$2.run(ActionModeHandler.java:560)并且设置监听事件在ShareActionProvider.java中
mExpandActivityOverflowButton = (FrameLayout) findViewById(R.id.expand_activities_button);mExpandActivityOverflowButton.setOnClickListener(mCallbacks);mExpandActivityOverflowButtonImage = (ImageView) mExpandActivityOverflowButton.findViewById(R.id.image);mExpandActivityOverflowButtonImage.setImageDrawable(expandActivityOverflowButtonDrawable);这样等到分享Button接下来被点击的时候,将会进入对应的事件处理
private class Callbacks implements AdapterView.OnItemClickListener, View.OnClickListener, View.OnLongClickListener, PopupWindow.OnDismissListener { // AdapterView#OnItemClickListener public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.d("ActivityChooserView", "onItemClick" );... } } // View.OnClickListener public void onClick(View view) {... } // OnLongClickListener#onLongClick @Override public boolean onLongClick(View view) { Log.d("ActivityChooserView", "onLongClick" );... } // PopUpWindow.OnDismissListener#onDismiss public void onDismiss() { Log.d("ActivityChooserView", "onDismiss" );... } private void notifyOnDismissListener() {... }}4) 数据的准备
at android.widget.ActivityChooserModel.loadActivitiesIfNeeded(ActivityChooserModel.java:703) at android.widget.ActivityChooserModel.ensureConsistentState(ActivityChooserModel.java:670) at android.widget.ActivityChooserModel.getActivityCount(ActivityChooserModel.java:406) at android.widget.ActivityChooserView$ActivityChooserViewAdapter.getCount(ActivityChooserView.java:672) at android.widget.ActivityChooserView.updateAppearance(ActivityChooserView.java:495) at android.widget.ActivityChooserView.access$400(ActivityChooserView.java:63) at android.widget.ActivityChooserView$3.onChanged(ActivityChooserView.java:245) at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37) at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50) at android.widget.ActivityChooserView$ActivityChooserViewAdapter.setDataModel(ActivityChooserView.java:653) at android.widget.ActivityChooserView.setActivityChooserModel(ActivityChooserView.java:258) at android.widget.ShareActionProvider.onCreateActionView(ShareActionProvider.java:171) at android.view.ActionProvider.onCreateActionView(ActionProvider.java:98) at com.android.internal.view.menu.MenuItemImpl.getActionView(MenuItemImpl.java:580) at com.android.internal.view.menu.ActionMenuPresenter.getItemView(ActionMenuPresenter.java:171) at com.android.internal.view.menu.ActionMenuPresenter.flagActionItems(ActionMenuPresenter.java:449) at com.android.internal.view.menu.MenuBuilder.flagActionItems(MenuBuilder.java:1048) at com.android.internal.view.menu.BaseMenuPresenter.updateMenuView(BaseMenuPresenter.java:87) at com.android.internal.view.menu.ActionMenuPresenter.updateMenuView(ActionMenuPresenter.java:204) at com.android.internal.view.menu.MenuBuilder.dispatchPresenterUpdate(MenuBuilder.java:244) at com.android.internal.view.menu.MenuBuilder.onItemsChanged(MenuBuilder.java:946) at com.android.internal.view.menu.MenuBuilder.onItemActionRequestChanged(MenuBuilder.java:990) at com.android.internal.view.menu.MenuItemImpl.setShowAsAction(MenuItemImpl.java:556) at com.android.gallery3d.ui.ActionModeHandler$2$2.run(ActionModeHandler.java:561)
在ActivityChooserModel.java中的mActivities是满足条件的可以分享的Activity,当mShareActionProvider.setShareIntent(null); 此时分享将会得到响应
不过需要注意,如果这个Intent在这个地方不为null,将会导致mActivity被清空,
private boolean loadActivitiesIfNeeded() { Log.d("ActivityChooserView", "loadActivitiesIfNeeded mReloadActivities = " + mReloadActivities + ", mIntent =" + mIntent, new Exception()); if (mReloadActivities && mIntent != null) { mReloadActivities = false; mActivities.clear(); ... }
同时当mActivities.size() == 0时,分享的按钮是无效的,在ActivityChooserView.java中
private void updateAppearance() { Log.d("ActivityChooserView", "updateAppearance count = " + mAdapter.getCount(), new Exception()); // Expand overflow button. if (mAdapter.getCount() > 0) { mExpandActivityOverflowButton.setEnabled(true); } else { mExpandActivityOverflowButton.setEnabled(false); } ...}
大体的流程就是这样把,具体的细节就不讨论了
0 0
- Gallery 相册分享底层实现
- Android实现Gallery相册组件开发
- Android Gallery实现3D相册(附效果图+Demo源码)
- Android Gallery实现3D相册(附效果图+Demo源码)
- Android Gallery实现3D相册(附效果图+Demo源码)
- Android Gallery实现3D相册(附效果图+Demo源码)
- android:gallery相册
- Android gallery实现图片的左右循环旋转源码分享
- Android gallery实现图片的左右循环旋转源码分享
- Android gallery实现图片的左右循环旋转源码分享
- Android gallery实现图片的左右循环旋转源码分享
- jQuery AD Gallery相册插件
- wordpress相册插件NextGEN Gallery
- gallery相册,拖动放大缩小
- jQuery AD Gallery相册插件
- android教程之教你用Gallery+ImageSwitcher实现相册功能 (一)
- Android利用Gallery和ImageSwitcher实现在线相册图片预览功能(异步加载图片)
- Android 使用Gallery实现3D相册(附效果图+Demo源码)
- FusionCharts使用总结
- quagga的安装与配置
- PAT 1060. Are They Equal
- 在VMware workstation 9中如何查看和更改虚拟机的网卡MAC地址?
- jQuery插件 -- 表单验证插件jquery.validate.js
- Gallery 相册分享底层实现
- 黑马程序员 Java加强--类加载器
- c/c++学习01
- PKU 1011
- oracle数据库执行脚本时常用命令总结
- 基址与分段寻址—32位寄存器的变化
- Shell下的通配符、特殊符号和文件描述符
- JBPM4.4(三)——与SSH的集成运用
- ubuntu android installscript