Button相关学习

(1)自定义按钮

res/drawable目录下新建xml文件

<?xmlversion="1.0" encoding="utf-8"?>

<selectorxmlns:android="http://schemas.android.com/apk/res/android">

<item

android:state_window_focused="false"

android:drawable="@drawable/rrr"/>

<item

android:state_pressed="true"

android:drawable="@drawable/rr"/>

<item

android:drawable="@drawable/pp"/>

</selector>


<!--

<selector></selector>标签对应StateListDrawable

android:state_checked:是否被选中。这种写法一般会用在ToggleButton或者Checkbox的控件里

android:state_window_focused:应用程序是否在前台,当有通知栏被拉下来或者一个对话框弹出的时候应用程序就不在前台了

android:state_pressed:是否按下,如一个按钮触摸或者点击。

系统按照从上到下的顺序查找的。默认的item不附带状态,放在最后,可以匹配View的任何状态。

-->

然后layout文件的button组件中引用

<Button

android:layout_width="200dp"

android:layout_height="200dp"

android:background="@drawable/button"/>

button的大小会随着设置的layout_width,layout_height自行缩放。

如果buttonandroid:text内容较多,也会对应缩放。

<ImageButton

android:layout_width="match_parent"

android:layout_height="120dp"

android:src="@drawable/button"

android:background="@drawable/button"

android:scaleType="center"

/>

android:src对应的是src是图片内容(前景),bg是背景,可以同时使用。

background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸。

scaleType只对src起作用。

ButtonImageButton默认有个灰色背景,android:background设置后就替代掉了。

Imagebutton继承Imageview,就是用一个图标代表了一些文字,它没Android:text属性。

Button继承Textview,所以TextView的一些属性也适用于Button控件。

ImageView设置android:src="@drawable/button"

android:background="@drawable/button"

效果是一样的,而且点击没有反应,图片不会切换(切换前后台的时候有反应)。

所以自定义按钮优先选择ButtonImageButton

(2)自定义Button举例

//selector中放不同item.item属性来定义state是按下,获得焦点还是默认。

item中嵌套shape.shape属性定义形状。shape中嵌套gradientgradient定义渐变颜色,渐变方向。

shape中嵌套solidsolid定义shape颜色。shape中嵌套corners,corners定义shape四个角的为圆角,定义圆角的半径。

shape中嵌套stroke,stroke定义shape形状的边线宽度以及颜色。

<?xmlversion="1.0"encoding="utf-8"?>

<selectorxmlns:android="http://schemas.android.com/apk/res/android">

<item

android:state_pressed="true">

<shape android:shape="rectangle">

<gradient

android:startColor="#f0acac"

android:endColor="#f0acac"

android:angle="0"/>

<solidandroid:color="#f0acac"/>

<corners

android:radius="0dp"/>

</shape>

</item>


<item>

<shape>

<gradient

android:startColor="#f8bfbf"

android:endColor="#f8bfbf"

android:angle="0"/>

<solidandroid:color="#f8bfbf"/>

<strokeandroid:width="1dp"

android:color="#f8bfbf"/>

<corners

android:radius="0dp"/>

</shape>

</item>

(3)关于androidsetClickable 不起作用,没有作用

androidsetClickable 一定要放在按扭的setOnClickListener事件之后!

因为setOnClickListener事件会去重写Viewv,也就是会把setClickable设为TRUE

所以一定要写成:

               GetFinger=(Button)findViewById(R.id.GetFinger);
               GetFinger.setBackgroundColor(100);
               GetFinger.setOnClickListener(this);

                //
设置两按扭为不可点击
               GetFinger.setClickable(false);

(4)RadioButton单选按钮和RadioGroup单选组合框的学习总结

一般RadioButton要配合RadioGroup使用

<RadioGroup>

<RadioButton/>

<RadioButton/>

<RadioButton/>

</RadioGroup>

值得一提的属性:

RadioGroup

android:orientation---确定单选组合框的方法

radiogroup.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener(){...};设置监听(选中状态改变后)

怎么确定当前单选按钮选择的是哪个?

