Android之十七 进度条和Hanlder
视频课:https://edu.csdn.net/course/play/7621
构建进度条
在XML布局文件中使用ProgressBar标签布局视图
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.ProgressBar.Horizontal"
/>
在Java代码中使用android.widget.ProgressBar类操作视图
ProgressBar bar = (ProgressBar)findViewById(R.id.progressbar);
//设定进度条的取值范围0~n
bar.setMax(10);
在XML布局文件中使用SeekBar标签布局视图
<SeekBar
android:id="@+id/seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
在Java代码中使用android.widget.SeekBar类操作视图
SeekBar seekBar = (SeekBar)findViewById(R.id.seekbar);
seekBar.setMax(10);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
{
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
//这里填写处理事件的代码
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
});
构建评分视图
XML布局文件中使用RatingBar标签
<RatingBar
android:id="@+id/ratingbar"
android:layout_width=“wrap_content"
android:layout_height="wrap_content” />
事件监听接口为android.widget.RatingBar.OnRatingBarChangeListener,Java代码中使用android.widget.RatingBar类
.RatingBar bar = (RatingBar)findViewById(R.id.ratingbar);
//设定评分视图显示的星的颗数
bar.setNumStars(5);
bar.setMax(10);
Handler简介
Handler相关知识介绍
Android应用的主线程,在应用程序启动时,Android会启动一条负责界面事件处理的主线程,当界面事件需要处理很长时间时,应该将任务放在一个子线程中运行
子线程不应该修改界面,因为主线程在负责,如果修改则线程不安全,Handler为解决子线程与主线程通讯而设立,在主线程运行时创建Handler对象
Handler对象将自动绑定到主线程中,主线程将会在消息循环过程中不停处理Handler中的数据处理需求,Handler提供了多种方法用于给子线程提供传递数据的方法:
post()、postAtTime()、postDelay()
sendMessage()、sendMessageAtTime()、sendMessageDelay()
实现淘宝自动播放动画步骤:
1.将要播放的动画复制到drawable目录
2.在布局文件中添加一个ImageView用于显示图片
3.在主线程中创建Handler处理图片更换动作
4.创建Timer(Timer自身就会启动一个子线程)定时发送消息
主视图Activity,图片资源代码如下:
//ImageView对象,用于显示图片
private ImageView image;
//定义数组,存储图片资源
private int[] images = {
R.drawable.image1,
R.drawable.image2,
R.drawable.image3,
R.drawable.image4,
R.drawable.image5,
};
int index = 0;//图片资源索引
定义Handler代码如下:
Handler handler = new Handler(){
//处理消息
@Override
public void handleMessage(Message msg) {
//如果是该线程发送的消息
if(msg.what==1)
{
//动态修改图片
image.setImageResource(images[index++%images.length]);
}
super.handleMessage(msg);
}
};
主视图Activity,onCreate()方法代码如下:
protected void onCreate(android.os.Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.handlertest);
image = (ImageView) findViewById(R.id.image);
//创建周期2秒的计时器,并创建执行任务
new Timer().schedule(new TimerTask() {
@Override
public void run() {
//发送一个what为1的空消息
handler.sendEmptyMessage(1);
}
},0,2000);
}
总结
上面代码中,Timer用于周期性执行指定任务,Timer对象可调度TimerTask对 象,TimerTask对象的本质就是启动一条新的线程,由于Android不允许其他线程修改Activity里的UI界面(因为不安全),因此新线程 只能发送一条消息,通知主线程更新界面。
Handler的作用就是建立主线程和子线程之间的纽带,子线程通过Handler对象发送消息,并回传给Handler,这样主线程就可以通过Handler处理消息了。
Handler机制原理解析
Handler工作中需要使用到以下组件:
Message:Handler接受和处理的消息对象
Looper:不断(死循环)读取MessageQueue中的Message对象,如果读到Message就将Message传递给发送该消息的Handler进行处理。每个线程只有一个Looper对象
MessageQueue:消息队列,以先进先出的方式管理Message对象,程序创建Looper对象时会在其构造器中创建MessageQueue对象
Handler的作用主要有两个:
1.在新启动的线程(子线程)中发送消息
2.在主线程中获取、处理消息
子 线程使用Handler发送消息(Message),被发送的消息必须被送到指定的消息队列(MessageQueue,由Looper管 理,Looper由子线程自己创建);主线程通过系统创建的Looper对象的looper()方法使用一个死循环不断取出MessageQueue中的 消息,并交由Handler处理,进而实现主线程中视图的改变
通过Handler消息传递机制修改Activity中文本信息
//创建Handler
Handler handler = new Handler(){
//处理消息
public void handleMessage(android.os.Message msg) {
if(msg.what==1)
{
txt.setText("update handler");
}
};
};
/启动新线程发送消息
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);//线程沉睡3秒
handler.sendEmptyMessage(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
文章来源: aaaedu.blog.csdn.net,作者:tea_year,版权归原作者所有,如需转载,请联系作者。
原文链接:aaaedu.blog.csdn.net/article/details/52155363
- 点赞
- 收藏
- 关注作者
评论(0)