自定义属性之LinearLayout ImageView TextView模拟图片文字按钮

一、资源文件:

1、文字选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" android:color="#FF111111"/>
    <!-- pressed -->
    <item android:state_focused="true" android:color="#FF222222"/>
    <!-- focused -->
    <item android:state_selected="true" android:color="#FF333333"/>
    <!-- selected -->
    <item android:state_active="true" android:color="#FF444444"/>
    <!-- active -->
    <item android:state_checkable="true" android:color="#FF555555"/>
    <!-- checkable -->
    <item android:state_checked="true" android:color="#FF666666"/>
    <!-- checked -->
    <item android:state_enabled="true" android:color="#FF777777"/>
    <!-- enabled -->
    <item android:state_window_focused="true" android:color="#FF888888"/>
    <!-- window_focused -->

</selector>

  2、背景选择器:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <stroke
        android:width="0.5dip"
        android:color="#ff9d9d9d" />

    <corners android:radius="2dip" >
    </corners>

    <padding android:left="5dip" android:top="5dip" android:right="5dip" android:bottom="5dip"/>
    
    <gradient android:startColor="#ff9d9d9d"
        android:centerColor="#ff9e9e9e"
        android:endColor="#ff9d9d9d"
        />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <stroke
        android:width="0.5dip"
        android:color="#ff505050" />

    <corners android:radius="2dip" >
    </corners>

    <padding android:left="5dip" android:top="5dip" android:right="5dip" android:bottom="5dip"/>
    
    <gradient android:startColor="#ff404040"
        android:centerColor="#ff383838"
        android:endColor="#ff404040"
        />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/item_background" android:state_enabled="true" android:state_window_focused="false"/>
    <item android:drawable="@drawable/item_background_selected" android:state_pressed="true"/>
    <item android:drawable="@drawable/item_background" android:state_focused="true"/>
    <item android:drawable="@drawable/item_background"/>

</selector>

3、属性文件:

 <!-- imageview text -->
    <declare-styleable name="ImageViewText">
        <attr name="image_size" format="dimension" />
        <attr name="image_src" format="reference" />
        <attr name="textSize" format="dimension" />
        <attr name="text" format="string" />
        <attr name="textMargin" format="dimension" />
        <attr name="textColor" format="reference" />
        <!-- 取值  left top right bottom  -->
        <attr name="text_direction" format="string" />
        <attr name="state_normal" format="color" />
        <attr name="state_pressed" format="color" />
        <attr name="state_selected" format="color" />
        <attr name="view_background" format="reference" />
    </declare-styleable>

二、自定义图片文字:

  1、采用后台代码实现:

public class ImageViewText extends LinearLayout {
    private ImageView mImageView;
    private TextView mTextView;

    private View view;
 
    public ImageViewText(Context context) {
        super(context);
        initView(context, null);
    }

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

    private void initView(Context context, AttributeSet attrs) {
         
        mImageView = new ImageView(context);
        mTextView = new TextView(context);
        view = this;
        view.setBackgroundColor(Color.GRAY);
        this.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
        this.setPadding(5, 5, 5, 5);

        view.setClickable(true);
        view.setFocusable(true);
        view.setOnClickListener(ocl);
//        view.setOnTouchListener(otl);

        TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.ImageViewText);
        float textSize = typedArray.getDimension(R.styleable.ImageViewText_textSize, 14);
        
        Logger.getLogger().e("size: "+typedArray.getDimensionPixelSize(R.styleable.ImageViewText_textSize, 0));
//      textSize = textSize/3;
        String text = typedArray.getString(R.styleable.ImageViewText_text);
        float textMarginLeft = typedArray.getDimension(R.styleable.ImageViewText_textMargin, 10);
        float image_width = typedArray.getDimension(R.styleable.ImageViewText_image_width, 10);
        float image_height = typedArray.getDimension(R.styleable.ImageViewText_image_height, 10);

        
        int textColor = typedArray.getColor(R.styleable.ImageViewText_textColor, Color.TRANSPARENT);
        if(textColor!=Color.TRANSPARENT){
             mTextView.setTextColor(textColor);
        }else {
            int pressed = typedArray.getColor(R.styleable.ImageViewText_state_pressed, Color.BLACK);
            int normal = typedArray.getColor(R.styleable.ImageViewText_state_normal, Color.BLACK);
            int selected = typedArray.getColor(R.styleable.ImageViewText_state_selected, Color.BLACK);
            mTextView.setTextColor(createColorStateList(normal,pressed,selected));
        }
         

        int background = typedArray.getResourceId(R.styleable.ImageViewText_view_background, 0);
        int image_src = typedArray.getResourceId(R.styleable.ImageViewText_image_src, 0);
        if (image_src!=0) {
            mImageView.setBackgroundResource(image_src);
        }
        if (background!=0) {
            view.setBackgroundResource(background);
        }
        
        
        String text_direction = typedArray.getString(R.styleable.ImageViewText_text_direction);
        mTextView.setText(text);

        mTextView.setTextSize(textSize);
       

