`
phenom
  • 浏览: 405919 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

android theme 皮肤主题 的应用 2

 
阅读更多
上次说到csipsimple里面使用皮肤的方式,是一个receiver来接收,然后setresultdata返回 数据的。
由于它是在onresume中才调用 主题的,所以会有一段时间先看到一些旧的资源,然后才刷新界面,这样的好处是选择了不同的主题马上会看到结果。显然也有不好一面了。就是每次onresume都会调用一次。

总得来说,主题变换都是通过 getThemePackageName,得到主题apk的包名。
Resources themeResources = null;
themeResources = pm.getResourcesForApplication(themePackage);
然后得到资源。
int resourceID = themeResources.getIdentifier(resourceName, "color", themePackage);
            if (resourceID != 0) {
                view.setTextColor(themeResources.getColor(resourceID));
            }
最后应用。
把应用主题放在oncreate里面,就更适合了,只不过不是每次选择了主题就会马上看到效果,需要重启这个activity或fragment。

上面这段是apollo的应用 方式。
private void initActionBar():
ThemeUtils.setTextColor(this, actionBarTitle, "action_bar_title_color");
        ThemeUtils.initThemeChooser(this, actionBarUp, "action_bar_up", THEME_ITEM_BACKGROUND);

apollo是cm团队制作的音乐播放器,(据代码来看是根据google原来的music源码修改来的,使用上了fragment,viewpager,actionbar),当然它只能在v14以上的系统使用,效果不错。(其实我已经修改了部分,现在运行在2.3.3上 了,actionbar的功能还没有修改完成。还有popmenu)

从csipsimple,apollo的主题应用来看,都不会是创建一个Context对象,原因我想大概是Context容易造成内存的泄露,所以它使用了全局的对象。使用pm.getResourcesForApplication这样的方式来查找对应的资源文件。有听说这个方法稍微慢一些。因为getIdentifier速度的问题,很显然的,根据名字查询当然比不上根据id查询了(文档里这么说地 )

下面传几张图来看看效果。分别是默认的light效果与orange皮肤的效果(网上下载 的。)
还有两张是2.3.3系统的效果(修改了apollo的源码,ActionBar明显还没有处理,准备使用的是sdk里面的 actionbarcompat,因为原来的源码不多,所以不引入重量级的组件abs了。况且2.3.x迟早要被4.x替代的。)

源码在:https://github.com/CyanogenMod/android_packages_apps_Apollo.git
我下载的是branch apollo_jellybean这个比master更新,应该是针对jellybean的,我猜迟早是要放入master主分支中的。

如果想学皮肤制作的可以参考下。不错的示例,
说了半天,还没有说这次的重点。
上次csipimple使用一个接收器来接收广播,这次apollo不是,但原理相同,只要找得到包就可以了,皮肤没有源码,直接反编译了,里面没有java代码(annotation我觉得不算是)
manifest文件也简单。
<manifest android:versionCode="2" android:versionName="1.1" package="com.lehoang.orangetheme"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-sdk android:minSdkVersion="7" />
    <application android:label="@string/themeTitle" android:icon="@drawable/ic_launcher">
        <activity android:label="@string/themeTitle" android:name="com.lehoang.orangetheme.GoogleMusicThemeActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="com.andrew.apollo.THEMES" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>
关键在于com.andrew.apollo.THEMES这个,
而com.lehoang.orangetheme.GoogleMusicThemeActivity这段无关紧要的,其实没有这个Activity的java代码。

查找:
Intent intent = new Intent("com.andrew.apollo.THEMES");
        intent.addCategory("android.intent.category.DEFAULT");
        PackageManager pm = getPackageManager();
        List<ResolveInfo> themes = pm.queryIntentActivities(intent, 0);
        String[] entries = new String[themes.size() + 1];
        String[] values = new String[themes.size() + 1];
        entries[0] = APOLLO;
        values[0] = APOLLO;
        for (int i = 0; i < themes.size(); i++) {
            String appPackageName = (themes.get(i)).activityInfo.packageName.toString();
            String themeName = (themes.get(i)).loadLabel(pm).toString();
            entries[i + 1] = themeName;
            values[i + 1] = appPackageName;
        }
        themeLp.setEntries(entries);
        themeLp.setEntryValues(values);
        ThemePreview themePreview = (ThemePreview)findPreference(THEME_PREVIEW);
        themePreview.setTheme(themePackage);

可见android.intent.action.MAIN这个用处没有体现 。
这里使用了queryIntentActivities来查找对应的Activity,与查找receiver一样。结果是查找到这个包名,和主题包。
android:name="com.lehoang.orangetheme.GoogleMusicThemeActivity" 这个似乎就没有用到了,不过最好与包名一样,起个与众不同的就可以了。

主题选择后的应用:
public void applyTheme(View v) {
        ThemePreview themePreview = (ThemePreview)findPreference(THEME_PREVIEW);
        String packageName = themePreview.getValue().toString();
        ThemeUtils.setThemePackageName(this, packageName);
        Intent intent = new Intent();
        intent.setClass(this, MusicLibrary.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
        finish();
    }

如果选择了主题但没有应用,是看不到地,而这两个程序的普遍做法是将主题对应的包名等信息放在sp中,然后在程序启动时就可以直接读取了。

想要皮肤效果立刻见效,只有重启Activity了。如果一个程序的主页比较重要,而应用 主题不改变当前的程序中的内容,这种方法就不太可行了。它直接启动一个新的。

每一个皮肤的制作都遵循一定的规则的,规则当然由主程序定了,当主程序变换时,皮肤如果不变,有可能得不到对应的资源,所以可以读取皮肤的版本号,版本名称或其它的一些信息来判断皮肤是否对应当前的主程序。

另外说下apollo在ui设计方面可以学习的地方:
popmenu,这个是v11后的东西,前面的系统就免试了。这是在bottombar中右侧竖线点击后的弹出的效果。
以前一直想弄一个上面使用tabs,然后再加入一些navigation_list mode这样可以下拉的spinner,而apollo直接把actionbar隐藏了,自己弄了一个scrollingtab,跟ActionBar的tabs是一样的效果。(我的思想被束缚了,一直想是否系统有现成的这样控件)。
对于底部的bottombar同样是使用了一个viewpager,我一直以为。像viewpager这样的东西算是重量级的控件了,通常用在大块区域,没想到,放到底部这样小块的地方,也是相当不错的效果。
列表中的spinner的效果(三角形的右下角)这也算是v14引入的吧。现在越来越多的程序会有这样的控件背景按钮了。
专辑中的列表项(要有封面背景才看得出效果),下面文字半透明的,加上背景,效果不错。

截图会有些图不正常,但程序没有问题,是ddms的截图的问题。

600k左右的代码,把一个音乐播放器弄成这样,还有自动搜索封面等 信息(google搜索的估计,使用了一个包,可能多数音乐搜索结果不能让人满意,所以我自己修改时去了。),有好多东西值得去学习的。
顺便说一下,如果你想自己修改源码,需要注意MediaPlayer.setNextMediaPlayer这个在之前的版本是没有的,所以在oncompletelistener里面需要加入一个mCurrentPlayer.start()启动播放,不然只有单曲的了。放完了,不会自动下一首。
audioeffect在2.1版本也没有,但2.3,还是可以看到效果的

最后感谢cm团队。

下载了几个主题然后,重新打包,现在可以用于2.x的系统了。

除了优点外,apollo还有一个缺点,就是一开始就加载了所有的Fragment,当然是浪费了资源了。修改这些,需要改变PagerAdapter的addfragment方式,然后在musiclibrary里面的不是使用new XXFragemnt,而是将Class放进驻,然后通过反射在PagerAdapter里面使用,获取实例。

最后将所有apk打包发布,比较大,是因为加了vlc的视频播放功能,它还有自动扫描视频,还没有处理,现在还是直接查找媒体库的内容。
以com.开头的是v14以后就是4.x以后的系统皮肤,也是原版的,其它的皮肤是重新打包,适用于2.x系统的。由于本程序主要针对2.x系统,在4。x上直接使用原版就好了。可以用里面的四个主题,皮肤是找了挺久的,只有在play上有下载。

而且取消了专辑封面下载。



  • 大小: 53.9 KB
  • 大小: 34.1 KB
  • 大小: 56.5 KB
  • 大小: 49 KB
  • 大小: 42.8 KB
  • 大小: 45.4 KB
  • 大小: 16.6 KB
  • 大小: 59.6 KB
  • 大小: 538.8 KB
  • 大小: 217.8 KB
分享到:
评论

相关推荐

    android theme 皮肤主题 的应用

    NULL 博文链接:https://phenom.iteye.com/blog/1724581

    Android Theme更换主题换肤应用实例

    Android Theme界面换肤应用实例,也就是更改系统主题风格,可在“应用透明背景的主题”、“应用布景主题1”、“应用布景主题2”三种皮肤风格之间切换,Android换肤对Android手机来说是再简单不过的功能了,个性化...

    如何修改moodle_theme主题皮肤.docx

    如何修改moodle_theme主题皮肤.docx如何修改moodle_theme主题皮肤.docx如何修改moodle_theme主题皮肤.docx如何修改moodle_theme主题皮肤.docx如何修改moodle_theme主题皮肤.docx如何修改moodle_theme主题皮肤.docx

    Androidstudio theme 主题

    Android studio 可以加载使用的第三方主题,内含最常用的几种,非常好用!

    android_studio_theme集合包

    android_studio_theme集合包android_studio_theme集合包android_studio_theme集合包

    android 主题(Theme)实现

    android 主题(Theme)实现 setTheme() android2.2

    Goland theme皮肤_VSCode风格

    喜欢 VSCode 的语法着色,看着舒服而且关键字很显眼,折腾了一个小时,调出了这个皮肤,喜欢的欢迎下载哈~~!

    android studio (as)主题theme

    ladies night2.jar ,cobalt.jar ,visual studio.jar, monokai sublime text3.jar

    Android应用源码之theme.zip

    源码参考,欢迎下载

    Android theme简单使用示例.zip项目安卓应用源码下载

    Android theme简单使用示例.zip项目安卓应用源码下载Android theme简单使用示例.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考

    Android设置theme中可能遇到的坑

    最近在配置项目主题的时候报了如下错误: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR 原因一 错误写法: &lt;style name=App...

    winxp 7 theme精品主题

    winxp 7 theme精品主题 winxp 7 theme精品主题 winxp 7 theme精品主题 winxp 7 theme精品主题

    Android系统自带样式 (android:theme)

    android:theme=”@android:style/Theme.Dialog” : Activity显示为对话框模式 android:theme=”@android:style/Theme.NoTitleBar” : 不显示应用程序标题栏 android:theme=”@android:style/Theme.NoTitleBar....

    VS2010 theme皮肤

    VS2010的皮肤,前些日子安装了visio2010感觉界面颜色太深了,突出不了以代码为主的主题,所以卸载了又安装的vs2005,不过昨天重装系统,学长说最好装vs2010才好,因为大家都使的是vs2010 ,但对vs2010的界面讨厌到了...

    如何修改moodle_theme主题皮肤.pdf

    如何修改moodle_theme主题皮肤.pdf如何修改moodle_theme主题皮肤.pdf如何修改moodle_theme主题皮肤.pdf如何修改moodle_theme主题皮肤.pdf如何修改moodle_theme主题皮肤.pdf

    EasyUI皮肤 Insdep-Theme主题

    Insdep theme是基于EasyUI 1.5.x 的一款免费的美化主题包,拥有百度编辑器、cropper、Highcharts、justgage、plupload等各类适应本主题的第三方插件美化补丁。

    Android Theme和Styles内部定义解析.txt

    Android Theme和Styles内部定义解析.txt

    Android代码-一个对安卓应用支持多种主题的库

    Android-Mulit-Theme可以让轻松地对Android应用添加多主题支持,并且支持在不销毁重建Activity的情况下动态切换主题。利用Android自身支持的不同Style中可复写相同的attribute的值的特性,通过代码动态设置不同的...

    Android中应用界面主题Theme使用方法和页面定时跳转应用

    主题Theme就是用来设置界面UI风格,可以设置整个应用或者某个活动Activity的界面风格。在Android SDK中内置了下面的Theme,可以按标题栏Title Bar和状态栏Status Bar是否可见来分类: 代码如下: android:theme=”@...

Global site tag (gtag.js) - Google Analytics