(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自行缩放。
如果button的android: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起作用。
Button和ImageButton默认有个灰色背景,android:background设置后就替代掉了。
Imagebutton继承Imageview,就是用一个图标代表了一些文字,它没Android:text属性。
Button继承Textview,所以TextView的一些属性也适用于Button控件。
ImageView设置android:src="@drawable/button"
android:background="@drawable/button"
效果是一样的,而且点击没有反应,图片不会切换(切换前后台的时候有反应)。
所以自定义按钮优先选择Button与ImageButton。
(2)自定义Button举例
//selector中放不同item.item属性来定义state是按下,获得焦点还是默认。
item中嵌套shape.shape属性定义形状。shape中嵌套gradient,gradient定义渐变颜色,渐变方向。
shape中嵌套solid,solid定义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)setOnCheckedChangeListener和setOnClickListener区别
一般来说,如果是点击button来实现状态的变化,后者添加if(..isCheck())可以和前面效果相同。
但是如果button的选中状态不是通过点击按钮(可能是代码中setCheck()的调用),那么setOnCheckedChangeListener还能生效,setOnClickListener就不行了。
(9)查找TextView,Button的默认字体大小
"%android-sdk%\sources\android-21\android\widget\TextView.java" 里面可以找到默认textSize
首先你要明确TextView,Button是对应有TextView.java和Button.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);
}
});
2.//第二种方式
ButtonBtn2 = (Button) findViewById(R.id.button2);//获取按钮资源
Btn2.setOnClickListener(listener);//设置监听
}
Button.OnClickListenerlistener = newButton.OnClickListener(){//创建监听对象
publicvoidonClick(View v){
StringstrTmp="点击Button02";
Ev1.setText(strTmp);
}
};
3.//第三种方式(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图片,并不是想象中的颜色代码。
默认的ARGB是f0f0f0也就是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);
实际测试后虽然可以还原checkbox的height和width(前提是设置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”
这样背景是会跟着控件的长宽在x,y轴上自行缩放或者拉伸的。这样一张图如果分辨率较高的话也能一步到位。
(2)设置方框与字的距离
设置CheckBox的android:paddingLeft=”xxdp”即可,这个控件里的padding属性是应该是针对文本来进行控制的。
如果想改变方框的位置,只能用layout_marginLeft=”xxdp”来控制。但是这样又势必会导致控件位置向右移动。导致控件左侧的位置没法响应点击(毕竟控件位置变了)。
但一般CheckBox的响应位置都是屏幕的一行。这样会导致响应位置不到一行。
(3)checkbox自己定制
可以在RelativeLayout中放个TextView和一个ImageButton。两者的位置放置好以后,给ImageView设置点击事件,点击事件中处理ImageButton的按下或释放状态即可。
注意ImageView的android:width==”match_parent”
最后总结:
1.优先推荐自定义checkbox,搞个res/drawable的xml文件来替换原来的方框。
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设置后,依然有前景色的效果。
Switch与ToggleButton还有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);
}
比如我的需求是物理按键模拟实体按键:
在onKeyDown中add.setPressed(true);
onKeyUp中add.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.