Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 開發入門 >> Android 細說進度條

Android 細說進度條

日期:2016/3/13 17:14:11      編輯:開發入門

1、 自定義的單個控件

分別是重新繼承View或者其子類和SurfaceView或者其子類。如果是一般的應用程序開始,繼承View或者其子類就可以了,我們需要做的,就是重寫onDraw(canver)。SuerfaceVIEw主要用於幀數要求比較高的應用,如“視頻播放”和游戲開發,尤其是3D游戲開發,這裡不詳細敘述,以後說到關於游戲開發,我會專以一個帖子講解的。

2、 自定義的組合控件

組合的控件,因名思議,就是把幾個控件組合在一起,組合成一個更大的控件。一般是繼承一個Layout,如ReleativeLayout、LinearLayout、TableLayout等等,視具體情況而定。當然,裝在Layout裡而子控件,可以是系統自帶的,也可以通過第一方式自定義的控件。

這樣,只要大家發揮想象,通過上面兩種方法,就可以組合出千變萬化的控件了,一句話“沒有做不到,只有想不到”。

一、原理說完 ,下面先上圖,讓大家看看最終效果吧,如下圖:



二、要求:
要求進度條能從左到右減少。系統自帶的進度條,好像沒有方向可以設置的


三、技術點和難點


主要的技術點:android的Handle機制,ReleativeLayout的相對布局。

主要的難點:在android上,是不可以動態修改view的layout_width和layout_height的,因此要動態修改進度條的長度,需要不斷“刪除—增加”ImageView的方式來實現,而每次add進parent的ImageView的layout_width需要根據當前parent的width、max_value、current_progress三者計算出來,長度 = parent_width * (current_progress/max_value);另外還有一點,非常重要的,就是每次更換ImageVIEw時,都必須交生成一個線程,post給handle來做,這裡才不會造成界面阻塞,這一點很重要,不然界面要卡死的!!


Java代碼:

  1. public class MobileTokenProcessBar extends RelativeLayout {
  2. private int m_max = 20;
  3. private int m_process = 0;
  4. private ImageView mImageVIEw = null;
  5. private LayoutParams params;
  6. private Handler mHandler;
  7. private Thread mThread = new Thread(new Runnable() {
  8. @Override
  9. public void run() {
  10. reFlashPorcess(m_process);//界面的修改,交由線程來處理
  11. }
  12. });
  13. public MobileTokenProcessBar(Context context, AttributeSet attrs) {
  14. super(context, attrs);
  15. init();
  16. }

  17. public MobileTokenProcessBar(Context context){
  18. super(context);
  19. init();
  20. }

  21. private void init(){
  22. setBackgroundResource(R.drawable.processbar_out_bg);
  23. mHandler = new Handler(getContext().getMainLooper());
  24. params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
  25. params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
  26. }

  27. public void setMax(int max){
  28. m_max = max;
  29. }

  30. public int getMax(){
  31. return m_max;
  32. }

  33. public void setProgress(int process){
  34. if(process <= m_max ){
  35. m_process = process;
  36. mHandler.post(mThread);
  37. }
  38. }

  39. public int getProgress(){
  40. return m_process;
  41. }

  42. private int getCountLength(){
  43. return (getWidth() - 16) * m_process / m_max;
  44. }

  45. private void reFlashPorcess(int process){
  46. if(mImageVIEw != null)
  47. removeView(mImageVIEw);
  48. mImageVIEw = null;
  49. mImageView = new ImageVIEw(getContext());
  50. mImageView.setAdjustVIEwBounds(true);
  51. mImageVIEw.setScaleType(ScaleType.FIT_XY);
  52. mImageVIEw.setImageResource(R.drawable.processbar_in_bg);
  53. params.width = getCountLength();
  54. addView(mImageVIEw, params);
  55. }
  56. }
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved