背景需要
現在、Android APP
皮は、大きく分けて2つのカテゴリに分けることができます。
- 二つのスイッチングトピック(例えば昼/夜など)、スイッチング用のスイッチボタンを使用。
- オンラインダウンロードとアップデートのテーマのいくつかのセット。
A第1の実質的に実装ローカル設定を使用してTheme
動作するため、すべてのリソースにパッケージされAPP
、テーマに応じて切り替えます。第二は、すべてのリソースがパッケージ化されているので、最初の実装を使用することは不可能であるAPP
柔軟性の欠如で、更新活動を助長されていません、ともなりapk
、パッケージのボリュームが増加しています。第二は、すべての実装は、オンラインダウンロードをサポートしなければならないということです。
プログラムを選択
再舗装のスマートな製品の需要がとができます、我々は、上記の2番目のオプションを選択しました。前回の後Android
やIOS
パネルディスカッションのメンバー、ダウンロードと再生資源のパッケージに使用することができます統一アーカイブは圧縮を解析することによって置き換えられます。
どのようにダウンロードされたリソースの圧縮されたパッケージを読み込むには?2つの方法があります。
- 解凍するスキンパッケージをダウンロードして、リソースファイルストリームファイルリソースを経由して画像内の読み。
- ダウンロードしたスキンパッケージがにロードされ
assetManager
マネージャ、およびを通じて新しいマネージャーResource
によって制御を再舗装オブジェクトニーズResource
リソースオブジェクトを読み込みます。
手動でファイルストリームをオープンする最初の方法、および異なるファイル、異なるファイルが原因リソース負荷に流れなどの画像、テキストファイル、などのモード、ならびに異なるデバイスの解像度をストリーム持っているが、適切に権利をどのように選択するか、異なっています問題をロードするためのリソースが解決されるべきです。
皮膚は、パッケージの中にロードする必要がある第二の方法assetManager
、管理assetManager
マネージャの新世代Resource
のオブジェクトとの私たちの主なプロジェクトResource
のオブジェクトは、同じクラスの異なるオブジェクトである、あなたが(例えば、負荷のリソースにはおなじみの方法を使用することができresource.getColor
、resource.getDrawable
など)。
ロードと2番目のオプションを選択するには、リソースを読んで上記の2つのリソースの負荷に基づいて。
詳細な説明
1は、所望の皮膚パッケージは、皮膚がパッケージである場合には、ローカルにネットワークを介してダウンロードapk
できるようにするために、ファイルapk
のみのリソースファイルを含むパッケージ十分に小さいが、。以上のような皮膚のパッケージ、よりがあるかもしれませんtheme1.skin
、theme2.skin
...
2、addAssetPath AssetManagerオブジェクトメソッドの呼び出しによって、例えばtheme1.skinとして名前によってロードバック、ことと、新しいリソースオブジェクトは、次のコードを生成するためのパッケージを取得します。
AssetManager assetManager = AssetManager.class.newInstance();
//由于addAssetPath()这个方法被隐藏掉了,所以不能直接使用对象直接访问,
//这里使用了反射的方式,作用是将该皮肤包加入到asset管理器中
Method addAssetPath = assetManager.getClass().getMethod("addAssetPath"
, String.class);
addAssetPath.invoke(assetManager, skinPath);
Resources skinResource = new Resources(
assetManager, superRes.getDisplayMetrics(), superRes.getConfiguration());
3、カスタムInflaterFactory
サブクラス、SkinInflaterFactory
書き換えonCreateView(View, String, Context, AttributeSet)
方法、皮膚の制御属性分析および記憶のための必要性、及び皮膚を制御する第2の工程Resource
リソースをロードするために被験者を、これらのコントロールを設定することを。
4、で新しい方法オブジェクトとオブジェクトへの設定の目的は、以下のコード:BaseActivity
onCreate
SkinInflaterFactory
SkinInflateFactory
Activity
LayoutInflater
protected void onCreate(@Nullable Bundle savedInstanceState) {
mSkinInflaterFactory = new SkinInflaterFactory();
LayoutInflaterCompat.setFactory(
getLayoutInflater(), mSkinInflaterFactory);
super.onCreate(savedInstanceState);
}
フローチャート
その他の問題
1、如何支持控件点击后触发不同的业务流程?
可以通过自定义一个属性,如skin:click="@string/clickAction"
,主工程的clickAction="muapp://app/testDefault"
,皮肤包里的clickAction="muapp://app/testClick"
,通过目前项目中的路由机制触发不同的跳转动作。比如说上述默认的跳转是跳转到主工程(app
为module
名)的TestDefaultAction
(注解actionName="testDefault"
)类的invoke
方法中,而更改后会跳转到主工程(app
为module
名)的TestClickAction
(注解actionName="testClick"
)类的invoke
方法中。
2、如何支持控件的不同行为方式?例如不同的动画效果等
这个问题和第一个问题的处理方式的类似的,同样可以通过主工程和皮肤包不同的tag
(String
文案)处理不同的行为方式。
3、如何处理自定义View
的换肤需求?
可以添加一个方法,将自定义View需要换肤的属性名(如background
),属性值(如background
对应的图片的资源ID
)传递到方法中,然后去皮肤包的Resource
对象中寻找是否有相应的可替换的皮肤或者可替换的行为。
总结
看完之后有没有掌握呢?作为一个程序员,要学的东西有很多,而学到的知识点,都是钱(因为技术人员大部分情况是根据你的能力来定级、来发薪水的),技多不压身。
为了很好的生活,我们要多多学习,增加我们手里的金钱。尤其经历了这一疫情,我深深的感受到金钱的重要,所以,我们一定不能停下学习的脚步!
附上我的Android核心技术学习大纲,获取相关内容来GitHub:https://github.com/Meng997998/AndroidJX