android---制作一个自定义button

这篇博文是新手作者关于Android自定义View的学习记录,主要讲解如何创建一个自定义的Button。内容包括在布局文件中使用自定义Button,以及通过CusSetMonitorDistanceBar.java文件和drawable资源来实现其特定属性的设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本人新手,刚学android。记录下一些容易忘记的东西,都是自己瞎琢磨理解的,不一定正确,往高手指正,同时,不建议其他新手参考(容易被带到沟里,慎看)


这是第一个博文,制作一个button。



1、先看怎么用它,将它放在布局文件中。

在main.xml中的某个位置:

 <com.lei.widget.DimPanelBottomBar
                android:id="@+id/btn_bootom_bar"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="8.0dip"
                custom:left_text="@string/cancel"
                custom:left_text_color="@color/button_cancel_color"
                custom:right_text="@string/confirm"
                custom:right_text_color="@color/button_confirm_color" />
好了,我们可以看到它有几个属性是以custom开头的,它们是这个控件特有的东西,是我自定义添加进去的属性。好了,我们去valuse/attrs中定义这些特有的属性(show_my_style属性是多余定义的,暂时没有用到,不用理会)

 <declare-styleable name="CusSetMonitorDistanceBar">
       <attr name="leftText" format="string" />
       <attr name="leftTextColor" format="string" />
       <attr name="middleText" format="string" />
       <attr name="middleTextColor" format="string" />
       <attr name="rightTextColor" format="string" />
       <attr name="rightText" format="string" />
       <attr name="show_my_style" format="string" />
   </declare-styleable>

可以看到这里的就是刚才特有属性被定义的地方,举例:leftText是String类型的。

那么这些特有的属性是怎么发挥作用的?建立一个

CusSetMonitorDistanceBar.java文件(代码中讲解更有效)

public class CusSetMonitorDistanceBar extends LinearLayout{
	
	public final static int LEFT_BUTTON = 0;	
	public final static int MIDDLE_BUTTON = 1;
	public final static int RIGHT_BUTTON = 2;
	
	private OnItemClickListener myOnItemClickListener;
	private String mLeftText, mRightText;
	private int mLeftColor, mRightColor;
	private String myStyle;
	
	private Button leftBtn;
	private Button rightBtn;
	/*
	 * 定义接口,以便可以像普通button一样在用到的地方可以添加点击事件
	 */
	public interface OnItemClickListener{
		public void onItemClickListener(int item);
	}
	
	public void setOnItemClickListener(OnItemClickListener l){
		myOnItemClickListener = l;
	}
	
	/*
	 * 开始构造
	 */
	public CusSetMonitorDistanceBar(Context context, AttributeSet attrs) {
		super(context, attrs);
		/*
		 * 在这里,我们让刚才定义的属性开始起作用哦。  
		 */
		//	从values/attrs中“获得”刚才定义的东东CusSetMonitorDistanceBar,它里面包含了我们定义的属性。
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CusSetMonitorDistanceBar, 0, 0);
        //	从东东a中取出leftText属性,它返回一个String类型的数据,即左边按钮的文字。
        mLeftText = a.getString(R.styleable.CusSetMonitorDistanceBar_leftText);
        mRightText = a.getString(R.styleable.CusSetMonitorDistanceBar_rightText);
        mLeftColor = a.getColor(R.styleable.CusSetMonitorDistanceBar_leftTextColor, 0xff000000);
        mRightColor = a.getColor(R.styleable.CusSetMonitorDistanceBar_rightTextColor, 0xff000000);
        
        //	在values/dimens.xml中定义了button文字的大小,我们将它获取到,
        // 	当然,也可以不去dimens中定义,直接在这里定义,例如size=20.0;
        //	当然,也可以在定义特有属性时将文字大小定义为一个特有属性,在布局时传入(就像button文字颜色那样)
        float size = UtilsResources.getDimension(getContext(), R.dimen.click_button_text_size);
        // LEFT,定义左边button
        leftBtn = new Button(context);
        leftBtn.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);//	设置button文字大小
//    	设置左边button的样式,也就是它的形状,monitor_left_button_normal是在drawable文件中定义的xml文件,非常简单的哦,一会儿上代码
        leftBtn.setBackgroundResource(R.drawable.monitor_left_button_normal);
