Androidコード実装ステータスセレクタ
7852 ワード
, drawable selector.xml , apk , , java 。
/**
*@author jiangrongtao
*
*csdn:http://blog.csdn.net/jiang_rong_tao
*
*github:https://github.com/jiangrongtao/jiangrongtao.github.io
*
* created at 2016/6/2 11:15
*/
public class TintDrawableUtils {
/**
* Drawable
* @param drawable
* @param color
* @return
*/
public static Drawable getTintDrawable(Drawable drawable, @ColorInt int color) {
Drawable.ConstantState state = drawable.getConstantState();
Drawable drawable1 = DrawableCompat.wrap(state == null ? drawable : state.newDrawable()).mutate();
drawable1.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
DrawableCompat.setTint(drawable1, color);
return drawable1;
}
/**
*
* @param drawable
* @param colors
* @param states
* @return
*/
public static Drawable getStateDrawable(Drawable drawable, int[] colors, int[][] states) {
ColorStateList colorList = new ColorStateList(states, colors);
Drawable.ConstantState state = drawable.getConstantState();
drawable = DrawableCompat.wrap(state == null ? drawable : state.newDrawable()).mutate();
DrawableCompat.setTintList(drawable,colorList);
return drawable;
}
/**
*
* @param drawable
* @param states
* @return
*/
@NonNull
public static StateListDrawable getStateListDrawable(Drawable drawable, int[][] states) {
StateListDrawable stateListDrawable = new StateListDrawable();
for (int[] state:states) {
stateListDrawable.addState(state,drawable);
}
return stateListDrawable;
}
}
具体的には、レイアウトファイル
<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"
tools:context="com.rongtao.smartselector.MainActivity">
<ImageView
android:id="@+id/iv_image"
android:layout_width="80dp"
android:layout_height="80dp"
android:clickable="true"
android:layout_centerInParent="true"
/>
RelativeLayout>
JAvaファイル:
private void init() {
mImageView = (ImageView)findViewById(R.id.iv_image);
//
int[] colors =
new int[] { ContextCompat.getColor(this,R.color.icon_pre),
ContextCompat.getColor(this,R.color.icon_nor)};
//
int[][] states = new int[2][];
states[0] = new int[] { android.R.attr.state_pressed};
states[1] = new int[] {};//
// Drawable , my_nor
Drawable drawable = ContextCompat
.getDrawable(this,R.mipmap.my_nor);
//
StateListDrawable stateListDrawable =TintDrawableUtils.getStateListDrawable(drawable, states);
Drawable drawable3 = TintDrawableUtils.getStateDrawable(stateListDrawable, colors, states);
//
mImageView.setImageDrawable(drawable3);
ContextCompat, , 455 , .
このように私たちは安心して使用することができて、バージョンの互換性の問題が発生することを恐れません.
まとめ:実は私たちの本当の開発では、app全体のテーマが決まったら、私たちの上のクラスはさらなるパッケージ処理を行うことができ、一般的にnormal状態とpressed色が一致するため、color.xmlはこの2つの色を構成し、グローバルに使用します.元のUIが2種類の状態図を切る手間を減らし、drawableディレクトリの下selectorを減らした.xmlファイルの書き込みはappの体積を最適化した.