Android 实现一键切换应用主题颜色(二)

上一篇说到一键切换应用的主题颜色,那么今天就继续来讲一讲如何实现应用的一些图标也一样能够跟随应用的主题颜色切换而改变图标的颜色。比如应用首页的一些固定的展示图标,或者是单选框以及复选框的图标,还有一些功能按钮的图标等等。下面还是老规矩,先上一个效果图(有图有真相有木有?)

上面效果图中已经一目了然了,点击选中下面的图标后,然后再切换相应的应用主题颜色时,可以看到下面所选中的图标也会立即跟随应用的主题颜色进行切换。实现这个功能其实也很简单,不需要把每个颜色的图标都准备一套,一套就足矣了。只不过这一套图标的颜色需要是白色的。然后同样也是使用ColorFilter颜色滤镜的子类LightingColorFilter光照颜色过滤器来处理。下面贴上相关的代码。

1、自定义ColorImageView

import android.content.Context;
import android.graphics.LightingColorFilter;
import android.util.AttributeSet;
import android.widget.ImageView;
import com.qiulong.changedmotivecolortest.mode.ColorManager;
import com.qiulong.changedmotivecolortest.mode.OnColorChangedListener;

public class ColorImageView extends ImageView implements OnColorChangedListener {
	private int color;
	private boolean isColorEnabled = true;

	public ColorImageView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
	}

	public ColorImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public ColorImageView(Context context) {
		super(context);
	}

	@Override
	public void onColorChanged(int color) {
		if (this.color == color) {
			return;
		}
		this.color = color;
		if (isColorEnabled) {
			setColorFilter(new LightingColorFilter(color, 1));
		}
	}

	public void setColorFilterEnabled(boolean isColorEnabled) {
		if (this.isColorEnabled == isColorEnabled) {
			return;
		}
		this.isColorEnabled = isColorEnabled;
		if (isColorEnabled) {
			setColorFilter(new LightingColorFilter(color, 1));
		} else {
			setColorFilter(null);
		}
	}

	@Override
	protected void onAttachedToWindow() {
		ColorManager.getInstance().addListener(this);
		super.onAttachedToWindow();
	}

	@Override
	protected void onDetachedFromWindow() {
		ColorManager.getInstance().removeListener(this);
		super.onDetachedFromWindow();
	}
}

2、应用主题Activity类:MotiveActivity

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import com.qiulong.changedmotivecolortest.R;
import com.qiulong.changedmotivecolortest.mode.ColorManager;
import com.qiulong.changedmotivecolortest.view.ColorImageView;

public class MotiveActivity extends Activity implements OnClickListener {

	private final int[] layouts = { R.id.skin_01, R.id.skin_02, R.id.skin_03,
			R.id.skin_04, R.id.skin_05 };
	private ColorImageView mSelected, mChecked, mDelete;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_motive);
		initView();
	}

	private void initView() {
		findViewById(R.id.motive_back).setOnClickListener(
				new OnClickListener() {
					@Override
					public void onClick(View v) {
						finish();
					}
				});
		int colorArr[] = ColorManager.getInstance().getSkinColor(this);
		for (int i = 0; i < layouts.length; i++) {
			View view = findViewById(layouts[i]);
			View color = view.findViewById(R.id.motive_item_color);
			View selected = view.findViewById(R.id.motive_item_selected);
			color.setBackgroundColor(colorArr[i]);
			if (colorArr[i] == MyApplication.mPreference.getSkinColorValue()) {
				selected.setVisibility(View.VISIBLE);
			}
			color.setOnClickListener(new OnSkinColorClickListener(i));
		}

		mSelected = (ColorImageView) findViewById(R.id.motive_selected);
		mChecked = (ColorImageView) findViewById(R.id.motive_checked);
		mDelete = (ColorImageView) findViewById(R.id.motive_delete);
		setColorImageViewEnabled(mSelected,
				MyApplication.mPreference.getSelectedEnabled());
		setColorImageViewEnabled(mChecked,
				MyApplication.mPreference.getCheckedEnabled());
		setColorImageViewEnabled(mDelete,
				MyApplication.mPreference.getDeleteEnabled());
		mSelected.setOnClickListener(this);
		mChecked.setOnClickListener(this);
		mDelete.setOnClickListener(this);
	}

	class OnSkinColorClickListener implements OnClickListener {

		private int position;

		public OnSkinColorClickListener(int position) {
			this.position = position;
		}

		@Override
		public void onClick(View v) {
			for (int i = 0; i < layouts.length; i++) {
				View view = findViewById(layouts[i]);
				View selected = view.findViewById(R.id.motive_item_selected);
				selected.setVisibility(i == position ? View.VISIBLE : View.GONE);
				ColorManager.getInstance().setSkinColor(MotiveActivity.this,
						position);
			}
		}
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.motive_selected:
			boolean isSelected = mSelected.isSelected() ? false : true;
			setColorImageViewEnabled(mSelected, isSelected);
			MyApplication.mPreference.setSelectedEnabled(isSelected);
			break;
		case R.id.motive_checked:
			boolean isChecked = mChecked.isSelected() ? false : true;
			setColorImageViewEnabled(mChecked, isChecked);
			MyApplication.mPreference.setCheckedEnabled(isChecked);
			break;
		case R.id.motive_delete:
			boolean isDelete = mDelete.isSelected() ? false : true;
			setColorImageViewEnabled(mDelete, isDelete);
			MyApplication.mPreference.setDeleteEnabled(isDelete);
			break;
		}
	}

	private void setColorImageViewEnabled(ColorImageView imageView,
			boolean isEnabled) {
		imageView.setSelected(isEnabled);
		imageView.setColorFilterEnabled(isEnabled);
	}

}

