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

来源:互联网 发布:usb无线网卡linux驱动 编辑:程序博客网 时间:2024/06/05 07:44

本人新手,刚学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(){@Overridepublic 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(){@Overridepublic 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);}@Overridepublic 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() {@Overridepublic void onItemClickListener(int item) {ValueAnimator anim = null;switch(item){case CusSetMonitorDistanceBar.LEFT_BUTTON://按左边button时的事件break;......


处女博文到此结束。



0 0
原创粉丝点击