アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行

この列には、大きなシェア知識バットのインタビューを焦点を当てて、フォローアップは、トラブルの懸念をクリックするように、更新していきます

インタビュアー:QQ再舗装の網易クラウドが行う方法である、あなたはそれをスキニングについて知っていますか?原則ではないスキニング読みますか?

精神分析:非接触再浮上技術は、第1項は確かに損失になります聞きました。インタビュアーは全く理解がない、レイアウトを監視し、リソースの負荷をテストすることです。1から実際の再舗装を説明します。どのようにして達成するためにあなたに知らせます。表面再建プロジェクトのソースコードとの記事の最後

求職者:詳細に再浮上原理を説明するために、皮の原理を監視するために、レイアウトからインタビュアーを開始

その後、我々は、この乾燥を共有しています。Androidのテーマスキン、切り替える直接シームレスに活動を再開することなく、高い模倣網易のクラウド音楽テーマスキニングすることができ、プラグインのスキンパックを提供することができます。

リンクはサンプルSkinChangeDemoのうち、このデモのパッケージである、あなたはそれが第1の効果を試しダウンロードして行くことができ、スキンファイルをメモリカードのルートに置くことができます。

アンドロイドをスキニングテーマについて一般的な問題です。プログラムは無限大ですオンライン与え、最近私はまた、この知識を知りたいので、私はそれがこの地域に大きな記事があります検索しに行きましたが、最終的な結果は不満足なもので、実際にいくつかのかなりのデモを参照することができ、いくつかのよりよい解決策を与えるが、ないことですので、それだけで唯一の紙の上にすることができ、それのいくつかは確かであるデモの参照を提供しますが、最終的な結果は、私が欲しいものではありませんA。Androidの技術的なプログラムのスキンの概要、この記事では、Androidの基準値をスキニングかなり技術的な概要です。それは普遍的知識であるとし、興味のある学生は、理解して行くことができます。

今日、私はスキンプログラムを達成したいがgithubのアンドロイド・スキンローダーのオープンソースフレームワークに基づいています。

ダイナミックローディング機構の使用は、皮膚のリアルタイム交換を達成することができますAcitvityを再起動することなく、肌内部のパッケージの内容をロードするために、このフレームワークの仕組みをさスキニング、オリジナルのインストールパッケージを使用したスキンパックは、独自のカスタムメイド(このスキンパックを必要とする、とは別であります実際に、Androidは)一般的なプロジェクトですが、唯一のリソースファイルのクラスファイルだけでなく、そうすることの利点は、ダウンロードするユーザーのためのスキンパッケージのボリュームを提供することで、あなたは大幅にオンラインインストールパッケージを減らすことができますが、また良いを達成するためにプラグインの。実際には、このフレームワークは、直接、基本的にはAndroidのスキニングテーマを解決することができ、使用数行のコードを指示するために使用することができますが、プログラマーとしてどのように単にまだラインで使用する方法を知っていますか?場合は、それは本当に低すぎます。我々は、少なくとも、彼のソースで簡単に見て、基本的なプロセスについては行く、彼の基本的な原則を見てする必要があります優れたオープンソースのプロジェクトは、私たちは技術になります会っ改善されました。この記事は、デモは、私が記事のデモの改善に詳細Androidのマテリアルデザイン互換性ライブラリを使用する前にいくつかの時間を解放認識に基づいています。最後のAppもMaterialDesignデザインを実現しました。

まあ、私はあまり言って、あなたがこの記事を学ぶことができるか、これはもう少し心配するかもしれません

  • アプリはMaterialDesignベースのスタイルをデザイン
  • 自分のテーマスキン対応を実現するためのフレームワーク
  • 高い模倣網易のクラウド音楽をスキニングテーマ(PS:実は私はタイトルとしてこれに望んでいた、これは、トラフィックを増やすに役立つだろうが、私は党の単なるタイトルにしたくない、私たちに乾燥を与えることが最も重要です)
  • 次のレベルにあなたの技術をしてみましょう(たとえばこれは無益です)

