Gallery3d 学习笔记(18)

上一节课,我们讲了ActionBar 的左边部分,那么现在我们讲一下ActionBar的右边部分


我们先熟悉一下我们要看的内容,看看再不同的界面下ActionBar是不是有不同的状态?


刚刚进去相册集的时候是不是有拍照按钮?并且右边的菜单是只有一个选择相册?


继续进相册的时候,拍照按钮是不是消失了?右边的菜单变成了多个,包括播放幻灯片?


继续进入单张图片的时候,是不是增加了一个分享的按钮?右边的菜单变的更多了,而且左下角还多了一个编辑按钮?


过了一会,这个ActionBar是不是消失了?


这些都是我们要寻找的问题,带着这些问题我们出发!


首先,我们把目光聚焦在新的文件上  --PhotoPage.java,一个图片的显示界面


public abstract class PhotoPage extends ActivityState implements
        PhotoView.Listener, AppBridge.Server, ShareActionProvider.OnShareTargetSelectedListener,
        PhotoPageBottomControls.Delegate, GalleryActionBar.OnAlbumModeSelectedListener {
    private static final String TAG = "PhotoPage";

    private static final int MSG_HIDE_BARS = 1;  --要求隐藏状态的消息

刚才我们说了,过了一会儿,这个ActionBar和下面控制条中的按钮就都消失了


处理的函数是

    private void hideBars() {
        if (!mShowBars) return;  --控制标志位
        mShowBars = false; --设置标志位
        mActionBar.hide();  --隐藏ActionBar
        mActivity.getGLRoot().setLightsOutMode(true);
        mHandler.removeMessages(MSG_HIDE_BARS);  --删除消息
        refreshBottomControlsWhenReady();  --刷新下面的控制条
    }

重新显示状态条的函数

    private void showBars() {
        if (mShowBars) return;  --控制标志位
        mShowBars = true;     --设置标志位
        mOrientationManager.unlockOrientation();
        mActionBar.show();  --显示ActionBar
        mActivity.getGLRoot().setLightsOutMode(false);
        refreshHidingMessage();   
        refreshBottomControlsWhenReady(); --刷新下面的控制条
    }

我们看到了下面的控制条的代码基本都是在一个类里面实现的

public class PhotoPageBottomControls implements OnClickListener {
    public interface Delegate {
        public boolean canDisplayBottomControls();
        public boolean canDisplayBottomControl(int control);
        public void onBottomControlClicked(int control);  --回调的接口
        public void refreshBottomControlsWhenReady();    --刷新的接口
    }

    private Delegate mDelegate;
    private ViewGroup mParentLayout;
    private ViewGroup mContainer;

    private boolean mContainerVisible = false;
    private Map<View, Boolean> mControlsVisible = new HashMap<View, Boolean>();

    private Animation mContainerAnimIn = new AlphaAnimation(0f, 1f);
    private Animation mContainerAnimOut = new AlphaAnimation(1f, 0f);
    private static final int CONTAINER_ANIM_DURATION_MS = 200;

    private static final int CONTROL_ANIM_DURATION_MS = 150;
    private static Animation getControlAnimForVisibility(boolean visible) {
        Animation anim = visible ? new AlphaAnimation(0f, 1f)
                : new AlphaAnimation(1f, 0f);
        anim.setDuration(CONTROL_ANIM_DURATION_MS);
        return anim;
    }

    public PhotoPageBottomControls(Delegate delegate, Context context, RelativeLayout layout) {
        mDelegate = delegate;
        mParentLayout = layout;

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mContainer = (ViewGroup) inflater
                .inflate(R.layout.photopage_bottom_controls, mParentLayout, false);--实际的layout
        mParentLayout.addView(mContainer);

        for (int i = mContainer.getChildCount() - 1; i >= 0; i--) {
            View child = mContainer.getChildAt(i);
            child.setOnClickListener(this);
            mControlsVisible.put(child, false);
        }

        mContainerAnimIn.setDuration(CONTAINER_ANIM_DURATION_MS);
        mContainerAnimOut.setDuration(CONTAINER_ANIM_DURATION_MS);

        mDelegate.refreshBottomControlsWhenReady();
    }

    private void hide() {
        mContainer.clearAnimation(); --清理动画
        mContainerAnimOut.reset();
        mContainer.startAnimation(mContainerAnimOut);  --开始新动画飞出
        mContainer.setVisibility(View.INVISIBLE);  --让整体消失
    }

    private void show() {
        mContainer.clearAnimation();       --清理动画
        mContainerAnimIn.reset();
        mContainer.startAnimation(mContainerAnimIn);  --开始新动画飞入
        mContainer.setVisibility(View.VISIBLE);
        for (View control : mControlsVisible.keySet()) {            --显示所有要显示的控件
            if (control.getVisibility() == View.VISIBLE && !control.isEnabled()) {
                control.setEnabled(true);
            }
        }
       
    }

    public void refresh() {                                        --控制条的刷新接口
        boolean visible = mDelegate.canDisplayBottomControls();
        boolean containerVisibilityChanged = (visible != mContainerVisible);
        if (containerVisibilityChanged) {
            if (visible) {
                show();
            } else {
                hide();
            }
            mContainerVisible = visible;
        }
        if (!mContainerVisible) {
            return;
        }
        for (View control : mControlsVisible.keySet()) {
            Boolean prevVisibility = mControlsVisible.get(control);
            boolean curVisibility = mDelegate.canDisplayBottomControl(control.getId());
            if (prevVisibility.booleanValue() != curVisibility) {
                if (!containerVisibilityChanged) {
                    control.clearAnimation();
                    control.startAnimation(getControlAnimForVisibility(curVisibility));
                }
                control.setVisibility(curVisibility ? View.VISIBLE : View.INVISIBLE);
                mControlsVisible.put(control, curVisibility);
            }
        }
        // Force a layout change
        mContainer.requestLayout(); // Kick framework to draw the control.
    }

    public void cleanup() {
        mParentLayout.removeView(mContainer);
        mControlsVisible.clear();
    }

    @Override
    public void onClick(View view) {                    --点击时的调用,并且调用委托的onBottomControlClicked实现回调
        Boolean controlVisible = mControlsVisible.get(view);
        if (mContainerVisible && controlVisible != null && controlVisible.booleanValue()) {
            view.setEnabled(false);       --隐藏界面

            mDelegate.onBottomControlClicked(view.getId());
        }
    }

代码好多,一讲就无法收场了,我们再捋一遍,那么我们都知道用户是以下的流程

启动图库-->相册集-->某个相册-->某个图片

    gallery-->AlbumSetPage->AlbumPage->PhotoPage


AlbumPage.java 中的


    private void pickPhoto(int slotIndex) {
        pickPhoto(slotIndex, false);
    }

启动某个槽中的图片


            Bundle data = new Bundle();
            data.putInt(PhotoPage.KEY_INDEX_HINT, slotIndex);
            data.putParcelable(PhotoPage.KEY_OPEN_ANIMATION_RECT,
                    mSlotView.getSlotRect(slotIndex, mRootPane));
            data.putString(PhotoPage.KEY_MEDIA_SET_PATH,
                    mMediaSetPath.toString());
            data.putString(PhotoPage.KEY_MEDIA_ITEM_PATH,
                    item.getPath().toString());
            data.putInt(PhotoPage.KEY_ALBUMPAGE_TRANSITION,
                    PhotoPage.MSG_ALBUMPAGE_STARTED);
            data.putBoolean(PhotoPage.KEY_START_IN_FILMSTRIP,
                    startInFilmstrip);
            data.putBoolean(PhotoPage.KEY_IN_CAMERA_ROLL, mMediaSet.isCameraRoll());

            if (startInFilmstrip) {
                mActivity.getStateManager().switchState(this, FilmstripPage.class, data);
            } else {
                mActivity.getStateManager().startStateForResult(
                            SinglePhotoPage.class, REQUEST_PHOTO, data);-- 启动单张图片的界面页
            }

SinglePhotoPage中什么也没有写,所有的实现都在父类中

public class SinglePhotoPage extends PhotoPage {

}

单张图片的进入和上下控制条的显示隐藏都已经清楚了,现在我们先把单张图片的ActionBar的标题改掉吧,拍照的图片名称都很长,而且挤在标题栏上,非常拥挤,前面都一样,根本分不清是那张图片。

刷新标题上的内容在PhotoPage.java中的

    private void updateTitle(boolean isFilmMode) {
        if (isFilmMode) {
            mActionBar.setTitle(mMediaSet != null ? mMediaSet.getName() : "");
            mActionBar.setDisplayOptions(
                    ((mSecureAlbum == null) && (mSetPathString != null)), false);
        } else {
            mActionBar.setTitle(mCurrentPhoto != null ? mCurrentPhoto.getName() : "");
            mActionBar.setDisplayOptions(
                    ((mSecureAlbum == null) && (mSetPathString != null)), true);
        }
    }

根据不同的显示模式显示标题,实在OnResume的时候调用刷新的

        updateTitle(mPhotoView.getFilmMode());

        mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener);
        refreshBottomControlsWhenReady();

        mBottomControls.refresh();

底部的刷新也在里面。前面的我们想怎么改就改updateTitel了,比如显示图片的索引和总的张数,后面,我们要把丑陋的分享按钮给弄到下面来,内容太多,休息一下。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
dosamigos/gallery 是一个 Yii2 扩展,用于创建和显示图片相册。它提供了一个名为 `Gallery` 的小部件(widget),可以轻松地在 Yii2 应用程序中集成和使用。 使用 dosamigos/gallery 扩展的步骤如下: 1. 安装扩展:通过 Composer 在你的 Yii2 项目中安装 dosamigos/gallery 扩展。可以在终端中使用以下命令进行安装: ```shell composer require 2amigos/yii2-gallery ``` 2. 配置扩展:在你的应用程序的配置文件(通常是 `config/web.php` 或 `config/main.php`)中添加 dosamigos/gallery 组件的配置。例如: ```php 'components' => [ // 其他组件配置... 'gallery' => [ 'class' => 'dosamigos\gallery\GalleryManager', // 可选配置... ], ], ``` 在上述配置中,我们将 `gallery` 组件的类设置为 `dosamigos\gallery\GalleryManager`。你还可以根据需要进行其他可选的配置。 3. 使用小部件:在视图文件中使用 `Gallery` 小部件来显示图片相册。例如: ```php use dosamigos\gallery\Gallery; // ... echo Gallery::widget([ 'items' => $items, 'options' => ['class' => 'gallery-widget'], ]); ``` 在上述代码中,我们使用 `Gallery` 小部件并指定图片项数组 `$items`。你可以根据自己的需求修改和替换 `$items`。 另外,我们还可以使用 `'options'` 参数来指定小部件的配置选项。在上述示例中,我们将 `class` 设置为 `gallery-widget`,你可以根据你的样式需求进行修改。 通过以上步骤,你可以在你的 Yii2 应用程序中使用 dosamigos/gallery 扩展来创建和显示图片相册。记得在视图文件中替换和配置 `$items` 为你自己的图片项数组,并根据需要进行其他的小部件和样式配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值