        LayoutParams imageLayoutParams = new LayoutParams((int) image_width,
                (int) image_height);
  
        Logger.getLogger().e("size: "+textSize+" w: "+image_width+" h: "+image_height );
        Logger.getLogger().e("size: "+textSize+" w: "+DensityUtil.dip2px(context, image_width)+" h: "+DensityUtil.dip2px(context, image_height) );
        mImageView.setLayoutParams(imageLayoutParams);
        

        typedArray.recycle();//
        
        LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT);
        if (TextDirection.LEFT.equals(text_direction)) {
            this.setOrientation(HORIZONTAL);
            params.rightMargin = (int) textMarginLeft;
            mTextView.setLayoutParams(params);
            addView(mTextView);
            addView(mImageView);
            
        } else if (TextDirection.RIGHT.equals(text_direction)) {
            this.setOrientation(HORIZONTAL);
            params.leftMargin = (int) textMarginLeft;
            mTextView.setLayoutParams(params);
            addView(mImageView);
            addView(mTextView);
        } else if (TextDirection.TOP.equals(text_direction)) {
            this.setOrientation(VERTICAL);
            params.bottomMargin = (int) textMarginLeft;
            mTextView.setLayoutParams(params);
            addView(mTextView);
            addView(mImageView);
        } else if (TextDirection.BOTTOM.equals(text_direction)) {
            this.setOrientation(VERTICAL);
            params.topMargin = (int) textMarginLeft;
            mTextView.setLayoutParams(params);
            addView(mImageView);
            addView(mTextView);
        }
    }

    public OnClickListener ocl = new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (listener != null) {
                listener.onClick(v);
            }
        }
    };


    public OnClickListenerView listener;

    public void setOnClickListener(OnClickListenerView listenerView) {
        this.listener = listenerView;
    }

    public interface OnClickListenerView {
        public void onClick(View v);
    }

    /** 对TextView设置不同状态时其文字颜色。 */
    private ColorStateList createColorStateList(int normal, int pressed,
            int selected) {
        int[] colors = new int[] { pressed,  selected, normal };
        int[][] states = new int[3][];
        states[0] = new int[] { android.R.attr.state_pressed,
                android.R.attr.state_enabled };
        states[1] = new int[] { android.R.attr.selectable,
                android.R.attr.state_focused };
        states[2] = new int[] {};
         
        ColorStateList colorList = new ColorStateList(states, colors);
        return colorList;
    }



    public class TextDirection {
        public static final String LEFT = "left";
        public static final String TOP = "top";
        public static final String RIGHT = "right";
        public static final String BOTTOM = "bottom";
    }
}

  2、采用后台代码和布局文件:

注意属性duplicateParentState的使用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/me_app_selector"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:paddingLeft="15dip" >

    <ImageView
        android:id="@+id/iv_button_icon"
        android:layout_width="35dip"
        android:layout_height="35dip"
        android:src="@drawable/me_settings" />

    <TextView
        android:id="@+id/tv_button_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dip"
        android:duplicateParentState="true"
        android:text="收藏"
        android:textColor="@color/blue_shallow"
        android:textSize="@dimen/font_body_16" />

</LinearLayout>
public class ImageViewText extends LinearLayout {

    private LayoutInflater inflater;
    private ImageView mImageView;
    private TextView mTextView;

    private View view;

    public ImageViewText(Context context) {
        super(context);
        initView(context, null);
    }
 
    public ImageViewText(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context, attrs);
    }

    private void initView(Context context, AttributeSet attrs) {
        inflater = LayoutInflater.from(context);
        view = inflater.inflate(R.layout.widget_imageview_text, null);

        mImageView = (ImageView) view.findViewById(R.id.iv_button_icon);
        mTextView = (TextView) view.findViewById(R.id.tv_button_text);
        view.setClickable(true);
        view.setFocusable(true);
        view.setOnClickListener(ocl);
         
        TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ImageViewText);
        String text = a.getString(R.styleable.ImageViewText_text);
        int drawable = a.getResourceId(R.styleable.ImageViewText_image_src, 0);
        mTextView.setText(text);    
        mImageView.setImageResource(drawable);

        a.recycle(); 
        addView(view, new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));

    }

    public OnClickListener ocl = new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (listener!=null) {
                listener.onClick(v);
            }
        }
    };
//
//    /**
//     * 设置颜色
//     */
//    public OnTouchListener otl = new OnTouchListener() {
//        @Override
//        public boolean onTouch(View v, MotionEvent event) {
//            if (event.getAction() == MotionEvent.ACTION_DOWN) {
//                view.setBackgroundColor(context.getResources().getColor(
//                        R.color.blue_shallow));
//            } else if (event.getAction() == MotionEvent.ACTION_UP) {
//                view.setBackgroundColor(Color.GRAY);
//            }
//            return false;
//        }
//    };

    public OnClickListenerView listener;

    public void setOnClickListener(OnClickListenerView listenerView) {
        this.listener = listenerView;
    }

    public interface OnClickListenerView {
        public void onClick(View v);
    }
}
原文地址:https://www.cnblogs.com/lbangel/p/3870361.html