そんなに誰かがもうそれを取るかもしれないと述べた:私はあなたがBBのブラインドそれを聞くことはない、ドライ見に来ました。乾燥するためにすぐに殺到しないでください。あなたが本当に感じる場合は、ソースコードを見て退屈なテキストの末尾にスキップすることができます。ここではおよそクールに最初の数レンダリング
アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行
これは網易クラウド音楽スキンを変更できるインタフェースである、彼はいくつかのデフォルトを提供するだけでなく、ダウンロード可能なオンラインのテーマを提供し、彼のトランジション効果、私はこのソフトウェアを使用し、非常に立派です学生は確かに知っています。この記事の最後には、剥離効果に似ていた後の学習を行うことができます。
アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行
このダイナミックなマップは、これは、皮膚の3つだけの比較的簡単で、私たちのデモ、デモ全体の効果の最終的な実現可能です。基本的な剥離効果を達成するため、主に使用するように学習をもたらすために使用されます。もちろん、より複雑なスキンのデモはこれに基づいている、それは原理を説明するために主にここでは、行うことができます。

誰もがLayoutInflaterFactory関連する知識を普及与える必要性を導入する前に。あなたは既にこの分野での知識を知っている場合は、以下の段落は、直接スキップすることができます。

あなたはそれを使用する必要があるときに、対応するビューにXMLファイルを変換する必要がある場合にLayoutInflaterために私たちは、あまり奇妙かもしれない、私は彼がどのように説明する私を使用する必要はありません。LayoutInflaterは提供setFactory(LayoutInflater.Factory factory)setFactory2(LayoutInflater.Factory2 factory)、Factory2のみAPI 11に追加されます(、我々は排他的に表示を充填する前に、いくつかの余分なものを行うことはできませんが、フィルターに幾分類似)充填のレイアウトをカスタマイズするための2つの方法があります。彼らはあなたが書き換えするため、次の方法を提供します。その中であなたが望むものに自分自身を定義するためのビューを作成することができますがオーバーライドされた場合の方法ではnullを返し、その後、システムは、ビューを作成する方法がデフォルトになります。

View onCreateView(String name, Context context, AttributeSet attrs)//LayoutInflater.Factory
View onCreateView(View parent, String name, Context context, AttributeSet attrs)//LayoutInflater.Factory2

LayoutInflaterがデフォルトの工場出荷時に設定され、活動が達成されるLayoutInflater.Factoryため、インターフェイスでのご活動のビューをカスタマイズすることができonCreateViewを書き換える直接充填します、。

次の文はLayoutInflater.Factoryより良く理解されます

Inflating your own custom views, instead of letting the system do it

这个也是这个Demo其中的一个比较重要技术点。如果有想更详细了解的文末会有参考链接。

下面就正式开始介绍怎么去做这个主题换肤吧。

先来看看这个Demo的项目结构:
アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行
至于xRecyclerView可以不用管,这里我们用不到(这是之前用到的,与本次无关),他只是一个RecyclerView的一个扩展框架,支持下拉刷新和上拉加载,是一个在github上的一个开源项目。

这里我们直接来看看lib_skinloader这个库吧(这里面的内容大部分是来源于Android-Skin-Loader这个框架,我只做了部分修改,主要是适配AppCompatActivity,原框架是基于最初的Activty开发的,在这里再次感谢开源作者),这个库就是今天所讲的核心内容
アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行
我们都知道在Android中如果想去获取资源文件都必须通过Resources去获取。这个库的核心思想就是动态的去加载第三方包里面的包,获取到其Resources然后以获取到的这个Resources去获取第三方包里面的资源内容,最后设置到我们有需响应皮肤更改的View上。

这里我就只介绍load和base两个包,其他包的内容在讲解的时候会涉及到

1.load包

我们先来看看这个load包里面的内容(其实这里就是今天核心内容的核心)。
アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行
里面有两个类文件:SkinInflaterFactory、SkinManager

