Android Gallery2 开发经验整理

   首先一点,通过Gallery2的源码分析来看,他并不是一个普通的app应用,所有界面并不是普通的View.而是通过openGL来做的!所以,一定不要用普通的View的想法来分析Gallery2的源码!下面先说一下Gallery2的结构吧!

首先,Gallery2通过Manifest可以看出,Gallery2初始化的位置是GalleryAppImpl.java,数据的初始化都是在这里实现的,接下来,Gallery2有多个入口!正常进入的方式就是我们的Luncher界面就是GalleryActivity.java!当然,Gallery还有别的入口,举个例子,MovieActivity.java也是入口之一!也许还有别的入口吧!但是我没有发现!当然luncher界面只有GalleryActivity这一个界面!

GalleryActivity 有一个父类,AbstractGalleryActivity.java.所以,很多操作也需要在这里进行,比如,这里也采用了OrientationManager进行画面的绘制,进去看看就知道了,这个类是横竖屏切换的时候进行初始化的view.AbstractGalleryActivity同时也是PickerActivity的父类.

   GalleryAppImpl 中有处理数据的地方,DataManager是一个数据初始化的地方,里面有几个数据资源,

 addSource(new LocalSource(mApplication));
        addSource(new PicasaSource(mApplication));
        addSource(new ComboSource(mApplication));
        addSource(new ClusterSource(mApplication));
        addSource(new FilterSource(mApplication));
        addSource(new SecureSource(mApplication));
        addSource(new UriSource(mApplication));
        addSource(new SnailSource(mApplication));

每条数据源对应相应的数据集!数据集对应响应的path,用来查询相对位置的图册集!registerChangeNotifier(),是初始化数据的!同时,DataManager里面利用了一个ContentObserver来循环获取数据来源!同时,在数据源进行改变的时候,也是通过这个ContentObserver来重新刷新数据的

private static class NotifyBroker extends ContentObserver {
        private WeakHashMap<ChangeNotifier, Object> mNotifiers =
                new WeakHashMap<ChangeNotifier, Object>();

        public NotifyBroker(Handler handler) {
            super(handler);
        }

        public synchronized void registerNotifier(ChangeNotifier notifier) {
            mNotifiers.put(notifier, null);
        }

        @Override
        public synchronized void onChange(boolean selfChange) {
            for (ChangeNotifier notifier : mNotifiers.keySet()) {
                notifier.onChange(selfChange);
            }
        }
    }

以上就是Gallery2生成数据的大概步骤!

下面,我们来说说Gallery2的ActionBar的修改!

  Gallery ActionBar 的修改,主要是修改Style的样式,由此来改变ActionBar的样式!

<style name="Theme.GalleryBase" parent="android:Theme.Holo">

我们用的是holo主题,holo主题适用于android 8.0.

首先,我们先说说修改ActionBar的图标问题,

<item name="android:actionModeShareDrawable">@drawable/max_ic_menu_share_normal</item>//分享图标
<item name="android:actionOverflowButtonStyle">@style/OverFlow</item>//更多图标
<style name="OverFlow" parent="@android:style/Widget.Material.ActionButton.Overflow">
        <item name="android:src">@drawable/max_ic_menu_more_normal</item>
    </style>
<item name="android:dialogTheme">@style/DialogTheme</item>//修改dialog 的主题色
<item name="android:actionOverflowMenuStyle">@style/AppOverflowMenuStyle</item>//更多设置这里的设置样式
<style name="AppOverflowMenuStyle" parent="android:Widget.Material.PopupMenu.Overflow">
        <item name="android:overlapAnchor">false</item>
        <item name="android:popupBackground">@color/max_actionbar_bg</item>
    </style>

还有一个就是修改Gallery2默认图标

public GalleryActionBar(AbstractGalleryActivity activity) {
        mActionBar = activity.getActionBar();
        mActionBar.setElevation(0);
        mActionBar.setDisplayShowHomeEnabled(true);
        mActionBar.setLogo(R.drawable.max_ic_logo);
        mActionBar.setDisplayUseLogoEnabled(true);
        mContext = activity.getAndroidContext();
        mActivity = activity;
        mInflater = ((Activity) mActivity).getLayoutInflater();
        mCurrentIndex = 0;
    }

ActionBar其他的修改,基本上都是在menu中了,menu中有几个是比较重要的!像photo.xml和operation.xml等里面是主要设置anctionbar里面的菜单设置等等,要想修改,主要多看看menu中的xml吧

 接下来,我们来看看具体的相册类

GalleryActivity有相册缩略图(AlbumSetPage)、相册照片缩略图(AlbumPage)、单张照片(PhotoPage)、幻灯片(SlideshowPage)四种不同的状态(ActivityState)。实际上AlbumSetPage、AlbumPage、PhotoPage、SlideshowPage都继承自ActivityState,并且它们之间的切换由StateManager来管理。每一个ActivityState都有一个GLView树,这个树的根节点是ActivityState中定义的mContentPane。

接下来,我们再来谈谈,Gallery的焦点问题,我看了全网,竟然没有人来说说Gallery的遥控焦点问题是怎么解决的!我研究了两个多周,终于解决了这个问题!

首先,我们要先知道,这个Gallery2是怎么传递焦点的!

AbstractActivity----->GLRootView ----->GlView-------->{PhotoView,SlotView} 这是他们焦点分发的流程

本来我想直接在这里进行发布流程了,但是我因为很久不写博客和资源了,所以积分不多了,所以写在了一个txt文件里面,你们可以去那里下载,给我点资源分!

  但是,我要在这里说说他们的流程

AbstractActivity这里是Activity,所以,他可以实现onDispatchKeyEvent,但是,我们拦截到的焦点事件不在这里处理,而我们的Gallery没有ViewGroup的概念,所以,我们只能自己去写这个事件分发!下发到GLRootView的View中,这个View是用OpenGL绘制的,这相当于我们的ViewGroup,在ViewGroup中我们还是要下发到下面的View中去实现,那就继续往下下发,GLView是GLRootView的下级ViewGroup,到此,就是view的最后一层ViewGroup了,而我们的Gallery2中只有两个View来处理了所有的显示界面,PhotoView是处理幻灯片播放和相册点开之后的页面处理View.而SlotView是来展示没有打开的图片集以及网格布局的View.当焦点分发到这两个View的时候,在这两个view中进行处理焦点响应事件!

    但是,在这两个View中获得焦点之后,我们的ActionBar还是有焦点存在的,为了解决这个焦点冲突,我们需要将GLRootView中进行setFouce置为false,当然,这些操作,我已经在txt文件中进行了处理,你们下载下来就知道了!

附上下载链接:https://download.csdn.net/download/u011228868/11956479

以上是我暂时总结的Gallery相关的大概信息,以后有什么漏的再补充吧

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值