以上内容仅供参考和学习,如有不妥之处欢迎指正和讨论,谢谢!

下载源码请戳这里:http://download.csdn.net/detail/baidu_23478311/9515416

时间: 2024-10-10 09:32:54

Android 实现一键切换应用主题颜色(二)的相关文章

Android 实现一键切换应用主题颜色

最近项目中要实现切换应用主题的功能,下面就来说一说我在项目中是怎么实现这个功能的,一般我们需要改变整个应用的背景颜色可以直接这样设置getWindow().getDecorView().setBackgroundColor(int color).但是这种方式显然不是我们想要的,而且还有许多不好的地方.为什么呢?第一.它会把整个页面的背景颜色都改变了.第二.布局的背景还必须是透明的才会有效果.所以这种方式有的时候是满足不了我们的需求的.下面我将为大家介绍我的解决方案,下面是一个实现的效果图. 上面

从零开始学android&lt;ImageSwitcher图片切换组件.二十六.&gt;

ImageSwitcher组件的主要功能是完成图片的切换显示,例如用户在进行图片浏览的时候,可以通过按钮点击一张张的切换显示的图片,而且使用ImageSwitcher组件在每次切换的时候也可以为其增加一些动画的效果,此类定义如下: java.lang.Object ? android.view.View ? android.view.ViewGroup ? android.widget.FrameLayout ? android.widget.ViewAnimator ? android.wid

如果写一个android桌面滑动切换屏幕的控件(二)

在viewgroup执行: public void snapToScreen(int whichScreen) { whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1)); boolean changingScreens = whichScreen != mCurrentScreen; mNextScreen = whichScreen; int mScrollX = this.getScrollX(); fin

Android技术——视图切换(二)借助ViewPage实现Tab滑动导航

一.早期android(android.support.v4)提供了一系列支持Fragment滑动切换的类,主要是: 1.ViewPager:它时Fragment容器,可以同时管理多个Fragment,并允许多个Fragment切换时提供动画效果. 2.FragmentPagerAdapter:Adapter类,用于为ViewPager提供多个Fragment.此类通常需要扩展. 3.PagerTitleStrip:与ViewPager结合使用,用于在ViewPager上显示"导航条"

Android 之夜间模式(多主题)的实现思路

实现思路 多数App由于历史原因当对其进行夜间模式的功能改造时,工作量是比较大的,所以在真正开始着手实现前,我们还是应该先明确夜间模式(多主题)到底有多少实现的思路以及它们的优劣,这样才可以有效的避免项目延期的情况出现. 自定义attr属性. 这是最基础的方法,就是通过自定义attr属性,在不同的theme中进行不同的实现,然后在layout和style中调用.这种方法改代码改动量比较大,而且根据不同的主题,drawable(5.0以上不用),selector等xml文件必须要相应的定义多份,因

Android UI布局与控件(二)

一.View类的常用xml属性:[了解] ①.Android中所有的UI(用户界面)元素都是使用View和ViewGroup对象建立的 ②.View是一个可以将一些信息绘制在屏幕上并与用户产生交互的对象 ③.ViewGroup是一个包含多个的View和ViewGroup的容器,用来定义UI布局. ④.Android提供了一系列的View和ViewGroup的子类,开发者可以灵活地组合使用它们来完成界面布 局.界 面元素绘制和用户交互等工作 ⑤.开发者还可以选择性地继承一些系统提供的View,来自

Android横竖屏切换及其对应布局加载问题

第一,横竖屏切换连带横竖屏布局问题: 如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局. 可以通过以下两种方法来切换布局: 1)在res目录下建立layout-land和layout-port目录,相应的layout文件名不变,比如:layout-land是横屏的layout,layout-port是竖屏的layout,其他的不用管,横竖屏切换时程序调用Activity的onCreate方法中的setOnContent(xxx),并自动加载相应的布局. 2)假如布

Android中Activity切换时共享视图元素的切换动画(4.x兼容方案)

同时发布在我的博客 点此进入 开始 上一篇讲了使用 Google 的 AppCompat-v7 来实现 Activity 切换时实现共享视图元素的切换动画.这一篇介绍两个可以兼容 4.x 的两个第三方方案. 上一篇:Android中Activity切换时共享视图元素的切换动画(5.0以上) 方案一:PreLollipopTransition 首先在 build.gradle 配置文件添加这个库依赖 dependencies { compile 'com.kogitune:pre-lollipop

Android开发笔记(一百三十二)矢量图形与矢量动画

矢量图形VectorDrawable 与水波图形RippleDrawable一样,矢量图形VectorDrawable也是Android5.0之后新增的图形类.矢量图不同于一般的图形,它是由一系列几何曲线构成的图像,这些曲线以数学上定义的坐标点连接而成.具体到实现上,则需开发者提供一个xml格式的矢量图形定义,然后系统根据矢量定义自动计算该图形的绘制区域.因为绘图结果是动态计算得到,所以不管缩放到多少比例,矢量图形都会一样的清晰,不像位图那样拉大后会变模糊. 矢量图形的xml定义有点复杂,其结构