麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 系統(tǒng) > Android > 正文

解析android中ProgressBar的用法

2020-04-11 12:11:00
字體:
供稿:網(wǎng)友

范例說明
Android的Widget,有許多是為了與User交互而特別設(shè)計(jì)的,但也有部分是作為程序提示、顯示程序運(yùn)行狀態(tài)的Widget?,F(xiàn)在介紹的范例,與前一章介紹過的ProgressDialog對(duì)話框的應(yīng)用目的相似,但由于前章介紹的ProgressDialog是繼承自Android.app.ProgressDialog所設(shè)計(jì)的互動(dòng)對(duì)話窗口,在應(yīng)用時(shí),必須新建ProgressDialog對(duì)象,在運(yùn)行時(shí)會(huì)彈出“對(duì)話框”作為提醒,此時(shí)應(yīng)用程序后臺(tái)失去焦點(diǎn),直到進(jìn)程結(jié)束后,才會(huì)將控制權(quán)交給應(yīng)用程序,如果在Activity當(dāng)中不希望后臺(tái)失焦,又希望提示User有某后臺(tái)程序正處于忙碌階段,此時(shí),ProgressBar就會(huì)派上用場(chǎng)了。

Android提供的ProgressBar Widget控件與ProgressDialog應(yīng)用目標(biāo)不同,在程序一開始即可在main.xml Layout當(dāng)中布局,先將部署在Layout里的ProgressBar的屬性設(shè)為隱藏(一開始看不見),而后使用進(jìn)程來“假裝”程序忙碌中,但不同的是,可在進(jìn)程當(dāng)中取得運(yùn)行時(shí)的進(jìn)度,在“運(yùn)行”的過程中,將運(yùn)行進(jìn)度通過TextView顯示出來。本范例除了學(xué)習(xí)ProgressBar Widget的顯示及使用之外,另一個(gè)學(xué)習(xí)關(guān)鍵則是Handler的使用,因?yàn)樾缕鸬倪M(jìn)程無法訪問Activity里的Widget,也無法將運(yùn)行狀態(tài)外送出來,所以需要通過Handler及Message對(duì)象,將進(jìn)程里的狀態(tài)往外傳遞,最后由Activity的Handler事件接收取得運(yùn)行的狀態(tài)。

范例程序
src/irdc.ex04_17/EX04_17.java
為了讓Thread運(yùn)行過程中,可以不斷地將信息往Activity傳遞,所以用了Android.os.Handler對(duì)象及Android.os.Message對(duì)象,且在類成員變量中聲明了兩個(gè)整數(shù):GUI_STOP_NOTIFIER與GUI_THREADING_NOTIFIER,這兩個(gè)整數(shù)將作為信息傳遞出來時(shí)的信號(hào)標(biāo)識(shí),前者為當(dāng)Thread需要喊停的時(shí)候處理,后者為進(jìn)程正在運(yùn)行過程中所需處理的標(biāo)識(shí)。

程序中設(shè)計(jì)了一個(gè)按鈕,此按鈕的工作是讓原本部署在main.xml里的ProgressBar顯示出來(原來是設(shè)置為Android:visibility="gone"),而因?yàn)槟J(rèn)在main.xml中沒有指定它的indeterm- inate屬性,所以即便在程序中強(qiáng)制調(diào)用了ProgressBar的setIndeterminate()方法,也無法改變ProgressBar.getProgress()的值,這個(gè)值將永遠(yuǎn)為0。因此,筆者想要使用循環(huán)圖片動(dòng)畫作為運(yùn)行過程中的動(dòng)畫,并用了一個(gè)Counter(整數(shù))來遞增,表示運(yùn)行的百分比。

復(fù)制代碼 代碼如下:

/* import程序略 */

public class EX04_17 extends Activity
{
  private TextView mTextView01;
  private Button mButton01;
  private ProgressBar mProgressBar01;
  public int intCounter=0;

  /* 自定義Handler信息代碼,用以作為標(biāo)識(shí)事件處理 */
  protected static final int GUI_STOP_NOTIFIER = 0x108;
  protected static final int GUI_THREADING_NOTIFIER = 0x109;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mButton01 = (Button)findViewById(R.id.myButton1);
    mTextView01 = (TextView)findViewById(R.id.myTextView1);

