本人新手,刚学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;
......