国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Android開(kāi)發(fā)速成簡(jiǎn)潔教程十九:線程 Bezier曲線

移動(dòng)開(kāi)發(fā) Android
Android中使用線程Thread的方法和Java SE相同。和大多數(shù)OS系統(tǒng)一樣,Android中也有稱為UI Thread的主線程。UI Thread 主要用來(lái)給相應(yīng)的Widget分發(fā)消息,包括繪制(Drawing)事件。UI Thread 也是用來(lái)處理用戶交互事件的線程。

Android中使用線程Thread的方法和Java SE相同。和大多數(shù)OS系統(tǒng)一樣,Android中也有稱為UI Thread的主線程。UI Thread 主要用來(lái)給相應(yīng)的Widget分發(fā)消息,包括繪制(Drawing)事件。UI Thread 也是用來(lái)處理用戶交互事件的線程。比如:如果你按下屏幕上某個(gè)按鈕,UI 線程則將Touch 事件通知對(duì)應(yīng)的控件(Widgets),Widget 則將其狀態(tài)設(shè)置成“按下”,并把“重繪”(Invalidate)事件發(fā)到Event Queue中去。 UI線程從Event Queue中讀取事件后通知Widgets重畫自身。 

如果你的應(yīng)用設(shè)計(jì)不好的話, UI線程的這種單線程模式就會(huì)導(dǎo)致非常差的用戶響應(yīng)性能。特別是你將一些費(fèi)時(shí)的操作如網(wǎng)絡(luò)訪問(wèn)或數(shù)據(jù)庫(kù)訪問(wèn)也放在UI線程中,這些操作會(huì)造成用戶界面無(wú)反應(yīng),最糟糕的是,如果UI線程阻塞超過(guò)幾秒(5秒),著名的ANR對(duì)話框就會(huì)出現(xiàn): 

 

所以在設(shè)計(jì)應(yīng)用時(shí),需要把一些費(fèi)時(shí)的任務(wù)使用單獨(dú)的工作線程來(lái)運(yùn)行避免阻塞UI線程,但是如果在工作線程中想更新UI線程的話,不能直接在工作線程 中更新UI,這是因?yàn)閁I線程不是“Thread Safe”。因此所有UI相關(guān)的操作一般必須在UI Thread中進(jìn)行。 

Android OS提供了多種方法可以用在非UI線程訪問(wèn)UI線程。 

  • Activity.runOnUiThread(Runnable)
  • View.post(Runnable)
  • View.postDelayed(Runnable, long)
  • Handler