我们先来看看SkinManager的实现,直接跳到load方法

 public void load(String skinPackagePath, final ILoaderListener callback) {

        new AsyncTask<String, Void, Resources>() {

            protected void onPreExecute() {
                if (callback != null) {
                    callback.onStart();
                }
            }

            @Override
            protected Resources doInBackground(String... params) {
                try {
                    if (params.length == 1) {
                        String skinPkgPath = params[0];
                        Log.i("loadSkin", skinPkgPath);
                        File file = new File(skinPkgPath);
                        if (file == null || !file.exists()) {
                            return null;
                        }

                        PackageManager mPm = context.getPackageManager();
                        PackageInfo mInfo = mPm.getPackageArchiveInfo(skinPkgPath, PackageManager.GET_ACTIVITIES);
                        skinPackageName = mInfo.packageName;

                        AssetManager assetManager = AssetManager.class.newInstance();
                        Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class);
                        addAssetPath.invoke(assetManager, skinPkgPath);

                        Resources superRes = context.getResources();
                        Resources skinResource = new Resources(assetManager, superRes.getDisplayMetrics(), superRes.getConfiguration());

                        SkinConfig.saveSkinPath(context, skinPkgPath);

                        skinPath = skinPkgPath;
                        isDefaultSkin = false;
                        return skinResource;
                    }
                    return null;
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }

            protected void onPostExecute(Resources result) {
                mResources = result;

                if (mResources != null) {
                    if (callback != null) callback.onSuccess();
                    notifySkinUpdate();
                } else {
                    isDefaultSkin = true;
                    if (callback != null) callback.onFailed();
                }
            }

        }.execute(skinPackagePath);
    }

这个方法有两个参数,第一个是皮肤包的路径,第二个就是一个简单的回调

其中doInBackground方法里面就实现了动态的去获取皮肤包的Resources,当获取成功之后,在onPostExecute方法中就将这个Resources赋值到我们定义好的变量中去,以方便我们之后的使用,注意到当获取到的这个Resources不为空时,也就是我们已经获取到了皮肤包里面的资源,我们就调用notifySkinUpdate()这个方法来通知界面去更改皮肤,如果为空就还是使用默认的皮肤。

我们来看看notifySkinUpdate()的实现
アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行
这里很简单,就是去遍历mSkinObservers这个集合,然后去通知更新。对于ISkinUpdate是一个接口,每个需要皮肤更新的Activity都需要去实现这个接口。

SkinManager这个类里面还有诸如getColor(int resId)、getDrawable(int resId)这样的方法,就是去获取第三方包对应的资源文件,值得注意的是如果你的第三方包里没有对应的资源文件,那么就会使用默认的资源文件,如果你有需求,你完全可以去添加一些类似getMipmap(int resID)这样的方法。

对了,还有一个比较重要的方法忘了讲
アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行
这个方法就是恢复到系统的默认主题,原理和load都差不多,实现还简单了很多。SkinManager这个类就说这么多,详细实现请到源码中去查看,很多地方我都给了注释。

我们再来看看SkinInflaterFactory,在这里面主要就是做一些填充View相关的一些工作。我实现的是LayoutInflaterFactory这个接口而不是文章之前提到的LayoutInflater.Factory这个接口是因为这里需要与AppCompatActivity兼容,如果你还是用之前的那个就会出现一些错误,反正我刚弄的时候是折腾了很久的。不管怎么样原理始终是一样的。SkinInflaterFactory的作用就是去搜集那些有需要响应皮肤更改的View。 我们来看看onCreateView的实现
アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行
首先我们先去判断这个当前将要View是否有更改皮肤的需求,如果没有我们就返回默认的实现。如果有,我们就自己去处理 来看看createView方法的实现
アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行
看起来很多,其实这个方法就是去动态的去创建View。

下面来看看parseSkinAttr的实现:
アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行
这个方法其实就是去搜集View中换肤的时候可以更改的属性,当我们换肤的时候就是去更改的这些属性的值,这里你必须要注意一点,这个属性的值一定要是引用类型的(例如:@color/red),千万不能写死,第二个if的判断就是这个作用。到这里可能你就会有个疑问,我怎么知道哪些属性在换肤的时候需要更改。如果你细心一点肯定注意到了这行代码

SkinAttr mSkinAttr = AttrFactory.get(attrName, id, entryName, typeName);

这里有个AttrFacory他的作用就是根据属性名,动态的去创建SkinAttr。在AttrFacory中定义了一些类似于这样的常量:
アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行
这就是我们换肤的时候可以更改的那些属性。SkinAttr是一个抽象类,比如background就会去创建一个BackgroundAttr,本项目所用到的属性全都在attr包中。SkinAttr是比较灵活的一个地方,如果你有哪个属性在换肤的时候需要更改,你就去实现一个对应的SkinAttr。

