前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Android之十七 进度条和Hanlder

Android之十七 进度条和Hanlder

作者头像
用户9184480
发布2024-12-17 15:05:58
发布2024-12-17 15:05:58
500
举报
文章被收录于专栏:云计算linux

构建进度条

在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();

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档