Android之十七 进度条和Hanlder

举报
tea_year 发表于 2021/12/30 01:23:22 2021/12/30
【摘要】 视频课:https://edu.csdn.net/course/play/7621 构建进度条 在XML布局文件中使用ProgressBar标签布局视图 <ProgressBar         android:id="@+id/progressbar...

视频课: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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。