    /* 設(shè)置ProgressBar widget對(duì)象 */
    mProgressBar01 = (ProgressBar)findViewById(R.id.myProgressBar1);

    /* 調(diào)用setIndeterminate方法賦值indeterminate模式為false */
    mProgressBar01.setIndeterminate(false);

    /* 當(dāng)單擊按鈕后,開始進(jìn)程工作 */
    mButton01.setOnClickListener(new Button.OnClickListener()
    {
      @Override
      public void onClick(View v)
      {
        // TODO Auto-generated method stub

        /* 單擊按鈕讓ProgressBar顯示 */
        mTextView01.setText(R.string.str_progress_start);

        /* 將隱藏的ProgressBar顯示出來 */
        mProgressBar01.setVisibility(View.VISIBLE);

        /* 指定Progress為最多100 */
        mProgressBar01.setMax(100);

        /* 初始Progress為0 */
        mProgressBar01.setProgress(0);

        /* 開始一個(gè)進(jìn)程 */
        new Thread(new Runnable()
        {
          public void run()
          {
            /* 默認(rèn)0至9,共運(yùn)行10次的循環(huán)語(yǔ)句 */
            for (int i=0;i<10;i++)
            {
              try
              {
                /* 成員變量,用以識(shí)別加載進(jìn)度 */
                intCounter = (i+1)*20;
                /* 每運(yùn)行一次循環(huán),即暫停1秒 */
                Thread.sleep(1000);

                /* 當(dāng)Thread運(yùn)行5秒后顯示運(yùn)行結(jié)束 */
                if(i==4)
                {
                  /* 以Message對(duì)象,傳遞參數(shù)給Handler */
                  Message m = new Message();

                  /* 以what屬性指定User自定義 */
                  m.what = EX04_17.GUI_STOP_NOTIFIER;
                  EX04_17.this.myMessageHandler.sendMessage(m);
                  break;
                }
                else
                {
                  Message m = new Message();
                  m.what = EX04_17.GUI_THREADING_NOTIFIER;
                  EX04_17.this.myMessageHandler.sendMessage(m);
                }
              }
              catch(Exception e)
              {
                e.printStackTrace();
              }
            }
          }
        }).start();
      }
    });
  }

  /* Handler構(gòu)建之后,會(huì)監(jiān)聽傳來的信息代碼 */
  Handler myMessageHandler = new Handler()
  {
    // @Override
    public void handleMessage(Message msg)
    {
      switch (msg.what)
      {
        /* 當(dāng)取得標(biāo)識(shí)為離開進(jìn)程時(shí)所取得的信息 */
        case EX04_17.GUI_STOP_NOTIFIER:

          /* 顯示運(yùn)行終了 */
          mTextView01.setText(R.string.str_progress_done);

          /* 設(shè)置ProgressBar Widget為隱藏 */
          mProgressBar01.setVisibility(View.GONE);
          Thread.currentThread().interrupt();
          break;

        /* 當(dāng)取得標(biāo)識(shí)為持續(xù)在進(jìn)程當(dāng)中時(shí)所取得的信息 */
        case EX04_17.GUI_THREADING_NOTIFIER:
          if(!Thread.currentThread().isInterrupted())
          {
            mProgressBar01.setProgress(intCounter);
            /* 將顯示進(jìn)度顯示于TextView當(dāng)中 */
            mTextView01.setText
            (
              getResources().getText(R.string.str_progress_start)+
              "("+Integer.toString(intCounter)+"%)/n"+
              "Progress:"+
              Integer.toString(mProgressBar01.getProgress())+
              "/n"+"Indeterminate:"+
              Boolean.toString(mProgressBar01.isIndeterminate())
            );
          }
          break;
      }
      super.handleMessage(msg);
    }
  };
}

