都知道水果公司(苹果)是己尊重用户体验著称的公司,其设计的产品人性化十足,不得不令后来者赞叹,竞相模仿。iphone的成功就是其典型的案例,做为其移动系统的死对头 Google 想要在市场上分得一杯羹用户体验也是其不能小看的一个重要部分。Android系统出道时,就以一系列具富观赏性的UI组件捕获了众多的 Android 应用层的设计人员与开发人员,比较典型的两个与用户交互的控件为:进度条 ProgressBar 与 拖动条 SeekBar。

进度条(ProgressBar)

  当一个应用程序在后台执行时,前台界面不会产生变化,但因为 Android 各机型配置大不相同,有时执行程序的过程中用户不知道发生了什么事,但界面却发生了变化。这时需要与用户交互的进度条用来提示用户后台执行程序的进度,这种做法是符合人性化的,进度条充分的符合上面的需求。进度条的详解如下:

  • 1、进度条风格
  • 2、进度条主要属性方法
  • 3、模拟程序运行,使用进度条

1、进度条分类

  • 长形进度条 (progressBarStyleHorizontal)
  • 大圆形进度条(progressBarStyleLarge)
  • 小圆形进度条 (progressBarStyleSmall)
  • 默认风格 (progressBarStyle)

  大致的使用场景为:比如,应用程序装载资源或者网络连接。下面介绍如何在 xml 中声明其中两种典型的进度条,先看一段布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
<ProgressBar android:id="@+id/ProgressBar01" android:layout_width="200dp" 
style="?android:attr/progressBarStyleHorizontal"
android:layout_height="wrap_content"
android:indeterminate="false"
android:visibility="gone"
></ProgressBar>

<ProgressBar android:id="@+id/ProgressBar02" android:layout_width="wrap_content"
android:max="100" 
style="?android:attr/progressBarStyleLarge"
android:progress="50" android:secondaryProgress="70"
android:indeterminate="false"
android:visibility="gone"
 android:layout_height="wrap_content"></ProgressBar>

<Button android:text="开始" android:id="@+id/Button01" 
android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>

  清单中,ProgressBar01为长形进度条,ProgressBar02为大圆形进度条,使用方法为声明“style=”在样式上加上各自属性,加载即可。

2、进度条主要属性方法

  • indeterminate
    进度条分 不确定 (indeterminate=true)和 确定 (indeterminate=false)2种,默认值是(indeterminate=true)不确定
  • setMax
    设置进度条的最大值,同时,确定(indeterminate=false)进度条中的最大值的设定,将调用 setMax()方法。
  • setProgress
    Android 进度条中当前进度值的设置。
  • setSecondaryProgress
    第二进度条的设置。
  • setVisibility
    设置可见性。

3、模拟程序运行,使用进度条

界面布局引用上面 XML 布局文件,现在开始程序的实现步骤了:程序加载时,设置两个进度条的当前进度值为0,从0开始到Max值 100,的数值做递值相加,用户点击按钮时,模拟程序运行时间,起动一个线程为进度条的Progress 赋值。这里我们需要借助线程和消息机制帮我们实现数值累加的效果,在消息里面当接收到的消息符合我们条件判断隐藏进度条的运行。具体业务逻辑代码如下:

模拟程序运行线程代码如下:

new Thread(new Runnable() {
                    
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        for(int i=0;i<10;i++)
                        {
                            try {
                                counter=(i+1)*20;
                                Thread.sleep(1000);
                                if(i==4)
                                {
                                    Message msg=new Message();
                                    msg.what=GUI_STOP;
                                progressBarActivity.this.myHandler.sendMessage(msg);
                                break;
                                }
                                else
                                {
                                    Message msg=new Message();
                                    msg.what=GUI_THREADING;
                                    progressBarActivity.this.myHandler.sendMessage(msg);
                                }
                            } catch (Exception e) {
                                // TODO: handle exception
                                e.printStackTrace();
                            }
                        }
                    }
                }).start();

消息处理代码如下: 

 myHandler=new Handler()
        {
            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                switch (msg.what) {
                case GUI_STOP:
                    myBar.setVisibility(View.GONE);
                    myBar2.setVisibility(View.GONE);
                    Thread.currentThread().interrupt();
                    
                    break;
                case GUI_THREADING:
                    if(!Thread.currentThread().interrupted())
                    {
                        myBar.setProgress(counter);
                        myBar2.setProgress(counter);
                        setProgress(counter*100);
                        setSecondaryProgress(counter*100);
                    }
                    break;
                default:
                    break;
                }
                super.handleMessage(msg);
            }
        };