在parseSkinAttr这个方法的最后我们将View和SkinAttr封装成了一个SkinItem然后添加到一个集合中去,最后还需注意的是,如果当前皮肤不是默认皮肤,一定要去apply一下,这样做主要是防止换了皮肤启动一些新的页面有可能导致换肤不及时的问题。SkinInflaterFactory这个类里面还提供了动态的添加SkinItem的方法,原理都和这里差不多,我就不过多的去说了。

load包里面的这两个类讲的差不多了,这里看懂了后面的内容也就是小菜一碟了,我相信你看了这里再去看源码一定会轻松地多。

2.base包

アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行
可以看见这个包里面肯定就是Activity、Fragment、Application的实现,作用肯定就是封装一些公用的方法和属性在里面。

下面我们一个一个来分析

  • SkinBaseApplication:

可以看到这里我们对SkinManager做了一些初始化的操作。以后我们有需要皮肤更改需求的应用一定要记得一定要继承于SkinBaseApplication。

  • SkinBaseActivity 我们来看看其onCreate方法
    アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行
    在这里使用了我们之前自定义的View的InflaterFactory,来替换默认的Factory。记住一定要在super.onCreate(savedInstanceState);这个方法之前调用。SkinBaseActivity里面还提供了动态添加可以响应皮肤更改需求的View的相关方法。当然需要响应换肤更改的Activity都需要继承SkinBaseActivity。详细实现请看源码。
  • SkinBaseFragment 这个和SkinBaseActivity的思想差不多。具体实现看源码,这里我只是给大家提供这个换肤框架的思想,让大家在看源码的时候更轻松。

这个框架就介绍到这,下面我们来看看怎么去使用。

在使用的时候一定要记得要Activity要去继承于SkinBaseActivity,Fragment要继承于SkinBaseFragment,Application要继承于SkinBaseApplication。当然把这个框架做为你的项目依赖项肯定是必不可少的。为了Demo的简单,这里我只使用了下面三个颜色作为可以换肤的资源,当然如果你想要使用drawable文件也是可以办到的,前提是你一定要把这个Demo看懂。
アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行
来看一个布局文件
アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行

其中xmlns:skin=”http://schemas.android.com/android/skin“是我们自定义的,在SkinConfig有。 我们只需在有皮肤更改需求的View中加入skin:enable=”true” 就OK了。

再来看看MainActicvity的部分代码
アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行
这里就是动态的添加有皮肤更改需求的View。

上面就介绍完了在布局文件中使用方法和在代码中使用方法。

我们应该怎么去换肤呢?很简单,只需调用SkinManager的load方法就可以了,把皮肤路径传进去就可以了,我的这个Demo为了简单起见,没有做在线换肤的功能,只是在本地提供了可以更换的皮肤,看到这里我相信你对怎样在线换肤已经有想法了。
アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行
最最后我们来看看怎么去开发皮肤包。其实这个是最简单的,皮肤包实际上就是一个基本的Android项目,里面不包含类文件,只有资源文件。这里只需注意 这里的资源文件名字一定要和原项目中的相同,并且只用包含那些在皮肤更改时需要改变的那些就行了!例如我的这个Demo就只是简单对上面的三种颜色做了简单的切换。开发了棕色和黑色两款皮肤,所以资源文件中只有三个color的值,开发完成之后我们需要将其打包成apk文件,为防止用户点击安装,我们将其后缀改成了skin,这样做也具有标识性。如果还是不太清楚可以直接去源码中查看。

この時間は、突然それ~~~アイデアを持って、迅速に、テーマスキンのフレームワークであなたの小指のノックから動いていないのは、記事の最初のレンダリングを見てみましょう
アーキテクチャをスキニングインターネット企業を超えたラインを作成するためのコードの200行

さて、この記事は終了します。私が読んで、あなたの忍耐に感謝します!
インターネットの会社のラインを超えてアーキテクチャをスキニングビデオチュートリアルを作成するためのコードの200行
のリンクを: https://pan.baidu.com/s/1d_d2LUnPEtSPU7n-N4zg-A  抽出コード:j559は、ああ、操作がより便利に、このオープンBaiduのネットワークディスク電話アプリケーションの内容をコピー

おすすめ

転載: blog.51cto.com/14295695/2418611