使用開源框架——AndroidChangeSkin,實現app換膚

鋸齒流沙發表於2018-01-03

AndroidChangeSkin鴻洋開源的一個換膚框架,喜歡的可以去Star下。

簡介

AndroidChangeSkin是一種完全無侵入的換膚方式,支援外掛式和應用內,無需重啟Activity。

使用換膚效果圖

預設:

app換膚.png

換膚:

app換膚.png

配置環境:

1、在app下的build.gradle新增compile 'com.zhy:changeskin:4.0.2'依賴即可。

2、或者下載changeskin,作為module依賴至主專案,例如:

dependencies { compile project(':changeskin') }
複製程式碼

使用:

1、在Application初始化

public class MyApplication extends Application
{
	private static Context mContext;

	@Override
	public void onCreate()
	{
		super.onCreate();
		mContext = getApplicationContext();
		SkinManager.getInstance().init(this);
	}

	public static Context getContext()
	{
		return mContext;
	}
}
複製程式碼

2、在attrs.xml定義資源:

    <!-- changeskin 預設 -->
    <color name="menu_item_text_color">#ffffffff</color>
    <color name="item_text_color">#ff000000</color>
    <color name="main_bg">#fffffffe</color>

    <!--應用內換膚資源-->
    <color name="item_text_color_red">#ff0000</color>
    <color name="menu_item_text_color_red">#ff0000</color>
    <color name="main_bg_red">#ff0000</color>

    <color name="item_text_color_yellow">#E8BF6A</color>
    <color name="menu_item_text_color_yellow">#E8BF6A</color>
    <color name="main_bg_yellow">#E8BF6A</color>

    <color name="item_text_color_green">#00ff00</color>
    <color name="menu_item_text_color_green">#00ff00</color>
    <color name="main_bg_green">#00ff00</color>
複製程式碼

3、activity_main.xml使用時新增 android:tag

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingBottom="@dimen/activity_vertical_margin"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                android:tag="skin:main_bg:background"
                tools:context="com.lwj.mytestpro.MainActivity">
    <!--android:tag="skin:main_bg:background"-->

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <Button
                android:id="@+id/button13"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:tag="skin:item_text_color:textColor"
                android:text="換膚"/>
            <Button
                android:id="@+id/button14"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:tag="skin:item_text_color:textColor"
                android:text="恢復預設膚色"/>
        </LinearLayout>
    </ScrollView>

</RelativeLayout>

複製程式碼

GitHub中該專案對tag的使用介紹如下:

tag屬性分為3部分組成:

skin
資源的名稱,即外掛包中資源的名稱,需要與當前app內使用的資源名稱一致。
支援的屬性,目前支援src,background,textColor,支援擴充套件。
3部分,必須以:分隔拼接。

對於一個View多個屬性需要換膚的,android:tag="skin:item_text_color:textColor|skin:icon:src" 同樣使用|進行分隔。

簡言之:如果你哪個View需要換膚,就新增tag屬性,tag值按照上述方式設定即可。
複製程式碼

4、應用內換膚

MainActivity:

public class MainActivity extends AppCompatActivity
{

	private Button skin;
	private Button defultSkin;
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		SkinManager.getInstance().register(this);
		setContentView(R.layout.activity_main);
		Utils.init(this);
		initView();
	}

	private void initView()
	{

		//換膚
		skin = (Button)this.findViewById(R.id.button13);
		skin.setOnClickListener(mOnClickListener);

		defultSkin = (Button)this.findViewById(R.id.button14);
		defultSkin.setOnClickListener(mOnClickListener);
	}

	private View.OnClickListener mOnClickListener = new View.OnClickListener()
	{
		@Override
		public void onClick(View view)
		{
			switch(view.getId()){

				case R.id.button13:
					SkinManager.getInstance().changeSkin("yellow");
					break;
				case R.id.button14:
					SkinManager.getInstance().removeAnySkin();
					break;
				default:
					break;
			}
		}
	};

	@Override
	protected void onDestroy()
	{
		Toast.makeText(this, "MainActivity.onDestroy", Toast.LENGTH_SHORT).show();
		SkinManager.getInstance().unregister(this);
		super.onDestroy();
	}
}
複製程式碼

首先要在onCreate呼叫register註冊,在onDestroy呼叫unregister解註冊。使用SkinManager.getInstance().changeSkin("yellow")即可完成換膚。

注意:這裡的changeSkin傳入的是字串yellow,跟我在attrs.xml檔案定義屬性名字的字尾一致。

<color name="menu_item_text_color">#ffffffff</color>
<color name="item_text_color">#ff000000</color>
<color name="main_bg">#fffffffe</color>

<color name="item_text_color_yellow">#E8BF6A</color>
<color name="menu_item_text_color_yellow">#E8BF6A</color>
<color name="main_bg_yellow">#E8BF6A</color>
複製程式碼

關於AndroidChangeSkin的使用,還可以參考這篇文章Android 夜間模式changeskin小結,這篇文章的好處是:對踩過的坑總結得不錯。

相關文章