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
原创粉丝点击