Bezier 示例動(dòng)態(tài)顯示Bezier曲線,使用了Activity.runOnUiThread 來(lái)更新屏幕,完整代碼如下:

  1. 1   public class Bezier extends Graphics2DActivity 
  2. 2   implements OnClickListener,Runnable{  
  3. 3     
  4. 4    /** 
  5. 5        * The animation thread. 
  6. 6        */ 
  7. 7       private Thread thread; 
  8. 8       private volatile boolean stopThread=false
  9. 9       private boolean stopOrNot=false
  10. 10      boolean drawn; 
  11. 11      /** 
  12. 12       * The random number generator. 
  13. 13       */ 
  14. 14      static java.util.Random random = new java.util.Random(); 
  15. 15      /** 
  16. 16       * The animated path 
  17. 17       */ 
  18. 18      Path path = new Path(); 
  19. 19      /** 
  20. 20       * Red brush used to fill the path. 
  21. 21       */ 
  22. 22      SolidBrush brush = new SolidBrush(Color.RED); 
  23. 23      private static final int NUMPTS = 6
  24. 24      private int animpts[] = new int[NUMPTS * 2]; 
  25. 25      private int deltas[] = new int[NUMPTS * 2]; 
  26. 26      long startt, endt; 
  27. 27       
  28. 28   private Button btnOptions; 
  29. 29   @Override 
  30. 30   protected void drawImage() { 
  31. 31     drawDemo(100100); 
  32. 32      
  33. 33   } 
  34. 34     
  35. 35   public void onCreate(Bundle savedInstanceState) { 
  36. 36    super.onCreate(savedInstanceState); 
  37. 37    setContentView(R.layout.beziers); 
  38. 38    graphic2dView 
  39. 39       = (GuidebeeGraphics2DView) findViewById(R.id.graphics2dview); 
  40. 40    btnOptions = (Button) findViewById(R.id.btnStopStart); 
  41. 41    btnOptions.setOnClickListener(this); 
  42. 42    reset(100,100); 
  43. 43    if (thread == null) { 
  44. 44              thread = new Thread(this); 
  45. 45              thread.start(); 
  46. 46          } 
  47. 47      
  48. 48   }  
  49. 49    
  50. 50   @Override 
  51. 51   public void onClick(View view) { 
  52. 52      
  53. 53    if(!stopOrNot){ 
  54. 54     btnOptions.setText("Start"); 
  55. 55        stopThread=true
  56. 56    } 
  57. 57    else
  58. 58     stopThread=false
  59. 59     btnOptions.setText("Stop"); 
  60. 60     if (thread == null) { 
  61. 61               thread = new Thread(this); 
  62. 62               thread.start(); 
  63. 63           } 
  64. 64    } 
  65. 65    stopOrNot=!stopOrNot; 
  66. 66      
  67. 67   }  
  68. 68      /** 
  69. 69       * Generates new points for the path. 
  70. 70       */ 
  71. 71      private void animate(int[] pts, int[] deltas, 
  72. 72        int i, int limit) { 
  73. 73          int newpt = pts[i] + deltas[i]; 
  74. 74          if (newpt <= 0) { 
  75. 75              newpt = -newpt; 
  76. 76              deltas[i] = (random.nextInt() & 0x00000003
  77. 77              + 2
  78. 78          } else if (newpt >= limit) { 
  79. 79              newpt = 2 * limit - newpt; 
  80. 80              deltas[i] = -((random.nextInt() & 0x00000003
  81. 81                + 2); 
  82. 82          } 
  83. 83          pts[i] = newpt; 
  84. 84      }  
  85. 85    
  86. 86      /** 
  87. 87       * Resets the animation data. 
  88. 88       */ 
  89. 89      private void reset(int w, int h) { 
  90. 90          for (int i = 0; i < animpts.length; i += 2) { 
  91. 91              animpts[i + 0
  92. 92                      = (random.nextInt() & 0x00000003
  93. 93                      * w / 2
  94. 94              animpts[i + 1
  95. 95                      = (random.nextInt() & 0x00000003
  96. 96                      * h / 2
  97. 97              deltas[i + 0
  98. 98                     = (random.nextInt() & 0x00000003
  99. 99                     * 6 + 4
  100. 100             deltas[i + 1
  101. 101                    = (random.nextInt() & 0x00000003
  102. 102                    * 6 + 4
  103. 103             if (animpts[i + 0] > w / 2) { 
  104. 104                 deltas[i + 0] = -deltas[i + 0]; 
  105. 105             } 
  106. 106             if (animpts[i + 1] > h / 2) { 
  107. 107                 deltas[i + 1] = -deltas[i + 1]; 
  108. 108             } 
  109. 109         } 
  110. 110     }  
  111. 111   
  112. 112     final Runnable updateCanvas = new Runnable() { 
  113. 113   public void run() { 
  114. 114    int offsetX = (graphic2dView.getWidth() - 
  115. 115      SharedGraphics2DInstance.CANVAS_WIDTH) / 2
  116. 116    int offsetY = (graphic2dView.getHeight() 
  117. 117      - SharedGraphics2DInstance.CANVAS_HEIGHT) / 2
  118. 118    graphic2dView.invalidate(offsetX,offsetY, 
  119. 119      offsetX+100,offsetY+100); 
  120. 120   } 
  121. 121  }; 
  122. 122     /** 
  123. 123      * Sets the points of the path and draws and fills the path. 
  124. 124      */ 
  125. 125     private void drawDemo(int w, int h) { 
  126. 126         for (int i = 0; i < animpts.length; i += 2) { 
  127. 127             animate(animpts, deltas, i + 0, w); 
  128. 128             animate(animpts, deltas, i + 1, h); 
  129. 129         } 
  130. 130         //Generates the new pata data. 
  131. 131         path.reset(); 
  132. 132         int[] ctrlpts = animpts; 
  133. 133         int len = ctrlpts.length; 
  134. 134         int prevx = ctrlpts[len - 2]; 
  135. 135         int prevy = ctrlpts[len - 1]; 
  136. 136         int curx = ctrlpts[0]; 
  137. 137         int cury = ctrlpts[1]; 
  138. 138         int midx = (curx + prevx) / 2
  139. 139         int midy = (cury + prevy) / 2
  140. 140         path.moveTo(midx, midy); 
  141. 141         for (int i = 2; i <= ctrlpts.length; i += 2) { 
  142. 142             int x1 = (curx + midx) / 2
  143. 143             int y1 = (cury + midy) / 2
  144. 144             prevx = curx; 
  145. 145             prevy = cury; 
  146. 146             if (i < ctrlpts.length) { 
  147. 147                 curx = ctrlpts[i + 0]; 
  148. 148                 cury = ctrlpts[i + 1]; 
  149. 149             } else { 
  150. 150                 curx = ctrlpts[0]; 
  151. 151                 cury = ctrlpts[1]; 
  152. 152             } 
  153. 153             midx = (curx + prevx) / 2
  154. 154             midy = (cury + prevy) / 2
  155. 155             int x2 = (prevx + midx) / 2
  156. 156             int y2 = (prevy + midy) / 2
  157. 157             path.curveTo(x1, y1, x2, y2, midx, midy); 
  158. 158         } 
  159. 159         path.closePath(); 
  160. 160         // clear the clipRect area before production  
  161. 161   
  162. 162         graphics2D.clear(Color.WHITE); 
  163. 163         graphics2D.fill(brush, path);  
  164. 164   
  165. 165         this.runOnUiThread(updateCanvas);  
  166. 166     } 
  167. 167      
  168. 168       
  169. 169   
  170. 170     public void run() { 
  171. 171         Thread me = Thread.currentThread();  
  172. 172   
  173. 173         if (!drawn) { 
  174. 174             synchronized (this) { 
  175. 175                 graphics2D.clear(Color.WHITE); 
  176. 176                 graphics2D.fill(brush, path); 
  177. 177                 graphic2dView.refreshCanvas(); 
  178. 178                 drawn = true
  179. 179             } 
  180. 180         } 
  181. 181         while (thread == me && !stopThread) { 
  182. 182             drawDemo(100,100); 
  183. 183         } 
  184. 184         thread = null
  185. 185     } 
  186. 186 } 

 

除了上述的方法外,Android還提供了AsyncTask類以簡(jiǎn)化工作線程與UI線程之間的通信。這里不詳述。此外,上面Bezier曲線動(dòng)畫在屏幕上顯示時(shí)有閃爍的現(xiàn)象,這是動(dòng)態(tài)顯示圖像的一個(gè)常見(jiàn)問(wèn)題,后面將專門討論。

責(zé)任編輯:閆佳明 來(lái)源: imobilebbs
相關(guān)推薦

2013-12-26 15:43:07

Android開(kāi)發(fā)Android應(yīng)用Activities

2013-12-26 15:10:08

Android開(kāi)發(fā)應(yīng)用和框架Linux 內(nèi)核

2013-12-26 15:18:09

Android開(kāi)發(fā)安裝開(kāi)發(fā)環(huán)境

2013-12-27 14:34:46

Android開(kāi)發(fā)Android應(yīng)用短信觸發(fā)示例

2013-12-27 14:05:22

Android開(kāi)發(fā)Android應(yīng)用Dialog

2013-12-27 13:49:22

Android開(kāi)發(fā)Android應(yīng)用Button

2013-12-26 16:59:12

Android開(kāi)發(fā)Android應(yīng)用數(shù)據(jù)綁定Data Bi

2013-12-26 16:24:13

Android開(kāi)發(fā)Android應(yīng)用Intents

2013-12-27 12:51:44

Android開(kāi)發(fā)Android應(yīng)用引路蜂

2013-12-26 15:34:19

Android開(kāi)發(fā)Android應(yīng)用基本概念

2013-12-27 16:06:10

Android開(kāi)發(fā)Android應(yīng)用發(fā)布應(yīng)用

2013-12-26 15:46:30

Android開(kāi)發(fā)Android應(yīng)用用戶界面設(shè)計(jì)

2013-12-27 13:27:05

Android開(kāi)發(fā)Android應(yīng)用RadioButton

2013-12-26 16:46:21

2013-12-27 15:31:26

Android開(kāi)發(fā)Android應(yīng)用資源Resources

2013-12-27 13:00:30

Android開(kāi)發(fā)Android應(yīng)用Context Men

2013-12-26 17:08:36

Android開(kāi)發(fā)Android應(yīng)用自定義Adapter顯

2013-12-27 12:42:15

Android開(kāi)發(fā)Android應(yīng)用引路蜂

2013-12-27 15:11:17

Android開(kāi)發(fā)訪問(wèn)Internet繪制在線地圖

2013-12-27 14:10:36

Android開(kāi)發(fā)Android應(yīng)用Transform
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本精品一区二区三区四区的功能| 久久久在线观看| 91人人澡人人爽人人精品| 美腿丝袜一区二区三区| 91免费精品国偷自产在线| 91精品国产自产在线丝袜啪| 欧美三级视频在线| 天堂а在线中文在线无限看推荐| 中文字幕av一区二区三区免费看| 亚洲国产精品无码观看久久| 久久精品国产**网站演员| 免费国产一区| 国产欧美大片| 久久伦理网站| 先锋a资源在线看亚洲| 99久久一区三区四区免费| 99久久婷婷| 91九色单男在线观看| 色777狠狠狠综合伊人| 日本国产高清不卡| 国内黄色精品| 国产热re99久久6国产精品| 久久不卡国产精品一区二区| 欧洲亚洲免费视频| 欧美日韩伦理在线免费| 成人午夜小视频| 午夜国产精品视频| 麻豆传媒一区| 国产尤物一区二区在线| 精品无码一区二区三区爱欲| 91免费看片在线观看| 在线免费av播放| 亚洲综合男人的天堂| 天天夜夜亚洲| 色婷婷综合中文久久一本| av女优在线| 精品国产乱码久久久久久久| 黄色欧美视频| 最色在线观看| 五月天久久比比资源色| 国产污污在线观看| 欧美午夜美女看片| 性开放的欧美大片| 日韩欧美在线观看一区二区三区| 青青草原av在线| 精品人伦一区二区色婷婷| 牛牛在线精品视频| 中国人与牲禽动交精品| 日本成人手机在线| 国产精品国产三级国产aⅴ浪潮| 99热精品久久| 青娱乐国产91| av一区二区三区四区| 波多野结衣xxxx| 狠狠做深爱婷婷久久综合一区| 在线播放麻豆| 亚洲一二三在线| 风间由美性色一区二区三区四区| 国产精品视频最多的网站| 在线日韩欧美| 香港三级日本三级a视频| 97国产一区二区| 中文在线天堂网| 亚洲精品福利免费在线观看| 国产劲爆久久| 看高清中日韩色视频| www.性欧美| 免费黄色在线视频网站| 亚洲精品电影在线| 偷拍视屏一区| 日本一区二区三区www| 国产亚洲一本大道中文在线| 成人精品一区二区三区校园激情| 亚洲欧美日韩中文视频| 久久av中文| 国产精品12p| 午夜精品在线看| 午夜精品久久久久久久久久蜜桃| 日本午夜在线亚洲.国产| 日韩av一级片| 成人xxx免费视频播放| 欧美日韩国产一级| 丁香5月婷婷久久| 日韩欧美视频第二区| 亚洲欧洲日产国码二区| 性欧美高清come| 日本中文字幕不卡免费| 日韩激情一二三区| 国产视频资源| 国产一区二区三区毛片| 亚洲第一天堂| 99热在线免费播放| 亚洲精品久久久久久久久久久久久| 久久中文字幕导航| 法国空姐在线观看免费| 欧美性jizz18性欧美| 国产日本亚洲| 正在播放精油久久| 欧美性猛交99久久久久99按摩| www一区二区三区| 噜噜噜噜噜久久久久久91| 亚洲视频一区在线| 老司机成人影院| 九色综合婷婷综合| 婷婷丁香久久五月婷婷| 国产成人福利夜色影视| 欧美久久在线| 色网站国产精品| 亚洲精品aaaaa| 精品人妻一区二区三区四区在线| 日韩精品专区在线影院观看| 欧美va亚洲va日韩∨a综合色| 成年人免费视频观看| www.久久撸.com| 国内成人精品2018免费看| seseavlu视频在线| 91综合免费在线| 夜夜嗨av一区二区三区| 丁香5月婷婷久久| 狠狠爱免费视频| 日韩中文理论片| 国产电影一区在线| 国产高清视频色在线www| 欧美乱偷一区二区三区在线| 欧美艳星brazzers| 欧美a级在线| 国产精品99999| 福利视频久久| 欧美性极品xxxx做受| 日韩精品免费一区二区在线观看 | 成人国产激情在线| 中文字幕中文字幕在线中心一区| 91精品国产高清一区二区三区蜜臀| 亚洲私拍自拍| 最新av网站在线观看 | 欧美一区二区三区视频免费| 雨宫琴音一区二区在线| 色网站在线免费观看| 国产日韩精品入口| 精品人伦一区二区三区蜜桃网站 | 97超超碰碰| 欧美一级高清免费| 亚洲激情自拍视频| 日韩精品第一区| 国产一级免费在线观看| 国产精品成人一区二区三区| 欧美高清www午色夜在线视频| 免费一区视频| 亚洲午夜天堂| 成人亚洲视频在线观看| 97人人模人人爽人人喊中文字| 18成人在线视频| 91精品精品| 老司机99精品99| 中国成人亚色综合网站| 亚洲最新在线视频| 日本一区二区视频在线| 偷拍一区二区| 夜夜嗨aⅴ免费视频| 99高清视频有精品视频| 欧美一区二区在线播放| 国产精品996| 麻豆一区一区三区四区| 三区在线观看| 在线观看欧美一区| 欧美激情免费看| 亚洲丝袜制服诱惑| 欧美va天堂在线| 日本乱码一区二区三区不卡| 日日噜噜夜夜狠狠久久丁香五月| 久久中文字幕视频| 亚洲小说欧美激情另类| 亚洲在线播放| 99久久这里有精品| 久草在线新视觉| 亚洲国产精品www| 美女视频久久黄| 色老汉一区二区三区| 韩日av一区二区| 精品国产一区二区三区| 欧美激情一二三区| 久久99精品久久久水蜜桃| 欧美日韩国产色站一区二区三区| 欧美日韩伦理| 国产视频1区2区3区| 国产欧美精品日韩精品| 91精品国产色综合久久ai换脸 | 色婷婷综合久久久久久| 四虎影视在线观看2413| 亚洲一区三区| 97视频免费在线看| 日韩一区二区三区观看| 久久久精品国产免费观看同学| 欧美精品1区| 日韩激情欧美| 中文字幕有码在线视频| 日韩加勒比系列| 久久精品无码中文字幕| 成人在线视频电影| 久久精品一区中文字幕|