radiogroup.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener() {

@Override

publicvoid onCheckedChanged(RadioGroup group, int checkedId) {

if(checkedId== radiobutton1.getId()){

textView.setText("北京");

}elseif(checkedId == radiobutton2.getId()){

textView.setText("上海");

}

}

});

在重写方法有个CheckedId,if来实现就行。注意是RadioGroup

RadioButton

android:checked---默认是否选中

android:textSize---字大小

android:textColor="#0000FF"---设置文字的颜色

android:textStyle="normal"---字体格式//normal,bold,italic分别为正常,加粗以及斜体,默认为normal

(5)CheckBox多选框的学习总结

直接用

<CheckBox/>

<CheckBox/>

<CheckBox/>

值得一提的属性:

CheckBox:

android:checked---默认是否选中

checkbox1.setOnCheckedChangeListener(newOnCheckedChangeListener(){...};;设置监听(选中状态改变后)

(6)ToggleButton开关按钮的学习总结

<ToggleButton/>

值得一提的属性:

android:textOn="喜欢"

android:textOff="不喜欢"

(如果不给的话,默认文字是打开和关闭)

典型的用法:

togglebutton.setOnClickListener(newOnClickListener() {

publicvoid onClick(View v) {

//当按钮第一次被点击时候响应的事件

if(togglebutton.isChecked()) {

Toast.makeText(MainActivity.this,"你喜欢球类运动",Toast.LENGTH_SHORT).show();

}

//当按钮再次被点击时候响应的事件

else{

Toast.makeText(MainActivity.this,"你不喜欢球类运动",Toast.LENGTH_SHORT).show();

}

}

});

(7)Switch切换按钮的学习总结

ToggleButton用法几乎一样,但要求android:minSdkVersion="14"14及以上。可以在AndroidManifest.xml中修改。

<Switch/>

值得一提的属性:

android:textOn="喜欢"

android:textOff="不喜欢"

(如果不给的话,默认文字是打开和关闭)

典型用法同上。

(8)setOnCheckedChangeListenersetOnClickListener区别

一般来说,如果是点击button来实现状态的变化,后者添加if..isCheck())可以和前面效果相同。

但是如果button的选中状态不是通过点击按钮(可能是代码中setCheck()的调用),那么setOnCheckedChangeListener还能生效,setOnClickListener就不行了。

(9)查找TextView,Button的默认字体大小

"%android-sdk%\sources\android-21\android\widget\TextView.java" 里面可以找到默认textSize

首先你要明确TextView,Button是对应有TextView.javaButton.java文件的。

然后findxxx -name “Button.java”

打开这个文件后,搜索textSize就可以了,有个inttextSize=15; 单位应该对应的sp

项目中的路径在/frameworks/base/core/java/android/widget/TextView.java 

(10)onClick事件的三种写法

1.ButtonBtn1= (Button)findViewById(R.id.button1);//获取按钮资源

Btn1.setOnClickListener(newButton.OnClickListener(){//创建监听

publicvoidonClick(View v) {

StringstrTmp = "点击Button01";

Ev1.setText(strTmp);

}


});

.//第二种方式

ButtonBtn2 = (Button) findViewById(R.id.button2);//获取按钮资源

Btn2.setOnClickListener(listener);//设置监听


}


Button.OnClickListenerlistener = newButton.OnClickListener(){//创建监听对象

publicvoidonClick(View v){

StringstrTmp="点击Button02";

Ev1.setText(strTmp);

}


};

.//第三种方式(Android1.6版本及以后的版本中提供了)

publicvoidBtn3OnClick(Viewview){

StringstrTmp="点击Button03";

Ev1.setText(strTmp);


}

res/layout目录下xxx.xml中的Button控件中要加上如下属性

android:onClick=”Btn3OnClick”

相当于直接调用了javacode中的方法,注意javacode 中的方法要这么写:

publicvoid xxx (View view){

}

(11)button在代码中动态设置press和没press的效果

1.mButton.setBackground(mContext.getResources().getDrawable(R.drawable.newbutton1));

