ImageView的scaleType的属性理解
该属性指定了你想让ImageView
如何显示图片,包括是否进行缩放、等比缩放、缩放后展示位置等
scaleType
属性既可以在 XML 中设置,也可以在代码中设置:
android:scaleType="centerInside" //XML中
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); //代码中
八个ScaleType
,其实可以分为三个类型:
- 以
FIT_
开头的4种,它们的共同点是都会对图片进行缩放; - 以
CENTER_
开头的3种,它们的共同点是居中显示,图片的中心点会与ImageView
的中心点重叠; ScaleType.MATRIX
,使用时特别注意;
android:scaleType=“center” | 保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size时,多出来的部分被截掉。 |
android:scaleType=“center_inside” | 以原图正常显示为目的,如果原图大小大于ImageView的size,就按照比例缩小原图的宽高,居中显示在ImageView中。如果原图size小于ImageView的size,则不做处理居中显示图片。 |
.android:scaleType=“center_crop” | 以原图填满ImageView为目的,如果原图size大于ImageView的size,则与center_inside一样,按比例缩小,居中显示在ImageView上。如果原图size小于ImageView的size,则按比例拉升原图的宽和高,填充ImageView居中显示。 |
androd:scaleType=“fit_xy” | 把图片按照指定的大小在ImageView中显示,拉伸显示图片,不保持原比例,填满ImageView. |
android:scaleType=“fit_start” | 把原图按照比例放大缩小到ImageView的高度,显示在ImageView的start(前部/上部)。 |
android:sacleType=“fit_center” | 把原图按照比例放大缩小到ImageView的高度,显示在ImageView的center(中部/居中显示) |
android:scaleType=“fit_end” | 把原图按照比例放大缩小到ImageView的高度,显示在ImageVIew的end(后部/尾部/底部) |
android:scaleType=“matrix” | 不改变原图的大小,从ImageView的左上角开始绘制,超出部分做剪切处理。 |
最后一个模式需要与ImageView.setImageMatrix(Matrix matrix)
配合使用,因为该模式需要用于指定一个变换矩阵用于指定图片如何展示。
另外注意,在使用时,需要先调用
imageView.setScaleType(ImageView.ScaleType.MATRIX);
再调用
imageView.setImageMatrix(matrix);
注意顺序不要搞错,否则会出现问题的。下面看一下代码:
imageView.setScaleType(ImageView.ScaleType.MATRIX); //设置为矩阵模式
Matrix matrix = new Matrix(); //创建一个单位矩阵
matrix.setTranslate(100, 100); //平移x和y各100单位
matrix.preRotate(30); //顺时针旋转30度
imageView.setImageMatrix(matrix); //设置并应用矩阵
原图的size小于ImageView的size时 原图的size大于ImageView的size时
CheckBox的基本应用
设置监听器:OnCheckedChangeListener
package com.example.ui;
import java.util.ArrayList;
import java.util.List;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
private CheckBox cb_run, cb_sing, cb_dance;
private Button bt_all, bt_notall, bt_show;
private TextView tx_show;
private List<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.checkbox);
// 初始化
initView();
setListener();
initData();
}
private void initData() {
// 创建一个数组,保存显示的内容
list = new ArrayList<String>();
}
public void initView() {
cb_run = (CheckBox) findViewById(R.id.cb_run);
cb_sing = (CheckBox) findViewById(R.id.cb_sing);
cb_dance = (CheckBox) findViewById(R.id.cb_dance);
bt_all = (Button) findViewById(R.id.btn_All);
bt_notall = (Button) findViewById(R.id.btn_notAll);
bt_show = (Button) findViewById(R.id.btn_showResult);
tx_show = (TextView) findViewById(R.id.tx_Result);
}
// 给每个checkBox和btn设置监听函数
public void setListener() {
cb_run.setOnCheckedChangeListener(new cbOnCheckListener());
cb_sing.setOnCheckedChangeListener(new cbOnCheckListener());
cb_dance.setOnCheckedChangeListener(new cbOnCheckListener());
bt_all.setOnClickListener(new btnOnClickLsitener());
bt_notall.setOnClickListener(new btnOnClickLsitener());
bt_show.setOnClickListener(new btnOnClickLsitener());
}
// 创建一个类实现监听,隐藏类监听
class cbOnCheckListener implements OnCheckedChangeListener {
@Override
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
// 当选中状态发生改变时触发
CheckBox checkbox = (CheckBox) arg0;// CheckBox是CompoundButton的子类,强转成CheckBox
switch (checkbox.getId()) {// 通过获取id来获取每个CheckBox的状态
case R.id.cb_run:
if (cb_run.isChecked()) {
cb_run.setTextColor(Color.RED);
Toast.makeText(MainActivity.this, "运动很好" + arg1,
Toast.LENGTH_SHORT).show();
} else {
cb_run.setTextColor(Color.BLACK);
Toast.makeText(MainActivity.this, "不运动不好" + arg1,
Toast.LENGTH_SHORT).show();
}
break;
case R.id.cb_sing:
Toast.makeText(MainActivity.this, "唱歌" + arg1,
Toast.LENGTH_SHORT).show();
break;
case R.id.cb_dance:
Toast.makeText(MainActivity.this, "跳舞" + arg1,
Toast.LENGTH_SHORT).show();
break;
}
}
}
// 创建一个隐藏内部类实现监听
class btnOnClickLsitener implements OnClickListener {
@Override
public void onClick(View arg0) {
// 当按钮发生改变
switch (arg0.getId()) {// 通过id来判断哪个按钮被点击
case R.id.btn_All:
// 如何全选,则设置选择框的属性都是被选中状态
cb_dance.setChecked(true);
cb_sing.setChecked(true);
cb_run.setChecked(true);
break;
case R.id.btn_notAll:
// 如何全部选,则设置选择框的属性都是未选中状态
cb_dance.setChecked(false);
cb_sing.setChecked(false);
cb_run.setChecked(false);
break;
case R.id.btn_showResult:// 显示选中的结果
if (cb_run.isChecked()) {
list.add(cb_run.getText().toString());
}
if (cb_sing.isChecked()) {
list.add(cb_sing.getText().toString());
}
if (cb_dance.isChecked()) {
list.add(cb_dance.getText().toString());
}
tx_show.setText(list.toString());
list.clear();//每次执行完清空
break;
default:
break;
}
}
}
}
效果图:
RadioButton的使用步骤
- 1、RadioButton是圆形单选框
- 2、RadioGroup是一个可以容纳多个RadioButton的容器
- *在RadioGroup中RadioButton控件可以有多个,但同时有且只仅有一个可以被选中
- 单选按钮的实现
- 在xml文件中定义RadioGroup
- 在RadioGroup中添加RadioButton
- 在Java代码中获取控件对象
- 为对象添加监听器
package com.example.ui;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
public class RadioButtonDemo extends Activity {
private RadioGroup rg_sex;
private RadioButton rb_Male, rb_FeMale;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.radiobutton);
// 获取对象
rg_sex = (RadioGroup) findViewById(R.id.rg_sex);
rb_Male = (RadioButton) findViewById(R.id.rb_Male);
rb_FeMale = (RadioButton) findViewById(R.id.rb_FeMale);
//为radiogroup设置监听
rg_sex.setOnCheckedChangeListener(new myRadioButtonListener());
}
class myRadioButtonListener implements OnCheckedChangeListener {
@Override
public void onCheckedChanged(RadioGroup arg0, int arg1) {
// 选中状态改变时触发
switch (arg1) {
case R.id.rb_Male:// 选中男性
Log.i("sex", "选中男性" + rb_Male.getText().toString());
break;
case R.id.rb_FeMale:// 选中女性
Log.i("sex", "选中女性" + rb_FeMale.getText().toString());
break;
default:
break;
}
}
}
}
状态开关按钮(ToggleButton)ToggleButton的使用
- android:disabledAlpha:"" //设置按钮在禁用时的透明度
- android:textOff:"" //按钮没有被选中时显示的文字
- android:textOn:"" //按钮被选中时显示的文字(默认状态)
package com.example.ui;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.ToggleButton;
public class ToggleButtonDemo extends Activity {
private ToggleButton toggleButton;
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.togglebutton);
toggleButton = (ToggleButton) findViewById(R.id.tb);
iv=(ImageView) findViewById(R.id.iv);
// 匿名内部类方法设置监听函数
toggleButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (toggleButton.isChecked()) {
Toast.makeText(ToggleButtonDemo.this,
toggleButton.getText().toString(),
Toast.LENGTH_SHORT).show();
iv.setImageResource(R.drawable.icon1);
} else {
Toast.makeText(ToggleButtonDemo.this,
toggleButton.getText().toString(),
Toast.LENGTH_SHORT).show();
iv.setImageResource(R.drawable.icon2);
}
}
});
}
}
开关按钮(ToggleButton)与开关(Switch)的功能与用法
状态开关按钮(ToggleButton)与开关(Switch)也是由 Button 派生出来的,因此它们的本质也是按钮,Button 支持的各种属性、方法也适用于 ToggleButton 和 Switch。从功能上来看,ToggleButton、Switch 与 CheckBox 复选框非常相似,它们都可以提供两个状态。不过 ToggleButton、Switch 与 CheckBox 的区别主要体现在功能上,ToggleButton、Switch 通常用于切换程序中的某种状态。
ToggleButton 所支持的 XML 属性及相关方法的说明
XML属性 | 相关方法 | 说明 |
---|---|---|
android:checked | setChecked(boolean) | 设置该按钮是否被选中 |
android:textOff | 设置当该按钮的状态关闭时显示的文本 | |
android:textOn | 设置当该按钮的状态打开时显示的文本 |
Switch 支持的 XML 属性及相关方法说明
XML 属性 | 相关方法 | 说明 |
---|---|---|
android:checked | setChecked(boolean) | 设置该开关是否被选中 |
android:switchMinWidth | setSwitchMinWidth(int) | 设置该开关的最小宽度 |
android:switchPadding | setSwitchPadding(int) | 设置开关与标题文本之间的空白 |
android:switchTextAppearance | setSwitchTextAppearance(Context,int) | 设置该开关图标上的文本样式 |
android:textOff | setTextOff(CharSequence) | 设置该开关的状态关闭时显示的文本 |
android:textOn | setTextOn(CharSequence) | 设置该开关的的状态打开时显示的文本 |
android:textStyle | setSwitchTypeface(Typeface) | 设置该开关的文本的风格 |
android:thumb | setThumbResource(int) | 指定使用自定义Drawable 绘制该开关的开关按钮 |
android:track | setTrackResource(int) | 指定使用自定义Drawable 绘制该开关的开关轨道 |
android:typeface | setSwitchTypeface(Typeface) | 设置该开关的文本的字体风格 |
SeekBar控件:可拖动进度条的基本使用
Android 中组件有很多种,其中 SeekBar 就是其中经常见到的组件之一。
SeekBar 是滑动条组件,在音视频的播放器的下面经常看到。
该组件的属性:
- ·android:max 设置范围最大值
- ·android:progress 设置当前进度值
- ·android:secondaryProgress 设置当前次进度值
- ·android:progressDrawable 设置进度条的图片
- ·android:thumb 设置进度条的滑块的图片
常用的方法:
- ·getMax()
- ·getProgress()
- ·setMax(int)
- ·setOnSeekBarChangeListener(SeekBar.OnSeekBarChangeListener l)
监听器 SeekBar.OnSeekBarChangeListener 中可以监听三种事件:
- 数值的改变 (onProgressChanged)
- 开 始 拖 动 (onStartTrackingTouch)
- 停 止 拖 动 (onStopTrackingTouch)
需要说明的是属性 progressDrawable 和 thumb 的任意设置可以得到不同显示效果的滑 动条。
监听器 SeekBar.OnSeekBarChangeListener 很重要,可以响应重要的事件。
package com.example.ui;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
public class seekbarDemo extends Activity {
private SeekBar sb;
private TextView tv1, tv2;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.seekbar);
sb = (SeekBar) findViewById(R.id.sb);
tv1 = (TextView) findViewById(R.id.tv);
tv2 = (TextView) findViewById(R.id.tv2);
// 设置进度条最大值
sb.setMax(100);
// 设置当前进度
sb.setProgress(30);
sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
// 在结束拖动进度条时触发
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
// 在开始拖动进度时发化时触发
tv1.setText("初始进度值为:" + sb.getProgress() + " ");
// Log.i("progress",sb.getProgress()+"初始进度 ");
}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
// T在拖动进度发生变化时触发
/*
* 3个参数 1、当前绑定的seekbar对象 2、当前进度数值 3、是否为用户手动触发
*/
tv2.setText("拖动后的进度值为:" + sb.getProgress() + " ");
// Log.i("progress", sb.getProgress()+"拖动后的进度");
}
});
}
}
ProgressBar 进度条
内容概览:
- Android中的进度条
- ProgressBar 样式
- ProgressBar 进度
- ProgressBar 常用方法
Progress样式:
- 默认圆形
- 超大号圆形
- 小号圆形
- 水平方向-长条形
ProgeressBar-进度
- max:最大进度值
- progress:当前进度值
- SecondaryProgress:次要进度值
ProgeressBar-常用方法
- isInterminate():判断当前进度条状态
- incremen(Secondary)ProgressBy(int arg0):累加进度值
通过按钮动态更改progress的进度
package com.example.ui;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
/*
* 通过按钮动态更改progress的进度
*/
public class ProgressBarDemo extends Activity {
private ProgressBar pb;
private Button bt1, bt2;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.progressbar);
initView();
pb.setMax(100);
pb.setProgress(30);// 第一进度
pb.setSecondaryProgress(50);// 第二进度
bt1.setOnClickListener(new progressbarListener());
bt2.setOnClickListener(new progressbarListener());
}
private void initView() {
pb = (ProgressBar) findViewById(R.id.pb);
bt1 = (Button) findViewById(R.id.bt_add1);
bt2 = (Button) findViewById(R.id.bt_add2);
}
class progressbarListener implements OnClickListener {
@Override
public void onClick(View arg0) {
switch (arg0.getId()) {
case R.id.bt_add1:
pb.incrementProgressBy(20);// 首要进度值累加20
break;
case R.id.bt_add2:
pb.incrementSecondaryProgressBy(40);// 次要进度值累加40
break;
default:
break;
}
}
}
}
RatingBar评分条的使用:
<RatingBar
android:id="@+id/ratingbar_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:isIndicator="false"
android:numStars="5"
android:stepSize="0.5"/>
rb=(RatingBar) findViewById(R.id.ratingbar_id);
rb.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar arg0, float arg1, boolean arg2) {
// 1、当前绑定的ratingbar的对象
//2、当前评分的进度
//3、是否由用户触发
Toast.makeText(RatingBarDemo.this, "我是ratingbar", Toast.LENGTH_SHORT).show();
Log.i("out", "当前ratingbar的评分:"+arg1+"是否来自用户"+arg2+"当前评分刻度"+arg0.getStepSize());
}
});
DatePicker日期选择器和TimePicker的使用
package com.example.ui;
import java.util.Calendar;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.DatePicker;
import android.widget.DatePicker.OnDateChangedListener;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;
import android.widget.Toast;
public class DatePickerDemo extends Activity {
private DatePicker dp;
private TimePicker tp;
private TextView tv;
private int Year, Month, Day, Hour, Minute;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.datepicker);
initView();
getCurrentTime();
setPicker();
}
private void getCurrentTime() {
// 获取系统当前时间
Calendar calendar = Calendar.getInstance();
Year = calendar.get(Calendar.YEAR);
Month = calendar.get(Calendar.MONTH);
Day = calendar.get(Calendar.DAY_OF_MONTH);
Hour = calendar.get(Calendar.HOUR);
Minute = calendar.get(Calendar.MINUTE);
}
private void setPicker() {
// 设置时间选择器为24小时
tp.setIs24HourView(true);
// 设置时间选择器的当前时间
tp.setCurrentHour(Hour);
tp.setCurrentMinute(Minute);
tp.setOnTimeChangedListener(new OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker arg0, int arg1, int arg2) {
// 当时间选择器发生改变时触发(对象,小时,分钟)
Log.i("TimePicker", arg1 + "-" + arg2);
Hour = arg1;
Minute = arg2;
}
});
// 设置日期选择器的时间
dp.init(Year, Month, Day, new OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker arg0, int arg1, int arg2,
int arg3) {
Toast.makeText(DatePickerDemo.this, "a", Toast.LENGTH_LONG)
.show();
// 对象,年,月,日
Log.i("DatePicker", arg1 + "-" + (arg2 + 1) + "-" + arg3);
// 将时间日期显示在textview上
tv.setText(+arg1 + "-" + (arg2 + 1) + "-" + arg3 + " " + Hour
+ "-" + Minute);
}
});
}
private void initView() {
// 获取对象
dp = (DatePicker) findViewById(R.id.dp);
tp = (TimePicker) findViewById(R.id.tp);
tv = (TextView) findViewById(R.id.dp_tv);
}
}
Activity的管理
- 内容概在一个应用程序中定义多个Activity
- 启动一个Activity
- Android当中的back stack
创建一个Activity的流程
- 创建一个Activity的子类
- 重写onCreate方法,当前Activity的入口
- 在AndroidManifest.xml中注册
- AndroidManifest中有这段代码的就是默认打开的第一个界面
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
启动一个Activity的流程
- -创建Intent意图对象(连接四大组件的纽带,可以实现界面切换,可以包含动作和动作数据)
- -调用setClass设置要启动哪个Activity
- -调用startActivity进行跳转
bt=(Button) findViewById(R.id.bt);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
/*
* 启动一个activity
* 1.创建Intent对象
* 2.调用setClass你要跳转哪个activity
* 3.startActivity
*/
Intent intent =new Intent();
//当前Activity,你要跳转的Activity
intent.setClass(Activity1.this, Activity02.class);
startActivity(intent);
}
});
BackStack回退栈
栈的作用:是一个先进后出的结构,回退栈中只显示最上面的Activity,主要用于维护记录Activity的启动顺序,
backStack中可存多个Activity,但操作系统中只显示此Activity对象,其它Acitivity对象都会被压入到栈中,
当按back键,栈顶端的Activity会被销毁。