/*
 *   	设置左边button文字的颜色,这个颜色值是通过自定义属性传进来的,也就是说我们在布局时用custom定义的颜色值通过attrs传到上面a中,再从a中取出放在mLeftColor,最后在这里进行最后的设置。
 *   所有自定义的特有属性都是这个原理起作用的。       
 */
        leftBtn.setTextColor(mLeftColor);
        leftBtn.setText(mLeftText);//同理mLeftColor
//    	我们这个view是继承LinearLayout的,设置Button在这个LinearLayout中如何分布,LinearLayout的大小是多少呢?就是布局时非custom属性中的android:layout_width和android:layout_height决定
        LinearLayout.LayoutParams lp_left = new LayoutParams(0, LayoutParams.MATCH_PARENT);//填满整个LinearLayout,LinearLayout默认为horizon布局
        lp_left.weight = 1;//	比重,我们后面还有一个右边Button,它也是比重为1,所以两个平分了整个LinearLayout
        addView(leftBtn, lp_left); //	将Button(leftBtn)按照lp_left定义的布局方式添加到LinearLayout中。
        //给左边button添加点击事件
        leftBtn.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				if(myOnItemClickListener != null){
					myOnItemClickListener.onItemClickListener(LEFT_BUTTON);
				}
			}
        });
        /*
         * 右边同理,不再赘述
         */
        //RIGHT
        rightBtn = new Button(context);
        rightBtn.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
        if(myStyle != null){
        	if(myStyle.equalsIgnoreCase("dark")){
        		rightBtn.setBackgroundResource(R.drawable.monitor_right_button_pressed);
        	}
        }else{
        	rightBtn.setBackgroundResource(R.drawable.monitor_right_button_normal);	
        }
        
        rightBtn.setTextColor(mRightColor);
        rightBtn.setText(mRightText);
        LinearLayout.LayoutParams lp_right = new LayoutParams(0, LayoutParams.MATCH_PARENT);
        lp_right.leftMargin = -1;
        lp_right.weight = 1;
        addView(rightBtn, lp_right);        
        rightBtn.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				if(myOnItemClickListener != null){
					myOnItemClickListener.onItemClickListener(RIGHT_BUTTON);
				}
			}
        });
        a.recycle();
	}

	public void setLeftBtnColor(int color)
	{
		leftBtn.setTextColor(color);
	}
	public void setRightBtnColor(int color)
	{
		rightBtn.setTextColor(color);
	}
	@Override
	public void setEnabled(boolean enabled) {
		super.setEnabled(enabled);
		for(int i=0;i<this.getChildCount();i++){
			View v = this.getChildAt(i);
			v.setEnabled(enabled);
		}
	}
}

刚才讲到的应该都明白了,唯一有一个东西没有讲,那就是button的形状

在drawable文件中创建monitor_left_button_normal.xml

<?xml version="1.0" encoding="utf-8"?>
<selector
  xmlns:android="http://schemas.android.com/apk/res/android">
  <!-- 定义按下时的模样 -->
    <item android:state_pressed="true">
        <shape >
            <!-- 设置填充颜色,就是button按下时的颜色 -->
            <solid android:color="@color/item_bg_pressed" />
            <!-- 设置边界线的宽度和颜色,就是button轮廓线 -->
            <stroke android:width="@dimen/round_bg_stroke" android:color="@color/item_stroke" />
            <!-- 左上角和左下角以5dip为半径画圆弧,不再是直棱角 -->
            <corners android:topLeftRadius="5dip" android:bottomLeftRadius="5dip" />
        </shape>
    </item>
    
   <!-- 定义没有按时的模样 -->
    <item>
        <shape>
            <solid android:color="@android:color/white" />
            <stroke android:width="@dimen/round_bg_stroke" android:color="@color/item_stroke" />
            <corners android:topLeftRadius="5dip" android:bottomLeftRadius="5dip" />
        </shape>
    </item>
</selector>

在main.java中:

mCusBar = (CusSetMonitorDistanceBar)mView.findViewById(R.id.btn_bootom_bar);
mCusBar.setOnItemClickListener(new CusSetMonitorDistanceBar.OnItemClickListener() {
			@Override
			public void onItemClickListener(int item) {
				ValueAnimator anim = null;
				switch(item){
				case CusSetMonitorDistanceBar.LEFT_BUTTON:
//按左边button时的事件
break;
......


处女博文到此结束。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值