2.mButton.setOnTouchListener(newOnTouchListener() {

@SuppressLint("ClickableViewAccessibility")

@Override

publicbooleanonTouch(View arg0, MotionEvent event) {

Log.e("fuck","press");

//TODOAuto-generated method stub

if(event.getAction() == MotionEvent.ACTION_DOWN){

view.setBackgroundColor(Color.BLUE);

}

if(event.getAction() == MotionEvent.ACTION_UP){

view.setBackgroundColor(Color.BLACK);

}

returnfalse;

}

});

(12)androidbutton默认背景

是若干张.9.png图片,并不是想象中的颜色代码。

默认的ARGBf0f0f0也就是240240 240

还有两种是666666也就是102102 102

4e4e4e也就是7979 79

当然我们也可以用d0d0d0等来设置按钮按下的灰黑色程度。

(13)checkbox学习,自定义图片1

checkbox默认布局是前景竖直居中,并且靠近左边。

(1)自定义方框

方法1

如果使用系统内置的方框,单纯是改变方框大小的话。可以在xml文件中设置android:scaleX=”0.5”

android:scale=”0.5”来实现。然后将文字内容放大即可,比如原来没缩放是15sp,现在更改为30sp

这样修改,会引入一个问题,那就是checkbox本身如果是android:layout_width=”100dp”,

android:layout_height=”100dp”.缩放后,它的宽和长都变成50dp,并且缩放是针对checkbox的中心点来缩放的。

这就导致了checkbox实际能响应的点击区域变小了。而且还需要用 android:layout_marginLeft=”-xxdp”来调整方框和文字的位置。

如何解决这个影响呢?

尝试 LayoutParamsmLayoutParams=mBox.getLayoutParams();

mLayoutParams.height=2*mLayoutParams.height;

mLayoutParams.width=2*mLayoutParams.width;

mBox.setLayoutParams(mLayoutParams);

实际测试后虽然可以还原checkboxheightwidth(前提是设置checkbox不是用的match_parent).但是布局的位置发生了改变和原来不一样了。所以这样不行。

有一种思路是可以手动取消掉checkbox的点击事件,然后给它一个容器viewgroup,在viewgroup上设置点击事件:

booleanisPressed=true;

mViewGroup.setOnClickListener(newonClickListener(){

publicvoid onClick(View v)

{

mBox.setChecked(isPressed);

if(isPressed){

isPressed=false;}

else{

isPressed=true;}

}

})

方法2

自定义方框res/drawable目录下新建xx.xml文件,用<selector></selector>标签来做一个drawable,有按下和放开的效果。

然后

styles.xml

<?xmlversion="1.0" encoding="utf-8"?>

<resources>

<stylename="MyCheckBox"parent="@android:style/Widget.CompoundButton.CheckBox">

<itemname="android:button">@drawable/checkbox_selector</item>

</style>

</resources>


调用时

<CheckBox

android:id="@+id/checkBox2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

style="@style/MyCheckBox"

android:text="自定义的"/>

这样也会引入一个问题,就是针对不同分辨率的手机,你需要让ui准备多套图。

因为这里这个方框并不能像一个ImageButton一样来设置,如果是一个ImageButton.

可以设置它的长宽为固定dp,然后android:background=”@drawable/xx”

这样背景是会跟着控件的长宽在xy轴上自行缩放或者拉伸的。这样一张图如果分辨率较高的话也能一步到位。

(2)设置方框与字的距离

设置CheckBoxandroid:paddingLeft=”xxdp”即可,这个控件里的padding属性是应该是针对文本来进行控制的。

如果想改变方框的位置,只能用layout_marginLeft=”xxdp”来控制。但是这样又势必会导致控件位置向右移动。导致控件左侧的位置没法响应点击(毕竟控件位置变了)。

但一般CheckBox的响应位置都是屏幕的一行。这样会导致响应位置不到一行。

(3)checkbox自己定制

可以在RelativeLayout中放个TextView和一个ImageButton。两者的位置放置好以后,给ImageView设置点击事件,点击事件中处理ImageButton的按下或释放状态即可。

注意ImageViewandroid:width==”match_parent”

最后总结:

1.优先推荐自定义checkbox,搞个res/drawablexml文件来替换原来的方框。

2.不建议移动checkbox的方框的位置。因为checkbox方框向右移动一定会导致CheckBox的响应位置不到一行。

(14)checkbox自定义图片2

方法一:直接在布局文件里面修改

<CheckBox

  android:layout_width="match_parent"

android:layout_height="wrap_content"

  android:paddingLeft="50dp"

android:paddingRight="50dp"

android:button="@null"

android:text="checkbox"

android:drawableRight="@drawable/custom"/>

其实这里直接设置android:button=”@drawable/custom”,然后删除android:drawableXXX这行也是可以的,但是图片是替换原来的位置,也就是说图片在左侧,如果想要图片在右侧的话就不能这么设置了。

首先,让自带的选框的隐藏。

android:button=”@null”这行必须要有。这个用法也可以用在android:background=”@null”,比如android本身的button设置了这项,那么按钮的背景就隐藏了。

RadioButton也可以设置android:button=”@null”来隐藏按钮背景。

第二步,设置选框。

Android:drawableRight=”@drawable/xxx”,xxx是自己在res/drawable目录下新建的xml文件,设置了checked和默认的图片。

drawableRight就是靠右边,还有drawableLeft,Top,Bottom。当然你用android:background=”@drawable/xxx”来设置背景也是可以的如果有需要的话。

第三步,选框位置和文字内容的调整。

比如上例中是文字靠左,图片靠右。

paddingleft就会调整文字

paddingright就会调整图片

说明图片与文字的间距是可变的。

方法二:res/values/style.xml文件中修改

<stylename="CustomCheckbox"parent="@android:style/Widget.CompoundButton.CheckBox">

<itemname="android:button">@drawable/custom</item>

</style>

布局中:

<CheckBox

  android:layout_width="wrap_content"

android:layout_height="wrap_content"

style="@style/CustomCheckbox"

android:text="checkbox"/>

这样写达到的效果和方式一中把android:button=”@null”,android:drawableLeft=”@drawable/custom”达到的效果是一样的。

反而还不能把button位置随意挪动。

故推荐第一种方式。

(15)ToggleButton自定义图片

<ToggleButton

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textOn=""

android:textOff=""

android:background="@drawable/custom"/>

想要只显示图片的话,需要将文字设置成空字符串。

(16)Switch自定义图片

尝试

<Switch

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/custom"

/>

这样实测不可行。background设置后,依然有前景色的效果。

SwitchToggleButton还有CheckBox的区别,在于它点击后是有动画效果的,相当于onDraw中不停重绘(滑标的坐标计算),而不是简单的两张图片替换。

要自定义的话目前来看网上都是自定义view,重写onDraw方法来实现的。回头深入研究。

(17)代码触发按钮的点击事件

Android中用代码触发一个按钮的点击事件的代码是:

buttonName.performClick();//实测ui并没有变化

如果想要ui同时有变化

button2.setPressed(true);button2.setPressed(false);分别把button2设为按下和原始状态。

你可以在onClickListener一开始setPressed(true);在最后setPressed(false);

这样就可以实现button2的点击效果。

下面代码实测有效。总感觉应该有更好的写法

publicvoid onClick(View v) {

//TODO Auto-generated method stub

add.setPressed(true);

Toast.makeText(MainActivity.this,"fuck", 0).show();

add.postDelayed(newRunnable() {

@Override

publicvoid run() {

//TODO Auto-generated method stub

add.setPressed(false);

}

},200);

}

比如我的需求是物理按键模拟实体按键:

onKeyDownadd.setPressed(true);

onKeyUpadd.setPressed(false);

(18)Button防止快速点击

longlastClick ;

publicvoid onClick(View v) {

//大于一秒方个通过

if(System.currentTimeMillis() - lastClick <= 1000)

{

showToast("点那么快干什么!!!");

return;

}

lastClick= System.currentTimeMillis();

}

(19)android开发中,怎么在Button控件中触发menu事件?

方法一:

MyActivity.this.openOptionsMenu();//有现成的api 吊的不行

方法二:

模仿写一个PopupWindow.



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值