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 ,                   .

Android代码实现状态选择器_第1张图片 Android代码实现状态选择器_第2张图片 Android代码实现状态选择器_第3张图片このように私たちは安心して使用することができて、バージョンの互換性の問題が発生することを恐れません.
まとめ:実は私たちの本当の開発では、app全体のテーマが決まったら、私たちの上のクラスはさらなるパッケージ処理を行うことができ、一般的にnormal状態とpressed色が一致するため、color.xmlはこの2つの色を構成し、グローバルに使用します.元のUIが2種類の状態図を切る手間を減らし、drawableディレクトリの下selectorを減らした.xmlファイルの書き込みはappの体積を最適化した.