編輯:關於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();
}
}
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);
}
}
Android自定義UI實戰(基礎篇2)---搜索酷炫界面
在實現搜索功能的時候,比如藍牙搜索,附近熱點搜索等,通常我們需要一個比較友好的界面,以下通過自定義View來實現一個搜索界面。效果圖如下:當實現一個這樣的動畫的時候,思路
Android使用RecyclerView和CardView,實現知乎日報精致布局
在寫博客園客戶端的時候,突然想到,弄個知乎日報風格的簡單清爽多好!不需要那麼多繁雜的信息干擾視野。先貼上效果圖,左邊是知乎日報的,右邊是本方案的 本文所使用的ide是an
Android API Guides---Text and Input
文本和輸入 使用文字服務添加便利功能,例如復制/粘貼和拼寫檢查到您的應用程序。您也可以開發自己的文字服務,提供自定義的輸入法,字典和拼寫檢查,你可以分發給用戶為應用程序。
基於android的朋友圈
最近幾天寫了一個簡單的朋友圈程序,包含了朋友圈的列表實現,視頻的錄制、預覽與上傳,圖片可選擇拍照或者從相冊選取,從相冊選取可以一次選擇多張照片,並且限制照片的張數。大致也