具体线程和消息机制的使用方法你可以参照:Android小項目之---時間線程應用(附源碼)  或者  Android 小項目之--消息、線程、動畫顯示圖片(附源碼) 线程和消息机制这两个知识点,必须掌握好,在项目中会经常使用到。具体的代码流程如下:

进度条完整代码参考

package com.terry;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

public class progressBarActivity extends Activity {
    private ProgressBar myBar;
    private ProgressBar myBar2;
    private Button myButton;
    private Handler myHandler;
    protected static final int GUI_STOP=0x1110;
    protected static final int GUI_THREADING=0x122;
    private int counter=0;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_PROGRESS);
        setProgressBarVisibility(true);
        setContentView(R.layout.main);
        
        
        /*
         * 查找对象
         */
        myBar=(ProgressBar)findViewById(R.id.ProgressBar01);
        myBar2=(ProgressBar)findViewById(R.id.ProgressBar02);
        myButton=(Button)findViewById(R.id.Button01);
        
        
        myButton.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                myBar.setVisibility(View.VISIBLE);
                myBar2.setVisibility(View.VISIBLE);
                myBar.setMax(100);
                myBar.setProgress(0);
                myBar2.setProgress(0);
                
                new Thread(new Runnable() {
                    
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        for(int i=0;i<10;i++)
                        {
                            try {
                                counter=(i+1)*20;
                                Thread.sleep(1000);
                                if(i==4)
                                {
                                    Message msg=new Message();
                                    msg.what=GUI_STOP;
                                progressBarActivity.this.myHandler.sendMessage(msg);
                                break;
                                }
                                else
                                {
                                    Message msg=new Message();
                                    msg.what=GUI_THREADING;
                                    progressBarActivity.this.myHandler.sendMessage(msg);
                                }
                            } catch (Exception e) {
                                // TODO: handle exception
                                e.printStackTrace();
                            }
                        }
                    }
                }).start();
            }
        });
        
        myHandler=new Handler()
        {
            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                switch (msg.what) {
                case GUI_STOP:
                    myBar.setVisibility(View.GONE);
                    myBar2.setVisibility(View.GONE);
                    Thread.currentThread().interrupt();
                    
                    break;
                case GUI_THREADING:
                    if(!Thread.currentThread().interrupted())
                    {
                        myBar.setProgress(counter);
                        myBar2.setProgress(counter);
                        setProgress(counter*100);
                        setSecondaryProgress(counter*100);
                    }
                    break;
                default:
                    break;
                }
                super.handleMessage(msg);
            }
        };
        
        
    }
}

运行效果如图:

拖动条(SeekBar)

听歌的时候,我们常常喜欢快进或者退回某一时间段,听歌的时候,我们喜欢控件音量大小来听歌。做为与用户交互密切的另外一个控件SeekBar拖动条,可以让用户拖动达到用户需要的效果的控件,在无外乎大大提高用户的体验。下面我们来讲讲此拖动条。

  • 1、拖动条的事件。
  • 2、拖动条的主要属性和方法。
  • 3、模拟方式实现手动的动作。

1、拖动条的事件

由于拖动条可以被用户控制。所以需要对其进行事件监听,这就需要实现SeekBar.OnSeekBarChangeListener接口。此接口共需要监听三个事件,分别是:

  • 数值改变(onProgressChanged)
  • 开始拖动(onStartTrackingTouch)
  • 停止拖动(onStopTrackingTouch)

2、 拖动条的主要属性和方法

  • setMax     
    设置拖动条的数值
  • setProgress
    设置拖动条当前的数值
  • setSeconddaryProgress
    设置第二拖动条的数值,即当前拖动条推荐的数值

3、模拟方式实现手动的动作

程序中模仿了用户拖动拖动条的过程,对三个事件分别作了讯录,代码如下:

拖动条全部源码

package com.terry;

import android.app.Activity;
import android.os.Bundle;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class SeekBarActivity  extends Activity{
    private SeekBar seek;
    private TextView myTextView;
    private TextView myTextView2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.seekbardemo);
        
        seek=(SeekBar)findViewById(R.id.SeekBar01);
        myTextView=(TextView)findViewById(R.id.TextView01);
        myTextView2=(TextView)findViewById(R.id.TextView02);
        
        seek.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
            
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                // TODO Auto-generated method stub
                myTextView2.setText("停止调节");
            }
            
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                // TODO Auto-generated method stub
                myTextView2.setText("开始调节");
            }
            
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress,
                    boolean fromUser) {
                // TODO Auto-generated method stub
                myTextView.setText("当前值 为:"+progress);
                
            }
        });
    }
}

运行效果如图:

较之进度条,拖动条的使用比进度条要简单得多,只要在对应的事件处理逻辑即可,具体详细的使用,具体项目中慢慢体会吧。。。 

