进度条类组件ProgressBar

介绍

         从图 5.19 可以看出:ProgressBar 组件继承自 View,而 SeekBar 和 RatingBar 组件又间接继承自 ProgressBar 组件。所以对于 ProgressBar 的属性,同样适用于 SeekBarRatingBar 组件。

         当一个应用在后台执行时,前台界面不会有任何信息,这时用户根本不知道程序是否在执行以及执行进度等,因此需要使用进度条来提示程序执行的进度。在 Android 中,提供了两种进度条,一种是水平进度条,另一种是圆形进度条。

基本语法:

<ProgressBar
 属性列表
 >
</ProgressBar>

XML属性

XML属性描述
android:max用于设置进度条的最大值
android:progress用于指定进度条已完成的进度值
android:progressDrawable用于设置进度条轨道的绘制形式

进度条组件还提供了下面两个常用方法用于操作进度:

  1. setProgress(int progress) 方法:用于设置进度完成的百分比
  2. getProgress()方法:得到当前进度条的值
  3. incrementProgressBy(int diff) 方法:用于设置进度条的进度增加或减少。当参数值为正数时,表示进度增加;当参数值为负数时,表示进度减少 
  4. getVisibility()方法:得到当前视图可视状态
  5. setVisibility()方法:设置当前视图可视状态

ProgressBar 的 style 属性的可选值

XML属性描述
?android:attr/progressBarStyleHorizontal细水平长条进度条
?android:attr/progressBarStyleLarge 大圆形进度条
?android:attr/progressBarStyleSmall小圆形进度条
@android:style/Widget.ProgressBar.Large大跳跃、旋转画面的进度条
@android:style/Widget.ProgressBar.Small小跳跃、旋转画面的进度条
@android:style/Widget.ProgressBar.Horizontal粗水平长条进度条

例子

常规展示

编写布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="15dp"
    tools:context=".bar.ProgressBarActivity">

    <!--水平进度条-->
    <!--progress:设置初始值-->
    <ProgressBar
        android:id="@+id/horizontal_progress_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100"
        android:progress="50"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:layout_marginTop="5dp">

        <Button
            android:id="@+id/btn_dec"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="减少"
            android:layout_alignParentLeft="true" />

        <Button
            android:id="@+id/btn_add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="增加"
            android:layout_alignParentRight="true" />

    </RelativeLayout>

    <!--圆形进度条-->
    <!--设置max和progress属性无意义,不会体现在圆形进度条上-->
    <ProgressBar
        android:id="@+id/round_progress_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn_round"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Round"
        android:layout_marginTop="10dp"
        android:layout_gravity="center_horizontal" />

</LinearLayout>

编写ProgressBarActivity

public class ProgressBarActivity extends AppCompatActivity {

    private Button mBtAdd;
    private Button mBtDec;
    private Button mBtRound;
    private ProgressBar horizontalProgressBar;
    private ProgressBar roundProgressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_progress_bar);

        mBtAdd = (Button) findViewById(R.id.btn_add);
        mBtDec = (Button) findViewById(R.id.btn_dec);
        mBtRound= (Button) findViewById(R.id.btn_round);

        horizontalProgressBar = (ProgressBar) findViewById(R.id.horizontal_progress_bar);
        roundProgressBar = (ProgressBar) findViewById(R.id.round_progress_bar);

        //设置点击按钮进度条加一事件
        mBtAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                horizontalProgressBar.setProgress(horizontalProgressBar.getProgress()+1);
            }
        });

        //设置点击按钮进度条减一事件
        mBtDec.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                horizontalProgressBar.setProgress(horizontalProgressBar.getProgress()-1);
            }
        });

        //点击按钮,能看到进度条会在显示与隐藏之间来回切换
        mBtRound.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (v.getId()) {
                    case R.id.btn_round:
                    if(roundProgressBar.getVisibility() == View.GONE) {
                        roundProgressBar.setVisibility(View.VISIBLE);
                    }else{
                        roundProgressBar.setVisibility(View.GONE);
                    }
                    break;
                }
            }
        });
    }
}

效果

 

 

模拟游戏进度条

编写布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 水平进度条 -->
    <ProgressBar
        android:id="@+id/progressBar1"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="25dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginBottom="60dp"
        android:max="100" />

</RelativeLayout>

编写ProgressBarActivity2

public class ProgressBarActivity2 extends AppCompatActivity {

    private ProgressBar horizonP; //水平进度条
    private int mProgressStatus = 0; //完成进度
    private Handler mHandler; //声明一个用于处理消息的Handler类的对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_progress_bar2);
        horizonP = (ProgressBar) findViewById(R.id.progressBar1); //获取水平进度条
        mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == 0x111) {
                    horizonP.setProgress(mProgressStatus); //更新进度
                } else {
                    Toast.makeText(ProgressBarActivity2.this,
                            "耗时操作已经完成", Toast.LENGTH_SHORT).show();
                    horizonP.setVisibility(View.GONE);//设置进度条不显示,并且不占用空间
                }
            }
        };
        new Thread(new Runnable() {
            public void run() {
                while (true) { //循环获取耗时操作完成的百分比,直到耗时操作结束
                    mProgressStatus = doWork(); //获取耗时操作完成的百分比
                    Message m = new Message(); //创建并实例化一个消息对象
                    if (mProgressStatus < 100) { //当完成进度不到100时,表示耗时任务未完成
                        m.what = 0x111; //设置代表耗时操作未完成的消息代码
                        mHandler.sendMessage(m); //发送信息
                    } else { //当完成进度到达100时,表示耗时操作完成
                        m.what = 0x110; //设置代表耗时操作已经完成的消息代码
                        mHandler.sendMessage(m); //发送消息
                        break; //退出循环
                    }
                }
            }
            //模拟一个耗时操作
            private int doWork() {
                //Math.random()是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值
                mProgressStatus += Math.random() * 10;//改变完成进度
                try {
                    Thread.sleep(200); //线程休眠200毫秒
                } catch (InterruptedException e) {
                    e.printStackTrace(); //输出异常信息
                }
                return mProgressStatus; //返回新的进度
            }
        }).start(); //开启一个线程
    }
}

效果 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值