Android自定义控件实现

0 摘要

本文的自定义控件模仿微信的选项条,提供IMAGE/TEXT/MODE属性:

  • IMAGE 控制选项条的图标,如果不设置就没有图标;
  • TEXT 控制选项条上的文字;
  • MODE 控制选项条的背景图案(按理来说,margintop也应该由MODE来控制,由于涉及到另外的接口,所以在本文中没有涉及)


1 定义自定义控件的属性

value/attrs.xml

<resources>

    <declare-styleable name="ControlOption">
        <attr name="Text" format="reference|string"></attr>
        <attr name="Img" format="reference|integer"></attr>
        <attr name="Mode" >
            <enum name="Standalone" value="0"></enum>
            <enum name="Top" value="1"></enum>
            <enum name="Middle" value="2"></enum>
            <enum name="Bottom" value="3"></enum>
        </attr>
    </declare-styleable>

</resources>

2 定义自定义控件布局

layout/control_option.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical">
    
    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"                    
        android:scaleType="matrix"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:src="@drawable/find_more_friend_shake" />    
    <TextView
        android:id="@+id/text"
        android:layout_toRightOf="@id/image"
        android:padding="8dp" 
        android:text="default"
        android:textSize="17sp"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:textColor="#000" /> 
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"                    
        android:scaleType="matrix"
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true"
        android:src="@drawable/mm_submenu" />                       
</RelativeLayout>

3 实现自定义空间类

src/ControlOption.java

public class ControlOption extends RelativeLayout {
	private static int SRC_BG[] = {
		R.drawable.preference_single_item,
		R.drawable.preference_first_item,
		R.drawable.preference_item,
		R.drawable.preference_last_item,
	};
	
	private ImageView mImage;
	private TextView mText;
	
	public ControlOption(Context context, AttributeSet attrs) {
		super(context,attrs);
		LayoutInflater.from(context).inflate(R.layout.control_option, this, true);  
        
		mImage = (ImageView)findViewById(R.id.image);
        mImage.setVisibility(GONE);
		mText = (TextView)findViewById(R.id.text);
        
        int resourceId = -1;
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ControlOption);
        
        int N = typedArray.getIndexCount();
        for (int i = 0; i < N; i++) {
            int attr = typedArray.getIndex(i);
            
            switch (attr) {
	            case R.styleable.ControlOption_Mode:
	                resourceId = typedArray.getInt(R.styleable.ControlOption_Mode, 0);
	                this.setBackgroundResource(SRC_BG[resourceId]);
	                break;
	            case R.styleable.ControlOption_Text:
	                resourceId = typedArray.getResourceId(R.styleable.ControlOption_Text, 0);
	                mText.setText(resourceId > 0 ? 
	                		typedArray.getResources().getText(resourceId) : 
		        			typedArray.getString(R.styleable.ControlOption_Text));
	                break;
	            case R.styleable.ControlOption_Img:
	                resourceId = typedArray.getResourceId(R.styleable.ControlOption_Img, 0);
	                if(resourceId>0) {
		                mImage.setVisibility(VISIBLE);
		                mImage.setImageResource(resourceId);
	                }
	                break;   
            }
        }
        
        typedArray.recycle();
    }
	
};


 
 

4 引用自定义控件

	        <com.shiningstone.myweixin.ControlOption style="@style/option_top"
	            local:Text="个人信息" local:Mode="Top" />
		<com.shiningstone.myweixin.ControlOption  style="@style/option"
		    local:Text="二维码名片" local:Mode="Middle" />
		<com.shiningstone.myweixin.ControlOption  style="@style/option"
		    local:Text="腾讯微博" local:Mode="Bottom" />
			
为了方便起见,增加了style定义,对于自定义控件实现是非必须的。

value/styles.xml

    <style name="option">
        <item name="android:layout_height">wrap_content</item>       
        <item name="android:layout_width">fill_parent</item>
        <item name="android:gravity">center_vertical</item>
        <item name="android:clickable">true</item>
    </style>

    <style name="option_top" parent="@style/option">
        <item name="android:layout_marginTop">14dp</item>
    </style>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值