摸鱼学Android 十一 (控件1)
分辨率
- VGA(Video Graphics Array):640*480
- WVGA(Wide VGA):800×480
- HVGA(Half-size VGA):480*320
- QVGA(Quarter VGA):320*240
像素
- dp(dip): device independent pixels(设备独立像素),显示效果与设备硬件有关,一般为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
- px: pixels(像素),不同设备显示效果相同
- pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用
- sp: scaled pixels(放大像素),主要用于字体显示。
.9.png
1 说明
.9图片在拉伸的时候特定区域不会发生图片失真,而不失真的区域可以自己绘制。
2 工具
- Android SDK自带:draw9patch.bat
- NinePatchEditor
UI控件之一
1 TextView(文本框)
1.1 基本属性
- text:设置显示的文本内容,一般是把字符串写到string.xml文件中,然后通过@String/xxx取得对应的字符串内容
- textColor:设置字体颜色,同上,通过colors.xml资源来引用
- textColorHighlight:选中文本的底色,默认蓝色
- textStyle:设置字体风格,三个可选值:normal(无效果),bold(加粗),italic(斜体)
- textSize:字体大小,单位一般是用sp
- textScaleX:字的水平间距
- textScaleY:字的垂直间距
- typeface:字型,normal, sans, serif, monospace
- height:设置高度(一般使用dp)
- width:设置宽度(一般使用dp)
- gravity:对齐方式,文本内容相对于文本框的位置
- background:控件的背景颜色,可以是颜色,可以是图片,也可以是自定义的ShapeDrawable资源文件
1.2 特殊属性
阴影:
- shadowColor:设置阴影颜色,需要与shadowRadius一起使用
- shadowRadius:设置阴影的模糊程度,设为0.1就变成字体颜色了,建议使用3.0
- shadowDx:设置阴影在水平方向的偏移
- shadowDy:设置阴影在竖直方向的偏移
附带图片(图片大小需要通过Java代码修改):
- drawableTop:上方的图片
- drawableButtom:下方的图片
- drawableLeft:左边的图片
- drawableRight:右边的图片
- drawablePadding:与图片的间距
public class MainActivity extends Activity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//假如有一个上方的图片
textView = (TextView) findViewById(R.id.textView);
//获得四个不同方向上的图片资源,数组元素依次是:左上右下的图片
Drawable[] drawable = textView.getCompoundDrawables();
//下标1是上方
//长:文字最左开始0dp向右延伸150dp,宽:距离文字上方100dp开始向上延伸200dp
drawable[1].setBounds(0, 100, 150, 200);
textView.setCompoundDrawables(null, drawable[1], null, null);
}
}
链接:
- autoLink:点击文字,即可跳转至某默认APP,none/web/email/phone/map/all
2 EditText(输入框)
2.1 基本属性
EditView是TextView的子类,属性继承。
- hint:默认提示信息
- textColorHint:提示文本的颜色,默认灰色
- inputType:设置文本的类型,用于选择键盘,如date/number/phone等
- numeric:输入整数
- decimal:输入小数
- digits:输入数字
- capitalize:转换大写字母
- singleLine:单行输入
- password:输入密码
- autoText:自动拼写帮助
- capitalize:sentences-仅首字母大写,words-单次首字母大写,characters-每个字母大写
- phoneNumber:输入手机号码
- editable:是否可编辑
- selectAllOnFocus:获取焦点时全选文字
PS:EditView没有textAlign属性
2.2 设置清空文本图标
- 为EditText设置addTextChangedListener
- 重写TextWatcher()里的抽象方法,监听输入框变化
- setCompoundDrawablesWithIntrinsicBounds设置打叉图片
- 重写onTouchEvent方法,如果点击区域是打叉图片的位置,清空文本
public class EditTextWithDel extends EditText {
private final static String TAG = "EditTextWithDel";
private Drawable imgInable;
private Drawable imgAble;
private Context mContext;
public EditTextWithDel(Context context) {
super(context);
mContext = context;
init();
}
public EditTextWithDel(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
init();
}
public EditTextWithDel(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
init();
}
private void init() {
imgInable = mContext.getResources().getDrawable(R.drawable.delete_gray);
//监听
addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
setDrawable();
}
});
setDrawable();
}
// 设置删除图片
private void setDrawable() {
//有文本再显示
if (length() < 1)
setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
else
setCompoundDrawablesWithIntrinsicBounds(null, null, imgInable, null);
}
// 处理删除事件
@Override
public boolean onTouchEvent(MotionEvent event) {
if (imgAble != null && event.getAction() == MotionEvent.ACTION_UP) {
int eventX = (int) event.getRawX();
int eventY = (int) event.getRawY();
Log.e(TAG, "eventX = " + eventX + "; eventY = " + eventY);
Rect rect = new Rect();
getGlobalVisibleRect(rect);
rect.left = rect.right - 100;
if (rect.contains(eventX, eventY))
setText("");
}
return super.onTouchEvent(event);
}
@Override
protected void finalize() throws Throwable {
super.finalize();
}
}
3 Button(按钮)
3.1 基本属性
Button是TextView的子类,属性继承。
- drawable:引用的drawable位图
- state_focused:是否获得焦点
- state_window_focused:是否获得窗口焦点
- state_enable:是否可用
- state_checkable:是否可被勾选
- state_checked:是否被勾选
- state_selected:是否被选择
- state_pressed:是否被按下
- state_active:是否处于活动状态
- state_single:是否只显示一个子控件
- state_first:第一个控件是否处于显示状态
- state_middle:中间一个子控件是否处于显示状态
- state_last:最后一个子控件是否处于显示状态
3.2 按钮按下效果
- 定义选择器 button_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/btn_normal" android:state_pressed="false"></item>
<item android:drawable="@drawable/btn_pressed" android:state_pressed="true"></item>
</selector>
- 设置按钮背景
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_selector"
android:text="按钮"/>
4 ImageVIew(图像视图)
4.1 基本属性
- src:设置内容,填入图片时不拉伸,直接填充
- background:设置背景,填入图片时自动拉伸
- adjustViewBounds:设置图像缩放时是否按长宽比
- scaleType:设置缩放类型,[ fitXY | fitStart | fitCenter | fitEnd | center | centerCrop | centerInside | matrix ]
4.2 Bitmap资源
- src:内容
- antialias:锯齿开关
- dither:图像抖动开关
- filter:滤镜开关
- gravity:对齐,与titleMode互斥
- titleMode:贴图模式,默认disabled-自动缩放,clamp-截去多余、边缘填白,repeat-截去多余、边缘复制填充,mirror-截去多余、边缘镜像填充;与gravity互斥
- tint:设置着色
- mipMap:是否标记为mipMap,默认false,使用mipMap可以提高显示性能
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/drawable_resource"
android:antialias=["true" | "false"]
android:dither=["true" | "false"]
android:filter=["true" | "false"]
android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"]
android:mipMap=["true" | "false"]
android:titleMode=["disabled" | "clamp" | "repeat" | "mirror"] />
5 RadioButton(单选按钮)
5.1 基本属性
- text:文本(其他text相关的属性都有,例如textSize)
- checked:选中状态,默认true
- button:设置为null则不显示原形按钮
5.2 单选功能
把RadioButton放到RadioGroup按钮组中
RadioGroup属性:
- orientation:排列方式,[ horizontal | vertical ]
- checkedButton:默认选中
6 CheckBox(复选框)
属性与RadioButton基本一致
7 ToggleButton(切换按钮)
7.1 基本属性
属性继承Button。
- disabledAlpha:禁用时的透明度,默认0.5
- textOff:未选中时的文本,默认Off
- textOn:选中时的文本,默认On
- checked:选中状态,默认false
7.2 图片切换
- 定义选择器,switch_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="false" android:drawable="@drawable/off"/>
<item android:state_checked="true" android:drawable="@drawable/on"/>
</selector>
- 设置按钮
<ToggleButton
android:id="@+id/tb1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/switch_selector"
android:textOn="@null"
android:textOff="@null"/>
附录
ShapeDrawable资源文件
可以作为控件的背景使用
1 shape基本属性
- shape(形状):rectangle | oval | line | ring(矩形、椭圆、直线、环)
以下几个属性,只对 ring 有效:
- innerRadius(内环半径):用尺寸值表示
- innerRadiusRatio(环宽度与内环半径的比值):内环半径=环宽度÷N,该属性会被innerRadius覆盖
- thickness(环厚度):用尺寸值表示
- thicknessRatio(环宽度与环厚度的比值,默认为3):环厚度=环宽度÷N,该属性会被thickness覆盖
- useLevel:决定是否作为LevelListDrawable来使用(levellistdrawable可以通过改变level值来切换相应的图片),一般为false
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="ring"
android:useLevel="false"
android:innerRadiusRatio="4"
android:thicknessRatio="4">
<solid android:color="#00ffff"/>
</shape>
3.2 shape子标签
- solid:填充颜色
<solid android:color="color" />
- corners:设置圆角,radius属性定义所有角的半径,其他四个分别对应4个角,可以覆盖radius
<corners
android:radius="9px"
android:bottomLeftRadius="10px"
android:bottomRightRadius="10px"
android:topLeftRadius="10px"
android:topRightRadius="10px" />
- gradient:设置渐变,类型有线性、辐射、扫描三种
<gradient
android:type=["linear" | "radial" | "sweep"]
<!-- 定义渐变的角度,值为45的倍数,默认0(从左到右),90为从下到上 -->
android:angle="integer"
<!-- 定义渐变中心位置,取0~1 -->
android:centerX="float"
android:centerY="float"
<!-- 开始、中间、结束颜色,颜色会逐渐变化 -->
android:startColor="color"
android:centerColor="color"
android:endColor="color"
<!-- 定义辐射半径,仅radial有效 -->
android:gradientRadius="integer"
<!-- 是否作为LevelListDrawable -->
android:useLevel=["true" | "false"] />
- padding:边距
<padding
android:left="integer"
android:top="integer"
android:right="integer"
android:bottom="integer" />
- size:尺寸
<size
android:width="integer"
android:height="integer" />
- stoke:设置边框的长度、颜色、每划长度、两划之间的间隔
<stroke
android:width="integer"
android:color="color"
android:dashWidth="integer"
android:dashGap="integer" />