擴(kuò)展學(xué)習(xí)
范例程序中,調(diào)用mProgressBar01.setIndeterminate(false),不顯示背景進(jìn)度Bar,若設(shè)置為mProgressBar01.setIndeterminate(true),也無法讓默認(rèn)的ProgressBar圖片(轉(zhuǎn)圈圈)有正確的進(jìn)度提示,理由是默認(rèn)的ProgressBar不支持indeterminate mode循環(huán)圖片方式,所以即便setIn- determinate(true)也無法正確顯示進(jìn)度。在本程序中,為刻意寫出作為對(duì)照練習(xí),一般在未知“進(jìn)度”的情況下,可改用文字的方式顯示進(jìn)度百分比,通過調(diào)用mProgressBar01.getProgress()取得運(yùn)行進(jìn)度值,顯示在文字中。請(qǐng)將Layout里的ProgressBar Widget定義中,加上一個(gè)android: indeterminateOnly屬性,指定其值為false,不顯示后臺(tái)進(jìn)度Bar.
如下所示:
復(fù)制代碼 代碼如下:

<ProgressBar
  android:id="@+id/myProgressBar1"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:max="100"
  android:progress="0"
  android:orientation="horizontal"
  android:progressBarStyle=
  "@android:style/Widget.ProgressBar.Horizontal"
  android:indeterminateOnly="false"
  android:visibility="gone"
/>

ProgressBar除了上述關(guān)于Android:progressBarStyle的屬性設(shè)置之外,筆者也調(diào)查了在線Android的源代碼(http://source.android.com),一些原本Android所使用的progressBarStyleHori- zontal屬性,除默認(rèn)“圓形”的圖片之外,還有其他的主題及方形圖片Drawable模式可以使用。
復(fù)制代碼 代碼如下:

<resources>
  <declare-styleable name="Theme">
  <!-- snip -->
  <attr name="progressBarStyleHorizontal" format="reference" />
</resources>

接下來看看,這段主題中的屬性名稱progressBarStyleHorizontal定義在frameworks/base/ core/res/res/values/ styles.xml里,如下所示:
復(fù)制代碼 代碼如下:

<resources>
  <style name="Widget.ProgressBar.Horizontal">
    <item name="android:indeterminateOnly">false</item>
    <item name="android:progressDrawable">
      @android:drawable/progress_horizontal
    </item>
    <item name="android:indeterminateDrawable">
      @android:drawable/progress_indeterminate_horizontal
    </item>
    <item name="android:minHeight">20dip</item>
    <item name="android:maxHeight">20dip</item>
  </style>
</resources>

由此可見,如果想讓Android使用其他樣式的ProgressBar,可以在原本的Layout(main.xml)里添加以下兩項(xiàng)屬性,以觀察運(yùn)行過程中的圖片變化。
復(fù)制代碼 代碼如下:

android:progressDrawable="@android:drawable/progress_horizontal"
android:indeterminateDrawable=
"@android:drawable/progress_indeterminate_horizontal"

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 91精品国产乱码久久桃 | 国产一级一片免费播放 | 日本在线视频一区二区三区 | 91久久久久久久久久久久久 | 99视频观看 | 一分钟免费观看完整版电影 | 龙床上的呻吟高h | 国产1区2区3区中文字幕 | 欧美一级免费视频 | 国产精品久久久免费看 | 欧美精品一区二区中文字幕 | 欧美.com | 成人免费久久网 | 羞羞视频免费网站含羞草 | 欧美成人高清视频 | 中文字幕免费播放 | 亚洲人成网站在e线播放 | 成人做爰高潮片免费视频韩国 | 素人视频在线观看免费 | 国产精品美女久久久久久网站 | 欧洲成人综合网 | 九九精品影院 | 国产91九色视频 | 国产精品性夜天天视频 | 国产精品成人一区二区三区吃奶 | 8x成人在线电影 | 91视频站 | 国产精品一区二区三区在线播放 | 欧美人人干 | 韩国一级免费视频 | 一级美女大片 | 136福利视频 | 成年人在线视频免费 | 91短视频版高清在线观看免费 | 91成人久久 | 国产在线a | 日韩毛片一区二区三区 | 亚洲最大的成人网 | 久久精品视频网址 | 99国产精品自拍 | 午夜精品毛片 |