源码下载:/Files/TerryBlog/progressBarDemo.rar

Android小项目之--前台界面与用户交互的对接 进度条与拖动条(附源码)相关推荐

  1. JAVA小项目(一)——一个简单的记帐本【轻松入门,附源码】

    目录 1. 实现效果 2.项目架构 3. 细节代码实现

  2. [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码)

    Sokoban 介绍 [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码) 游戏说明 经典的推箱子是一个来自日本的古 ...

  3. 微信小程序/uni-app 蓝牙打印开发教程和常见问题总结【文末附源码】

    微信小程序/uni-app 蓝牙打印开发教程和常见问题总结[文末附源码] 文章目录 微信小程序/uni-app 蓝牙打印开发教程和常见问题总结[文末附源码] 1️⃣ 写在前面 2️⃣ 蓝牙连接流程 3 ...

  4. java项目逻辑重要吗_JAVA小项目,逻辑+感觉+总结?java小白你做到了吗(源码+教程)...

    俗话说的好,一如JAVA深似海.听起来好像胡说八道,其实却是很实在. 学过java的人都知道,java分支多,知识点十分丰富,单单论基础知识,也够学一壶的了,很多人在学习基础的时候已经被基础知识烦倒, ...

  5. Android App开发实战项目之仿喜马拉雅的听说书App实现(超详细 附源码和演示视频)

    需要全部源码请点赞关注收藏后评论区留下QQ~~~ 一.需求分析 用户不仅能在平台上收听音频,还能成为内容创作者,总之长音频分享平台需要满足两种角色的使用:一种是作为内容创作者发布自己的音频,另一种是作 ...

  6. springboot+基于微信小程序的心理测评与活动管理的设计与实现 毕业设计-附源码191752

    小程序+spring boot心理测评与活动管理系统 摘  要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用 ...

  7. Android 利用广播实现黑名单【指定号码】的短信的拦截 附源码下载链接

    Android 利用广播实现指定号码的短信的拦截 根据最近的学习内容,今天实现了利用广播进行指定号码的拦截 步骤: ①.写一个数据库的帮助类,实现对数据库的创建,总共创建两个数据库psms(受保护的短 ...

  8. Android开发UI新技能,你get这个新技能了吗?(附源码详解)

    val state = +state { "Text Field to input" } TextField( value = state.value, onValueChange ...

  9. 【爬虫实战项目】Python爬虫批量下载评书音频并保存本地(附源码)

    前言 今天给大家介绍的是Python爬虫批量下载评书音频并保存本地,在这里给需要的小伙伴们代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是这 ...

最新文章

  1. 阿里p8程序员吐槽:新来应届生都开卡宴上班,当时就震惊了!
  2. 业务工作流平台设计(七)
  3. 善用各类知识管理工具,达到事半功倍的效果
  4. 【NOIP2016提高A组模拟9.9】闭门造车
  5. java math rint_Java Math.rint() 方法
  6. 图论--一般带花树匹配
  7. Codeforces 1169A Circle Metro
  8. mysql数据排序问题
  9. 文件夹共享失败解决方式
  10. 最保险的“跳槽理由”
  11. mysql的配置文件(my.ini或者 my.cnf)所在位置
  12. mysql报错解决方式:1449 - The user specified as a definer (‘root‘@‘%‘) does not exist
  13. 关于Cat,同轴,光纤等以太网电缆的所有信息
  14. cmos电路多余输入端能否悬空_CMOS门电路的多余输入端可以悬空,悬空时相当于输入为逻辑1。...
  15. 2016年总结和2017年计划
  16. 从零到完成安卓项目实战【安卓端+后端】
  17. 基于计算机视觉的手势识别技术
  18. k8s源码分析--kube-scheduler源码(一)
  19. 计算机中计量单位之间的换算
  20. 在QQ聊天中可以发的代码和说说代码(仅支持手机)

热门文章

  1. 山东省第三届数据应用赛事来了!
  2. 李宏毅强化学习完整笔记!开源项目《LeeDeepRL-Notes》发布
  3. KDD Cup 2020 多模态检索赛道:数据分析
  4. 2021 年 7 月编程语言排行榜
  5. 收藏 | 图解Word2vec,读这一篇就够了!
  6. CNN 分类古代陶器,表现超过考古专家,解决“考古学中的肮脏秘密”
  7. MIT霸气护学生:你换导师,我替你买单!
  8. CVPR官网:仍将进行线下会议,网友:您老真在乎办会费
  9. 年薪70W架构师:全套英语学习资源泄露,手慢则无!(禁止外传)
  10. 视学算法第五轮送书活动获奖名单