-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
507 lines (370 loc) · 288 KB
/
Copy pathatom.xml
File metadata and controls
507 lines (370 loc) · 288 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>丿歌吟有梦</title>
<subtitle>不要让任何事成为你不学习的理由!</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://itdais.com/"/>
<updated>2016-10-13T02:05:46.051Z</updated>
<id>http://itdais.com/</id>
<author>
<name>丁军伟</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>BottomSheet使用详解</title>
<link href="http://itdais.com/2016/10/12/BottomSheet%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3/"/>
<id>http://itdais.com/2016/10/12/BottomSheet使用详解/</id>
<published>2016-10-11T16:00:00.000Z</published>
<updated>2016-10-13T02:05:46.051Z</updated>
<content type="html"><h3 id="BottomSheet使用详解"><a href="#BottomSheet使用详解" class="headerlink" title="BottomSheet使用详解"></a>BottomSheet使用详解</h3><p>Android Support Library 23.2里的 Design Support Library新加了一个Bottom Sheets控件,Bottom Sheets顾名思义就是底部操作控件,用于在屏幕底部创建一个可滑动关闭的视图,可以替代对话框和菜单。其中包含BottomSheets、BottomSheetDialog和BottomSheetDialogFragment三种可以使用。</p>
<p>BottomSheets常见的效果如图,并且在国内的知乎、百度地图上也是可以看到效果。</p>
<p><img src="http://img.blog.csdn.net/20161010212211396" alt="这里写图片描述"><img src="http://img.blog.csdn.net/20161010212246802" alt="这里写图片描述"></p>
<p>首先我们学习使用BottomSheets,BottomSheets其实也是依赖于Behavior机制的使用。<br>先引用依赖,最新的design包已经到24了<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">compile <span class="string">'com.android.support:design:24.2.1'</span></div></pre></td></tr></table></figure></p>
<h4 id="BottomSheets"><a href="#BottomSheets" class="headerlink" title="BottomSheets"></a>BottomSheets</h4><p>在布局文件xml中的使用,BottomSheets需要配合CoordinatorLayout控件<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div></pre></td><td class="code"><pre><div class="line">&lt;?xml version="1.0" encoding="utf-8"?&gt;</div><div class="line"><span class="tag">&lt;<span class="name">android.support.design.widget.CoordinatorLayout</span></span></div><div class="line"> <span class="attr">android:id</span>=<span class="string">"@+id/cl"</span></div><div class="line"> <span class="attr">xmlns:android</span>=<span class="string">"http://schemas.android.com/apk/res/android"</span></div><div class="line"> <span class="attr">xmlns:app</span>=<span class="string">"http://schemas.android.com/apk/res-auto"</span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span></div><div class="line"> <span class="attr">android:fitsSystemWindows</span>=<span class="string">"true"</span>&gt;</div><div class="line"></div><div class="line"> <span class="tag">&lt;<span class="name">android.support.v4.widget.NestedScrollView</span></span></div><div class="line"> <span class="attr">android:id</span>=<span class="string">"@+id/bottom_sheet"</span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span></div><div class="line"> <span class="attr">app:behavior_hideable</span>=<span class="string">"true"</span></div><div class="line"> <span class="attr">app:behavior_peekHeight</span>=<span class="string">"50dp"</span></div><div class="line"> <span class="attr">app:layout_behavior</span>=<span class="string">"@string/bottom_sheet_behavior"</span>&gt;</div><div class="line"></div><div class="line"> <span class="tag">&lt;<span class="name">LinearLayout</span></span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span></div><div class="line"> <span class="attr">android:orientation</span>=<span class="string">"vertical"</span>&gt;</div><div class="line"> <span class="comment">&lt;!-- 你自己的代码--&gt;</span></div><div class="line"> <span class="tag">&lt;/<span class="name">LinearLayout</span>&gt;</span></div><div class="line"> <span class="tag">&lt;/<span class="name">android.support.v4.widget.NestedScrollView</span>&gt;</span></div><div class="line"><span class="tag">&lt;/<span class="name">android.support.design.widget.CoordinatorLayout</span>&gt;</span></div></pre></td></tr></table></figure></p>
<p>其中包含三个属性<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">app:behavior_hideable=&quot;true&quot;</div><div class="line">app:behavior_peekHeight=&quot;0dp&quot;</div><div class="line">app:layout_behavior=&quot;@string/bottom_sheet_behavior&quot;</div></pre></td></tr></table></figure></p>
<p>app:behavior_peekHeight=”50dp” peekHeight是当Bottom Sheets关闭的时候,底部我们能看到的高度,默认是0不可见。</p>
<p>app:behavior_hideable=”true” hideable是当我们拖拽下拉的时候,bottom sheet是否能全部隐藏。</p>
<p>layout_behavior指向bottom_sheet_behavior,代表这是一个bottom Sheets</p>
<p>在java代码中的使用<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div></pre></td><td class="code"><pre><div class="line">BottomSheetBehavior behavior;</div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">onCreate</span><span class="params">(Bundle savedInstanceState)</span></span></div><div class="line"> &#123;</div><div class="line"> <span class="keyword">super</span>.onCreate(savedInstanceState);</div><div class="line"> setContentView(R.layout.activity_bottom_sheet);</div><div class="line"> View bottomSheet = findViewById(R.id.bottom_sheet);</div><div class="line"> behavior = BottomSheetBehavior.from(bottomSheet);</div><div class="line"> behavior.setBottomSheetCallback(<span class="keyword">new</span> BottomSheetBehavior.BottomSheetCallback() &#123;</div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onStateChanged</span><span class="params">(@NonNull View bottomSheet, <span class="keyword">int</span> newState)</span></span></div><div class="line"> &#123;</div><div class="line"> <span class="comment">//这里是bottomSheet状态的改变</span></div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onSlide</span><span class="params">(@NonNull View bottomSheet, <span class="keyword">float</span> slideOffset)</span></span></div><div class="line"> &#123;</div><div class="line"> <span class="comment">//这里是拖拽中的回调,根据slideOffset可以做一些动画</span></div><div class="line"> &#125;</div><div class="line"> &#125;);</div><div class="line"> &#125;</div></pre></td></tr></table></figure></p>
<p>behavior_hideable对应代码 behavior.setHideable(false);<br>behavior_peekHeight对应代码 behavior.setPeekHeight(50);</p>
<p>setBottomSheetCallback可以监听回调的状态,onStateChanged监听状态的改变,onSlide是拖拽的回调,onStateChanged可以监听到的回调一共有5种:</p>
<ul>
<li>STATE_HIDDEN: 隐藏状态。默认是false,可通过app:behavior_hideable属性设置。</li>
<li>STATE_COLLAPSED: 折叠关闭状态。可通过app:behavior_peekHeight来设置显示的高度,peekHeight默认是0。</li>
<li>STATE_DRAGGING: 被拖拽状态</li>
<li>STATE_SETTLING: 拖拽松开之后到达终点位置(collapsed or expanded)前的状态。</li>
<li>STATE_EXPANDED: 完全展开的状态。<br>BottomSheets控件配合NestedScrollView、RecyclerView使用效果会更好,合理的使用让APP逼格满满。</li>
</ul>
<p>我们需要在按钮按钮上添加对BottomSheets的显示和隐藏</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">if</span>(behavior.getState() == BottomSheetBehavior.STATE_EXPANDED) &#123;</div><div class="line"> behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);</div><div class="line">&#125;<span class="keyword">else</span> &#123;</div><div class="line"> behavior.setState(BottomSheetBehavior.STATE_EXPANDED);</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>效果如图:<br><img src="http://img.blog.csdn.net/20161012222917397" alt="效果图"></p>
<blockquote>
<p>design24.2.1的BottomSheets和23.2.0的BottomSheet有很大的区别,design23.2.0的包中如果你使用了BottomSheet,可以在屏幕外任何位置上拉即可拉出来布局,在24.2.1中没有了这个效果。</p>
</blockquote>
<h4 id="BottomSheetDialog"><a href="#BottomSheetDialog" class="headerlink" title="BottomSheetDialog"></a>BottomSheetDialog</h4><p>BottomSheetDialog应该是最实用的控件,也是使用率非常高的控件。它可以替代大多数网格显示和列表展示的dialog和popupwindow,默认宽度撑满,并且在BottomSheetDialog 区域中向下滑动也让对话框消失。</p>
<p>首先写一个dialog展示的xml,dialog中xml可以不用被CoordinatorLayout包裹,但是还是推荐实用推荐的滑动控件NestedScrollView<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div></pre></td><td class="code"><pre><div class="line">&lt;?xml version="1.0" encoding="utf-8"?&gt;</div><div class="line"><span class="tag">&lt;<span class="name">android.support.v4.widget.NestedScrollView</span></span></div><div class="line"> <span class="attr">xmlns:android</span>=<span class="string">"http://schemas.android.com/apk/res/android"</span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span>&gt;</div><div class="line"></div><div class="line"> <span class="tag">&lt;<span class="name">LinearLayout</span></span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span></div><div class="line"> <span class="attr">android:orientation</span>=<span class="string">"vertical"</span>&gt;</div><div class="line"></div><div class="line"> <span class="tag">&lt;<span class="name">TextView</span></span></div><div class="line"> <span class="attr">android:onClick</span>=<span class="string">"doclick"</span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"100dp"</span></div><div class="line"> <span class="attr">android:background</span>=<span class="string">"@color/colorPrimary"</span></div><div class="line"> <span class="attr">android:gravity</span>=<span class="string">"center"</span></div><div class="line"> <span class="attr">android:text</span>=<span class="string">"啦啦啦啦啦啦啦啦啦"</span></div><div class="line"> <span class="attr">android:textColor</span>=<span class="string">"@color/white"</span></div><div class="line"> <span class="attr">android:textSize</span>=<span class="string">"18sp"</span>/&gt;</div><div class="line"></div><div class="line"> <span class="tag">&lt;<span class="name">ImageView</span></span></div><div class="line"> <span class="attr">android:onClick</span>=<span class="string">"doclick"</span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span></div><div class="line"> <span class="attr">android:scaleType</span>=<span class="string">"centerCrop"</span></div><div class="line"> <span class="attr">android:src</span>=<span class="string">"@drawable/banner"</span>/&gt;</div><div class="line"> <span class="tag">&lt;/<span class="name">LinearLayout</span>&gt;</span></div><div class="line"><span class="tag">&lt;/<span class="name">android.support.v4.widget.NestedScrollView</span>&gt;</span></div></pre></td></tr></table></figure></p>
<p>编写java代码<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">BottomSheetDialog dialog = <span class="keyword">new</span> BottomSheetDialog(<span class="keyword">this</span>);</div><div class="line">View view = getLayoutInflater().inflate(R.layout.dialog_bottom_sheet, <span class="keyword">null</span>);</div><div class="line">dialog.setContentView(view);</div><div class="line">dialog.show();</div></pre></td></tr></table></figure></p>
<p>只需要四行我们就可以展示BottomSheets效果的dialog,高度为你设置的behavior_peekHeight或者默认高度,宽度撑满。在很多情况底部显示dialog的时候,都可以考虑实用BottomSheetDialog来实现。<br>效果如图:<br><img src="http://img.blog.csdn.net/20161012223020205" alt="这里写图片描述"></p>
<h4 id="BottomSheetDialogFragment"><a href="#BottomSheetDialogFragment" class="headerlink" title="BottomSheetDialogFragment"></a>BottomSheetDialogFragment</h4><p>BottomSheetDialogFragment可以帮助我们实现全屏的BottomSheet展示效果。新建一个类继承BottomSheetDialogFragment</p>
<p>xml使用BottomSheetDialog的布局样式,我们直接看java代码</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">FullSheetDialogFragment</span> <span class="keyword">extends</span> <span class="title">BottomSheetDialogFragment</span> </span>&#123;</div><div class="line"> <span class="keyword">private</span> BottomSheetBehavior mBehavior;</div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> Dialog <span class="title">onCreateDialog</span><span class="params">(Bundle savedInstanceState)</span></span></div><div class="line"> &#123;</div><div class="line"> BottomSheetDialog dialog = (BottomSheetDialog) <span class="keyword">super</span>.onCreateDialog(savedInstanceState);</div><div class="line"> View view = View.inflate(getContext(), R.layout.dialog_bottom_sheet, <span class="keyword">null</span>);</div><div class="line"> dialog.setContentView(view);</div><div class="line"> mBehavior = BottomSheetBehavior.from((View) view.getParent());</div><div class="line"> <span class="keyword">return</span> dialog;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onStart</span><span class="params">()</span></span></div><div class="line"> &#123;</div><div class="line"> <span class="keyword">super</span>.onStart();</div><div class="line"> <span class="comment">//默认全屏展开</span></div><div class="line"> mBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">doclick</span><span class="params">(View v)</span></span></div><div class="line"> &#123;</div><div class="line"> <span class="comment">//点击任意布局关闭</span></div><div class="line"> mBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>调用BottomSheetDialogFragment展示</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">new</span> FullSheetDialogFragment().show(getSupportFragmentManager(), <span class="string">"dialog"</span>);</div></pre></td></tr></table></figure>
<p>BottomSheetDialogFragment的效果跟BottomSheetDialog差不多,根据情况选择。<br>效果如图:<br><img src="http://img.blog.csdn.net/20161012223101441" alt="这里写图片描述"></p>
<p>BottomSheetDialog就介绍到此,如果有错误请指出,谢谢。</p>
<p>参考:<br><a href="http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0228/4008.html" target="_blank" rel="external">泡在网上的日子BottomSheets的使用</a></p>
<blockquote>
<p>个人网站 <a href="http:itdais.com" target="_blank" rel="external">歌吟有梦 itdais.com </a></p>
</blockquote>
<p>更多内容可以关注我的公众号:丁军伟Dev(或者搜索DingAndroid)<br><img src="http://img.blog.csdn.net/20161012205410808" alt="丁军伟Dev"></p>
</content>
<summary type="html">
<h3 id="BottomSheet使用详解"><a href="#BottomSheet使用详解" class="headerlink" title="BottomSheet使用详解"></a>BottomSheet使用详解</h3><p>Android Support Li
</summary>
<category term="Android" scheme="http://itdais.com/tags/Android/"/>
<category term="Gradle" scheme="http://itdais.com/tags/Gradle/"/>
</entry>
<entry>
<title>Android Studio运行时候报packageOfficialDebug错误</title>
<link href="http://itdais.com/2016/10/11/Android%20Studio%E8%BF%90%E8%A1%8C%E6%97%B6%E5%80%99%E6%8A%A5packageOfficialDebug%E9%94%99%E8%AF%AF/"/>
<id>http://itdais.com/2016/10/11/Android Studio运行时候报packageOfficialDebug错误/</id>
<published>2016-10-10T16:00:00.000Z</published>
<updated>2016-10-13T02:00:31.032Z</updated>
<content type="html"><h3 id="Android-Studio运行时候报packageOfficialDebug错误"><a href="#Android-Studio运行时候报packageOfficialDebug错误" class="headerlink" title="Android Studio运行时候报packageOfficialDebug错误"></a>Android Studio运行时候报packageOfficialDebug错误</h3><p>报错信息为</p>
<blockquote>
<p>Error:A problem was found with the configuration of task’:watch:packageOfficialDebug’.<br>File ‘…\build\intermediates\res\resources-official-debug-stripped.ap_’ specified for property ‘resourceFile’ does not exist.</p>
</blockquote>
<h4 id="解决方法一"><a href="#解决方法一" class="headerlink" title="解决方法一:"></a>解决方法一:</h4><p>这个大多数原因是开启了混淆造成的,关闭Debug模式下的混淆开关后重新编译即可,代码如下:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">buildTypes &#123;</div><div class="line"> release &#123;</div><div class="line"> buildConfigField(&quot;boolean&quot;, &quot;LOG_DEBUG&quot;, &quot;false&quot;)</div><div class="line"> minifyEnabled true</div><div class="line"> shrinkResources true</div><div class="line"> proguardFiles getDefaultProguardFile(&apos;proguard-android.txt&apos;), &apos;proguard-rules.pro&apos;</div><div class="line"> &#125;</div><div class="line"> debug &#123;</div><div class="line"> minifyEnabled false</div><div class="line"> shrinkResources false</div><div class="line"> buildConfigField(&quot;boolean&quot;, &quot;LOG_DEBUG&quot;, &quot;true&quot;)</div><div class="line"> proguardFiles getDefaultProguardFile(&apos;proguard-android.txt&apos;), &apos;proguard-rules.pro&apos;</div><div class="line"> &#125;</div><div class="line"> &#125;</div></pre></td></tr></table></figure>
<p>minifyEnabled即以前的runProguard,用来控制是否混淆。</p>
<p>shrinkResources为true时自动去掉多余资源。</p>
<blockquote>
<p>注:Gradle2.0以上的版本minifyEnabled字段为true时已经包含了shrinkResources,在代码优化时会自动去掉多余资源,所以在打正式包时也不需要设置shrinkResources字段。</p>
</blockquote>
<h4 id="解决方法二"><a href="#解决方法二" class="headerlink" title="解决方法二:"></a>解决方法二:</h4><p>Android Studio2.0以上有了Instant Run功能,很多情况下运行报错都跟Instant Run有关<br>进入File –&gt; Setting(Ctrl+Alt+S)找到InstantRun功能,把InstantRun功能关闭<br><img src="http://od19q3xls.bkt.clouddn.com/QQ%E6%88%AA%E5%9B%BE20161011150057.jpg" alt="image"></p>
</content>
<summary type="html">
<h3 id="Android-Studio运行时候报packageOfficialDebug错误"><a href="#Android-Studio运行时候报packageOfficialDebug错误" class="headerlink" title="Android St
</summary>
<category term="Android" scheme="http://itdais.com/tags/Android/"/>
<category term="Gradle" scheme="http://itdais.com/tags/Gradle/"/>
</entry>
<entry>
<title>AS运行时异常(一)</title>
<link href="http://itdais.com/2016/09/25/AS%E8%BF%90%E8%A1%8C%E6%97%B6%E5%BC%82%E5%B8%B8(%E4%B8%80)/"/>
<id>http://itdais.com/2016/09/25/AS运行时异常(一)/</id>
<published>2016-09-25T13:01:00.000Z</published>
<updated>2016-09-05T13:35:22.539Z</updated>
<content type="html"><p>从Github上下载了一个demo ,但是Android Studio一直运行不成功,爆出了下面的错误<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">Error:(1, 1) A problem occurred evaluating project &apos;:app&apos;.</div><div class="line"></div><div class="line">&gt; Failed to apply plugin [id &apos;com.android.application&apos;]</div><div class="line"> &gt; Gradle version 2.10 is required. Current version is 2.8. If using the gradle wrapper, try editing the distributionUrl in E:\workspace\GitHub\RxJavaApp-master\gradle\wrapper\gradle-wrapper.properties to gradle-2.10-all.zip</div></pre></td></tr></table></figure></p>
<p>Message提醒为:</p>
<blockquote>
<p>Warning:Gradle version 2.10 is required. Current version is 2.8. If<br>using the gradle wrapper</p>
</blockquote>
<p>解决方法为:<br>File - Project Structure(Ctrl+Alt+Shift+S) - Project - 更改Gradle Version 为2.10<br><img src="http://od19q3xls.bkt.clouddn.com/crash_1.png" alt="enter description here"><br><img src="http://od19q3xls.bkt.clouddn.com/crash_2.png" alt="enter description here"></p>
<blockquote>
<p>附:因为我本地已经有了2.10的Gradle版本,所以如果你没有该版本请下载或者更高其他版本试试</p>
</blockquote>
</content>
<summary type="html">
<p>从Github上下载了一个demo ,但是Android Studio一直运行不成功,爆出了下面的错误<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="lin
</summary>
<category term="Android" scheme="http://itdais.com/tags/Android/"/>
<category term="Gradle" scheme="http://itdais.com/tags/Gradle/"/>
</entry>
<entry>
<title>Android Session失效重连</title>
<link href="http://itdais.com/2016/09/08/Android-Session%E5%A4%B1%E6%95%88%E9%87%8D%E8%BF%9E/"/>
<id>http://itdais.com/2016/09/08/Android-Session失效重连/</id>
<published>2016-09-08T02:26:57.000Z</published>
<updated>2016-09-08T02:26:57.903Z</updated>
<content type="html"></content>
<summary type="html">
</summary>
</entry>
<entry>
<title>Glide Transform</title>
<link href="http://itdais.com/2016/08/28/Glide%20Transform%E5%9C%86%E5%9E%8B%E5%9B%BE%E7%89%87%E5%92%8C%E5%9C%86%E8%A7%92%E5%9B%BE%E7%89%87/"/>
<id>http://itdais.com/2016/08/28/Glide Transform圆型图片和圆角图片/</id>
<published>2016-08-28T13:10:49.000Z</published>
<updated>2016-08-29T13:27:32.787Z</updated>
<content type="html"><p>本文介绍Glide通过Transform转换圆形图片和圆角图片<br><a id="more"></a></p>
<h4 id="1、圆形转换器"><a href="#1、圆形转换器" class="headerlink" title="1、圆形转换器"></a>1、圆形转换器</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">GlideCircleTransform</span> <span class="keyword">extends</span> <span class="title">BitmapTransformation</span> </span>&#123;</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">GlideCircleTransform</span><span class="params">(Context context)</span> </span>&#123;</div><div class="line"> <span class="keyword">super</span>(context);</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">protected</span> Bitmap <span class="title">transform</span><span class="params">(BitmapPool pool, Bitmap toTransform, <span class="keyword">int</span> outWidth, <span class="keyword">int</span> outHeight)</span> </span>&#123;</div><div class="line"> <span class="keyword">return</span> circleCrop(pool, toTransform);</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> Bitmap <span class="title">circleCrop</span><span class="params">(BitmapPool pool, Bitmap source)</span> </span>&#123;</div><div class="line"> <span class="keyword">if</span> (source == <span class="keyword">null</span>) <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line"></div><div class="line"> <span class="keyword">int</span> size = Math.min(source.getWidth(), source.getHeight());</div><div class="line"> <span class="keyword">int</span> x = (source.getWidth() - size) / <span class="number">2</span>;</div><div class="line"> <span class="keyword">int</span> y = (source.getHeight() - size) / <span class="number">2</span>;</div><div class="line"></div><div class="line"> <span class="comment">// TODO this could be acquired from the pool too</span></div><div class="line"> Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);</div><div class="line"></div><div class="line"> Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);</div><div class="line"> <span class="keyword">if</span> (result == <span class="keyword">null</span>) &#123;</div><div class="line"> result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> Canvas canvas = <span class="keyword">new</span> Canvas(result);</div><div class="line"> Paint paint = <span class="keyword">new</span> Paint();</div><div class="line"> paint.setShader(<span class="keyword">new</span> BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));</div><div class="line"> paint.setAntiAlias(<span class="keyword">true</span>);</div><div class="line"> <span class="keyword">float</span> r = size / <span class="number">2f</span>;</div><div class="line"> canvas.drawCircle(r, r, r, paint);</div><div class="line"> <span class="keyword">return</span> result;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">getId</span><span class="params">()</span> </span>&#123;</div><div class="line"> <span class="keyword">return</span> getClass().getName();</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>使用</p>
<blockquote>
<p>Glide.with(context).load(url)<br> .placeholder(R.drawable.def_header)<br> .transform(new GlideCircleTransform(context))<br> .into(view);</p>
</blockquote>
<h4 id="2、圆角转换器"><a href="#2、圆角转换器" class="headerlink" title="2、圆角转换器"></a>2、圆角转换器</h4><p>可以传参设置圆角的角度,不传默认4</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div></pre></td><td class="code"><pre><div class="line">public class GlideRoundTransform extends BitmapTransformation &#123;</div><div class="line"> private static float radius = 0f;</div><div class="line"> public GlideRoundTransform(Context context)</div><div class="line"> &#123;</div><div class="line"> this(context, 4);</div><div class="line"> &#125;</div><div class="line"> public GlideRoundTransform(Context context, int dp)</div><div class="line"> &#123;</div><div class="line"> super(context);</div><div class="line"> this.radius = Resources.getSystem().getDisplayMetrics().density * dp;</div><div class="line"> &#125;</div><div class="line"> @Override</div><div class="line"> protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight)</div><div class="line"> &#123;</div><div class="line"> return roundCrop(pool, toTransform);</div><div class="line"> &#125;</div><div class="line"> private static Bitmap roundCrop(BitmapPool pool, Bitmap source)</div><div class="line"> &#123;</div><div class="line"> if (source == null) return null;</div><div class="line"> Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);</div><div class="line"> if (result == null) &#123;</div><div class="line"> result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);</div><div class="line"> &#125;</div><div class="line"> Canvas canvas = new Canvas(result);</div><div class="line"> Paint paint = new Paint();</div><div class="line"> paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));</div><div class="line"> paint.setAntiAlias(true);</div><div class="line"> RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());</div><div class="line"> canvas.drawRoundRect(rectF, radius, radius, paint);</div><div class="line"> return result;</div><div class="line"> &#125;</div><div class="line"> @Override</div><div class="line"> public String getId()</div><div class="line"> &#123;</div><div class="line"> return getClass().getName() + Math.round(radius);</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>使用</p>
<blockquote>
<p>Glide.with(context).load(url)<br> .placeholder(R.drawable.transparent)<br> .transform(new GlideRoundTransform(context))<br> .into(view);</p>
</blockquote>
</content>
<summary type="html">
<p>本文介绍Glide通过Transform转换圆形图片和圆角图片<br>
</summary>
<category term="Android" scheme="http://itdais.com/tags/Android/"/>
<category term="图片加载" scheme="http://itdais.com/tags/%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD/"/>
<category term="Glide" scheme="http://itdais.com/tags/Glide/"/>
</entry>
<entry>
<title>自定义圆型控件</title>
<link href="http://itdais.com/2016/08/28/%E8%87%AA%E5%AE%9A%E4%B9%89%E5%9C%86%E5%9E%8B%E6%8E%A7%E4%BB%B6/"/>
<id>http://itdais.com/2016/08/28/自定义圆型控件/</id>
<published>2016-08-28T13:10:13.000Z</published>
<updated>2016-08-29T13:23:28.640Z</updated>
<content type="html"><p>自定义圆形控件,CircleImageView和RoundImageView,<br>其中使用CircleImageView,可以被Glide使用<br>使用RoundImageView,不可以被Glide使用,可以设置双边框<br><a id="more"></a></p>
<h4 id="1、CircleImageView"><a href="#1、CircleImageView" class="headerlink" title="1、CircleImageView"></a>1、CircleImageView</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div><div class="line">126</div><div class="line">127</div><div class="line">128</div><div class="line">129</div><div class="line">130</div><div class="line">131</div><div class="line">132</div><div class="line">133</div><div class="line">134</div><div class="line">135</div><div class="line">136</div><div class="line">137</div><div class="line">138</div><div class="line">139</div><div class="line">140</div><div class="line">141</div><div class="line">142</div><div class="line">143</div><div class="line">144</div><div class="line">145</div><div class="line">146</div><div class="line">147</div><div class="line">148</div><div class="line">149</div><div class="line">150</div><div class="line">151</div><div class="line">152</div><div class="line">153</div><div class="line">154</div><div class="line">155</div><div class="line">156</div><div class="line">157</div><div class="line">158</div><div class="line">159</div><div class="line">160</div><div class="line">161</div><div class="line">162</div><div class="line">163</div><div class="line">164</div><div class="line">165</div><div class="line">166</div><div class="line">167</div><div class="line">168</div><div class="line">169</div><div class="line">170</div><div class="line">171</div><div class="line">172</div><div class="line">173</div><div class="line">174</div><div class="line">175</div><div class="line">176</div><div class="line">177</div><div class="line">178</div><div class="line">179</div><div class="line">180</div><div class="line">181</div><div class="line">182</div><div class="line">183</div><div class="line">184</div><div class="line">185</div><div class="line">186</div><div class="line">187</div><div class="line">188</div><div class="line">189</div><div class="line">190</div><div class="line">191</div><div class="line">192</div><div class="line">193</div><div class="line">194</div><div class="line">195</div><div class="line">196</div><div class="line">197</div><div class="line">198</div><div class="line">199</div><div class="line">200</div><div class="line">201</div><div class="line">202</div><div class="line">203</div><div class="line">204</div><div class="line">205</div><div class="line">206</div><div class="line">207</div><div class="line">208</div><div class="line">209</div><div class="line">210</div><div class="line">211</div><div class="line">212</div><div class="line">213</div><div class="line">214</div><div class="line">215</div><div class="line">216</div><div class="line">217</div><div class="line">218</div><div class="line">219</div><div class="line">220</div><div class="line">221</div><div class="line">222</div><div class="line">223</div><div class="line">224</div><div class="line">225</div><div class="line">226</div><div class="line">227</div><div class="line">228</div><div class="line">229</div><div class="line">230</div><div class="line">231</div><div class="line">232</div><div class="line">233</div><div class="line">234</div><div class="line">235</div><div class="line">236</div><div class="line">237</div><div class="line">238</div><div class="line">239</div><div class="line">240</div><div class="line">241</div><div class="line">242</div><div class="line">243</div><div class="line">244</div><div class="line">245</div><div class="line">246</div><div class="line">247</div><div class="line">248</div><div class="line">249</div><div class="line">250</div><div class="line">251</div><div class="line">252</div><div class="line">253</div><div class="line">254</div><div class="line">255</div><div class="line">256</div><div class="line">257</div><div class="line">258</div><div class="line">259</div><div class="line">260</div><div class="line">261</div><div class="line">262</div><div class="line">263</div><div class="line">264</div><div class="line">265</div><div class="line">266</div><div class="line">267</div><div class="line">268</div><div class="line">269</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">CircleImageView</span> <span class="keyword">extends</span> <span class="title">ImageView</span> </span>&#123;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">int</span> COLORDRAWABLE_DIMENSION = <span class="number">2</span>;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">int</span> DEFAULT_BORDER_WIDTH = <span class="number">0</span>;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">int</span> DEFAULT_BORDER_COLOR = Color.BLACK;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">int</span> DEFAULT_FILL_COLOR = Color.TRANSPARENT;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">boolean</span> DEFAULT_BORDER_OVERLAY = <span class="keyword">false</span>;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">final</span> RectF mDrawableRect = <span class="keyword">new</span> RectF();</div><div class="line"> <span class="keyword">private</span> <span class="keyword">final</span> RectF mBorderRect = <span class="keyword">new</span> RectF();</div><div class="line"> <span class="keyword">private</span> <span class="keyword">final</span> Matrix mShaderMatrix = <span class="keyword">new</span> Matrix();</div><div class="line"> <span class="keyword">private</span> <span class="keyword">final</span> Paint mBitmapPaint = <span class="keyword">new</span> Paint();</div><div class="line"> <span class="keyword">private</span> <span class="keyword">final</span> Paint mBorderPaint = <span class="keyword">new</span> Paint();</div><div class="line"> <span class="keyword">private</span> <span class="keyword">final</span> Paint mFillPaint = <span class="keyword">new</span> Paint();</div><div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> mBorderColor = DEFAULT_BORDER_COLOR;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> mBorderWidth = DEFAULT_BORDER_WIDTH;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> mFillColor = DEFAULT_FILL_COLOR;</div><div class="line"> <span class="keyword">private</span> Bitmap mBitmap;</div><div class="line"> <span class="keyword">private</span> BitmapShader mBitmapShader;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> mBitmapWidth;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> mBitmapHeight;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">float</span> mDrawableRadius;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">float</span> mBorderRadius;</div><div class="line"> <span class="keyword">private</span> ColorFilter mColorFilter;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">boolean</span> mReady;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">boolean</span> mSetupPending;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">boolean</span> mBorderOverlay;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">CircleImageView</span><span class="params">(Context context)</span> </span>&#123;</div><div class="line"> <span class="keyword">super</span>(context);</div><div class="line"> init();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">CircleImageView</span><span class="params">(Context context, AttributeSet attrs)</span> </span>&#123;</div><div class="line"> <span class="keyword">this</span>(context, attrs, <span class="number">0</span>);</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">CircleImageView</span><span class="params">(Context context, AttributeSet attrs, <span class="keyword">int</span> defStyle)</span> </span>&#123;</div><div class="line"> <span class="keyword">super</span>(context, attrs, defStyle);</div><div class="line"> TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, <span class="number">0</span>);</div><div class="line"> mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_civ_border_width, DEFAULT_BORDER_WIDTH);</div><div class="line"> mBorderColor = a.getColor(R.styleable.CircleImageView_civ_border_color, DEFAULT_BORDER_COLOR);</div><div class="line"> mBorderOverlay = a.getBoolean(R.styleable.CircleImageView_civ_border_overlay, DEFAULT_BORDER_OVERLAY);</div><div class="line"> mFillColor = a.getColor(R.styleable.CircleImageView_civ_fill_color, DEFAULT_FILL_COLOR);</div><div class="line"> a.recycle();</div><div class="line"> init();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">init</span><span class="params">()</span> </span>&#123;</div><div class="line"> <span class="keyword">super</span>.setScaleType(SCALE_TYPE);</div><div class="line"> mReady = <span class="keyword">true</span>;</div><div class="line"></div><div class="line"> <span class="keyword">if</span> (mSetupPending) &#123;</div><div class="line"> setup();</div><div class="line"> mSetupPending = <span class="keyword">false</span>;</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> ScaleType <span class="title">getScaleType</span><span class="params">()</span> </span>&#123;</div><div class="line"> <span class="keyword">return</span> SCALE_TYPE;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setScaleType</span><span class="params">(ScaleType scaleType)</span> </span>&#123;</div><div class="line"> <span class="keyword">if</span> (scaleType != SCALE_TYPE) &#123;</div><div class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(String.format(<span class="string">"ScaleType %s not supported."</span>, scaleType));</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setAdjustViewBounds</span><span class="params">(<span class="keyword">boolean</span> adjustViewBounds)</span> </span>&#123;</div><div class="line"> <span class="keyword">if</span> (adjustViewBounds) &#123;</div><div class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(<span class="string">"adjustViewBounds not supported."</span>);</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">onDraw</span><span class="params">(Canvas canvas)</span> </span>&#123;</div><div class="line"> <span class="keyword">if</span> (mBitmap == <span class="keyword">null</span>) &#123;</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">if</span> (mFillColor != Color.TRANSPARENT) &#123;</div><div class="line"> canvas.drawCircle(getWidth() / <span class="number">2.0f</span>, getHeight() / <span class="number">2.0f</span>, mDrawableRadius, mFillPaint);</div><div class="line"> &#125;</div><div class="line"> canvas.drawCircle(getWidth() / <span class="number">2.0f</span>, getHeight() / <span class="number">2.0f</span>, mDrawableRadius, mBitmapPaint);</div><div class="line"> <span class="keyword">if</span> (mBorderWidth != <span class="number">0</span>) &#123;</div><div class="line"> canvas.drawCircle(getWidth() / <span class="number">2.0f</span>, getHeight() / <span class="number">2.0f</span>, mBorderRadius, mBorderPaint);</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">onSizeChanged</span><span class="params">(<span class="keyword">int</span> w, <span class="keyword">int</span> h, <span class="keyword">int</span> oldw, <span class="keyword">int</span> oldh)</span> </span>&#123;</div><div class="line"> <span class="keyword">super</span>.onSizeChanged(w, h, oldw, oldh);</div><div class="line"> setup();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getBorderColor</span><span class="params">()</span> </span>&#123;</div><div class="line"> <span class="keyword">return</span> mBorderColor;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setBorderColor</span><span class="params">(<span class="keyword">int</span> borderColor)</span> </span>&#123;</div><div class="line"> <span class="keyword">if</span> (borderColor == mBorderColor) &#123;</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> &#125;</div><div class="line"> mBorderColor = borderColor;</div><div class="line"> mBorderPaint.setColor(mBorderColor);</div><div class="line"> invalidate();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setBorderColorResource</span><span class="params">(<span class="keyword">int</span> borderColorRes)</span> </span>&#123;</div><div class="line"> setBorderColor(getContext().getResources().getColor(borderColorRes));</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getFillColor</span><span class="params">()</span> </span>&#123;</div><div class="line"> <span class="keyword">return</span> mFillColor;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setFillColor</span><span class="params">(<span class="keyword">int</span> fillColor)</span> </span>&#123;</div><div class="line"> <span class="keyword">if</span> (fillColor == mFillColor) &#123;</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> &#125;</div><div class="line"> mFillColor = fillColor;</div><div class="line"> mFillPaint.setColor(fillColor);</div><div class="line"> invalidate();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setFillColorResource</span><span class="params">(<span class="keyword">int</span> fillColorRes)</span> </span>&#123;</div><div class="line"> setFillColor(getContext().getResources().getColor(fillColorRes));</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getBorderWidth</span><span class="params">()</span> </span>&#123;</div><div class="line"> <span class="keyword">return</span> mBorderWidth;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setBorderWidth</span><span class="params">(<span class="keyword">int</span> borderWidth)</span> </span>&#123;</div><div class="line"> <span class="keyword">if</span> (borderWidth == mBorderWidth) &#123;</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> &#125;</div><div class="line"> mBorderWidth = borderWidth;</div><div class="line"> setup();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isBorderOverlay</span><span class="params">()</span> </span>&#123;</div><div class="line"> <span class="keyword">return</span> mBorderOverlay;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setBorderOverlay</span><span class="params">(<span class="keyword">boolean</span> borderOverlay)</span> </span>&#123;</div><div class="line"> <span class="keyword">if</span> (borderOverlay == mBorderOverlay) &#123;</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> &#125;</div><div class="line"> mBorderOverlay = borderOverlay;</div><div class="line"> setup();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setImageBitmap</span><span class="params">(Bitmap bm)</span> </span>&#123;</div><div class="line"> <span class="keyword">super</span>.setImageBitmap(bm);</div><div class="line"> mBitmap = bm;</div><div class="line"> setup();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setImageDrawable</span><span class="params">(Drawable drawable)</span> </span>&#123;</div><div class="line"> <span class="keyword">super</span>.setImageDrawable(drawable);</div><div class="line"> mBitmap = getBitmapFromDrawable(drawable);</div><div class="line"> setup();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setImageResource</span><span class="params">(<span class="keyword">int</span> resId)</span> </span>&#123;</div><div class="line"> <span class="keyword">super</span>.setImageResource(resId);</div><div class="line"> mBitmap = getBitmapFromDrawable(getDrawable());</div><div class="line"> setup();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setImageURI</span><span class="params">(Uri uri)</span> </span>&#123;</div><div class="line"> <span class="keyword">super</span>.setImageURI(uri);</div><div class="line"> mBitmap = uri != <span class="keyword">null</span> ? getBitmapFromDrawable(getDrawable()) : <span class="keyword">null</span>;</div><div class="line"> setup();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setColorFilter</span><span class="params">(ColorFilter cf)</span> </span>&#123;</div><div class="line"> <span class="keyword">if</span> (cf == mColorFilter) &#123;</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> &#125;</div><div class="line"> mColorFilter = cf;</div><div class="line"> mBitmapPaint.setColorFilter(mColorFilter);</div><div class="line"> invalidate();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">private</span> Bitmap <span class="title">getBitmapFromDrawable</span><span class="params">(Drawable drawable)</span> </span>&#123;</div><div class="line"> <span class="keyword">if</span> (drawable == <span class="keyword">null</span>) &#123;</div><div class="line"> <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">if</span> (drawable <span class="keyword">instanceof</span> BitmapDrawable) &#123;</div><div class="line"> <span class="keyword">return</span> ((BitmapDrawable) drawable).getBitmap();</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">try</span> &#123;</div><div class="line"> Bitmap bitmap;</div><div class="line"> <span class="keyword">if</span> (drawable <span class="keyword">instanceof</span> ColorDrawable) &#123;</div><div class="line"> bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);</div><div class="line"> &#125; <span class="keyword">else</span> &#123;</div><div class="line"> bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);</div><div class="line"> &#125;</div><div class="line"> Canvas canvas = <span class="keyword">new</span> Canvas(bitmap);</div><div class="line"> drawable.setBounds(<span class="number">0</span>, <span class="number">0</span>, canvas.getWidth(), canvas.getHeight());</div><div class="line"> drawable.draw(canvas);</div><div class="line"> <span class="keyword">return</span> bitmap;</div><div class="line"> &#125; <span class="keyword">catch</span> (Exception e) &#123;</div><div class="line"> e.printStackTrace();</div><div class="line"> <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</div><div class="line"> <span class="keyword">if</span> (!mReady) &#123;</div><div class="line"> mSetupPending = <span class="keyword">true</span>;</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">if</span> (getWidth() == <span class="number">0</span> &amp;&amp; getHeight() == <span class="number">0</span>) &#123;</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">if</span> (mBitmap == <span class="keyword">null</span>) &#123;</div><div class="line"> invalidate();</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> &#125;</div><div class="line"> mBitmapShader = <span class="keyword">new</span> BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);</div><div class="line"> mBitmapPaint.setAntiAlias(<span class="keyword">true</span>);</div><div class="line"> mBitmapPaint.setShader(mBitmapShader);</div><div class="line"> mBorderPaint.setStyle(Paint.Style.STROKE);</div><div class="line"> mBorderPaint.setAntiAlias(<span class="keyword">true</span>);</div><div class="line"> mBorderPaint.setColor(mBorderColor);</div><div class="line"> mBorderPaint.setStrokeWidth(mBorderWidth);</div><div class="line"> mFillPaint.setStyle(Paint.Style.FILL);</div><div class="line"> mFillPaint.setAntiAlias(<span class="keyword">true</span>);</div><div class="line"> mFillPaint.setColor(mFillColor);</div><div class="line"> mBitmapHeight = mBitmap.getHeight();</div><div class="line"> mBitmapWidth = mBitmap.getWidth();</div><div class="line"> mBorderRect.set(<span class="number">0</span>, <span class="number">0</span>, getWidth(), getHeight());</div><div class="line"> mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / <span class="number">2.0f</span>, (mBorderRect.width() - mBorderWidth) / <span class="number">2.0f</span>);</div><div class="line"> mDrawableRect.set(mBorderRect);</div><div class="line"> <span class="keyword">if</span> (!mBorderOverlay) &#123;</div><div class="line"> mDrawableRect.inset(mBorderWidth, mBorderWidth);</div><div class="line"> &#125;</div><div class="line"> mDrawableRadius = Math.min(mDrawableRect.height() / <span class="number">2.0f</span>, mDrawableRect.width() / <span class="number">2.0f</span>);</div><div class="line"> updateShaderMatrix();</div><div class="line"> invalidate();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">updateShaderMatrix</span><span class="params">()</span> </span>&#123;</div><div class="line"> <span class="keyword">float</span> scale;</div><div class="line"> <span class="keyword">float</span> dx = <span class="number">0</span>;</div><div class="line"> <span class="keyword">float</span> dy = <span class="number">0</span>;</div><div class="line"> mShaderMatrix.set(<span class="keyword">null</span>);</div><div class="line"> <span class="keyword">if</span> (mBitmapWidth * mDrawableRect.height() &gt; mDrawableRect.width() * mBitmapHeight) &#123;</div><div class="line"> scale = mDrawableRect.height() / (<span class="keyword">float</span>) mBitmapHeight;</div><div class="line"> dx = (mDrawableRect.width() - mBitmapWidth * scale) * <span class="number">0.5f</span>;</div><div class="line"> &#125; <span class="keyword">else</span> &#123;</div><div class="line"> scale = mDrawableRect.width() / (<span class="keyword">float</span>) mBitmapWidth;</div><div class="line"> dy = (mDrawableRect.height() - mBitmapHeight * scale) * <span class="number">0.5f</span>;</div><div class="line"> &#125;</div><div class="line"> mShaderMatrix.setScale(scale, scale);</div><div class="line"> mShaderMatrix.postTranslate((<span class="keyword">int</span>) (dx + <span class="number">0.5f</span>) + mDrawableRect.left, (<span class="keyword">int</span>) (dy + <span class="number">0.5f</span>) + mDrawableRect.top);</div><div class="line"> mBitmapShader.setLocalMatrix(mShaderMatrix);</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>attrs<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="tag">&lt;<span class="name">declare-styleable</span> <span class="attr">name</span>=<span class="string">"CircleImageView"</span>&gt;</span></div><div class="line"> <span class="tag">&lt;<span class="name">attr</span> <span class="attr">name</span>=<span class="string">"civ_border_width"</span> <span class="attr">format</span>=<span class="string">"dimension"</span> /&gt;</span></div><div class="line"> <span class="tag">&lt;<span class="name">attr</span> <span class="attr">name</span>=<span class="string">"civ_border_color"</span> <span class="attr">format</span>=<span class="string">"color"</span> /&gt;</span></div><div class="line"> <span class="tag">&lt;<span class="name">attr</span> <span class="attr">name</span>=<span class="string">"civ_border_overlay"</span> <span class="attr">format</span>=<span class="string">"boolean"</span> /&gt;</span></div><div class="line"> <span class="tag">&lt;<span class="name">attr</span> <span class="attr">name</span>=<span class="string">"civ_fill_color"</span> <span class="attr">format</span>=<span class="string">"color"</span> /&gt;</span></div><div class="line"><span class="tag">&lt;/<span class="name">declare-styleable</span>&gt;</span></div></pre></td></tr></table></figure></p>
<h4 id="2、RoundImageView"><a href="#2、RoundImageView" class="headerlink" title="2、RoundImageView"></a>2、RoundImageView</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div><div class="line">126</div><div class="line">127</div><div class="line">128</div><div class="line">129</div><div class="line">130</div><div class="line">131</div><div class="line">132</div><div class="line">133</div><div class="line">134</div><div class="line">135</div><div class="line">136</div><div class="line">137</div><div class="line">138</div><div class="line">139</div><div class="line">140</div><div class="line">141</div><div class="line">142</div><div class="line">143</div><div class="line">144</div><div class="line">145</div><div class="line">146</div><div class="line">147</div><div class="line">148</div><div class="line">149</div><div class="line">150</div><div class="line">151</div><div class="line">152</div><div class="line">153</div><div class="line">154</div><div class="line">155</div><div class="line">156</div><div class="line">157</div><div class="line">158</div><div class="line">159</div><div class="line">160</div><div class="line">161</div><div class="line">162</div></pre></td><td class="code"><pre><div class="line"><span class="comment">/**</span></div><div class="line"> * 圆形ImageView,可设置最多两个宽度不同且颜色不同的圆形边框。 设置颜色在xml布局文件中由自定义属性配置参数指定</div><div class="line"> */</div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">RoundImageView</span> <span class="keyword">extends</span> <span class="title">ImageView</span> </span>&#123;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> mBorderThickness = <span class="number">0</span>;</div><div class="line"> <span class="keyword">private</span> Context mContext;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> defaultColor = <span class="number">0xFFFFFFFF</span>;</div><div class="line"> <span class="comment">// 如果只有其中一个有值,则只画一个圆形边框</span></div><div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> mBorderOutsideColor = <span class="number">0</span>;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> mBorderInsideColor = <span class="number">0</span>;</div><div class="line"> <span class="comment">// 控件默认长、宽</span></div><div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> defaultWidth = <span class="number">0</span>;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> defaultHeight = <span class="number">0</span>;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">RoundImageView</span><span class="params">(Context context)</span></span></div><div class="line"> &#123;</div><div class="line"> <span class="keyword">super</span>(context);</div><div class="line"> mContext = context;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">RoundImageView</span><span class="params">(Context context, AttributeSet attrs)</span></span></div><div class="line"> &#123;</div><div class="line"> <span class="keyword">super</span>(context, attrs);</div><div class="line"> mContext = context;</div><div class="line"> setCustomAttributes(attrs);</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">RoundImageView</span><span class="params">(Context context, AttributeSet attrs, <span class="keyword">int</span> defStyle)</span></span></div><div class="line"> &#123;</div><div class="line"> <span class="keyword">super</span>(context, attrs, defStyle);</div><div class="line"> mContext = context;</div><div class="line"> setCustomAttributes(attrs);</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">setCustomAttributes</span><span class="params">(AttributeSet attrs)</span></span></div><div class="line"> &#123;</div><div class="line"> TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.roundedimageview);</div><div class="line"> mBorderThickness = a.getDimensionPixelSize(R.styleable.roundedimageview_border_thickness, <span class="number">0</span>);</div><div class="line"> mBorderOutsideColor = a.getColor(R.styleable.roundedimageview_border_outside_color, defaultColor);</div><div class="line"> mBorderInsideColor = a.getColor(R.styleable.roundedimageview_border_inside_color, defaultColor);</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">onDraw</span><span class="params">(Canvas canvas)</span></span></div><div class="line"> &#123;</div><div class="line"> Drawable drawable = getDrawable();</div><div class="line"> <span class="keyword">if</span> (drawable == <span class="keyword">null</span>) &#123;</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">if</span> (getWidth() == <span class="number">0</span> || getHeight() == <span class="number">0</span>) &#123;</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">this</span>.measure(<span class="number">0</span>, <span class="number">0</span>);</div><div class="line"> <span class="keyword">if</span> (drawable.getClass() == NinePatchDrawable.class)</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> Bitmap b = ((BitmapDrawable) drawable).getBitmap();</div><div class="line"> Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, <span class="keyword">true</span>);</div><div class="line"> <span class="keyword">if</span> (defaultWidth == <span class="number">0</span>) &#123;</div><div class="line"> defaultWidth = getWidth();</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">if</span> (defaultHeight == <span class="number">0</span>) &#123;</div><div class="line"> defaultHeight = getHeight();</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">int</span> radius = <span class="number">0</span>;</div><div class="line"> <span class="keyword">if</span> (mBorderInsideColor != defaultColor &amp;&amp; mBorderOutsideColor != defaultColor) &#123;<span class="comment">// 定义画两个边框,分别为外圆边框和内圆边框</span></div><div class="line"> radius = (defaultWidth &lt; defaultHeight ? defaultWidth : defaultHeight) / <span class="number">2</span> - <span class="number">2</span> * mBorderThickness;</div><div class="line"> <span class="comment">// 画内圆</span></div><div class="line"> drawCircleBorder(canvas, radius + mBorderThickness / <span class="number">2</span>, mBorderInsideColor);</div><div class="line"> <span class="comment">// 画外圆</span></div><div class="line"> drawCircleBorder(canvas, radius + mBorderThickness + mBorderThickness / <span class="number">2</span>, mBorderOutsideColor);</div><div class="line"> &#125; <span class="keyword">else</span> <span class="keyword">if</span> (mBorderInsideColor != defaultColor &amp;&amp; mBorderOutsideColor == defaultColor) &#123;<span class="comment">// 定义画一个边框</span></div><div class="line"> radius = (defaultWidth &lt; defaultHeight ? defaultWidth : defaultHeight) / <span class="number">2</span> - mBorderThickness;</div><div class="line"> drawCircleBorder(canvas, radius + mBorderThickness / <span class="number">2</span>, mBorderInsideColor);</div><div class="line"> &#125; <span class="keyword">else</span> <span class="keyword">if</span> (mBorderInsideColor == defaultColor &amp;&amp; mBorderOutsideColor != defaultColor) &#123;<span class="comment">// 定义画一个边框</span></div><div class="line"> radius = (defaultWidth &lt; defaultHeight ? defaultWidth : defaultHeight) / <span class="number">2</span> - mBorderThickness;</div><div class="line"> drawCircleBorder(canvas, radius + mBorderThickness / <span class="number">2</span>, mBorderOutsideColor);</div><div class="line"> &#125; <span class="keyword">else</span> &#123;<span class="comment">// 没有边框</span></div><div class="line"> radius = (defaultWidth &lt; defaultHeight ? defaultWidth : defaultHeight) / <span class="number">2</span>;</div><div class="line"> &#125;</div><div class="line"> Bitmap roundBitmap = getCroppedRoundBitmap(bitmap, radius);</div><div class="line"> canvas.drawBitmap(roundBitmap, defaultWidth / <span class="number">2</span> - radius, defaultHeight / <span class="number">2</span> - radius, <span class="keyword">null</span>);</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 获取裁剪后的圆形图片</div><div class="line"> *</div><div class="line"> * <span class="doctag">@param</span> radius 半径</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> Bitmap <span class="title">getCroppedRoundBitmap</span><span class="params">(Bitmap bmp, <span class="keyword">int</span> radius)</span></span></div><div class="line"> &#123;</div><div class="line"> Bitmap scaledSrcBmp;</div><div class="line"> <span class="keyword">int</span> diameter = radius * <span class="number">2</span>;</div><div class="line"> <span class="comment">// 为了防止宽高不相等,造成圆形图片变形,因此截取长方形中处于中间位置最大的正方形图片</span></div><div class="line"> <span class="keyword">int</span> bmpWidth = bmp.getWidth();</div><div class="line"> <span class="keyword">int</span> bmpHeight = bmp.getHeight();</div><div class="line"> <span class="keyword">int</span> squareWidth = <span class="number">0</span>, squareHeight = <span class="number">0</span>;</div><div class="line"> <span class="keyword">int</span> x = <span class="number">0</span>, y = <span class="number">0</span>;</div><div class="line"> Bitmap squareBitmap;</div><div class="line"> <span class="keyword">if</span> (bmpHeight &gt; bmpWidth) &#123;<span class="comment">// 高大于宽</span></div><div class="line"> squareWidth = squareHeight = bmpWidth;</div><div class="line"> x = <span class="number">0</span>;</div><div class="line"> y = (bmpHeight - bmpWidth) / <span class="number">2</span>;</div><div class="line"> <span class="comment">// 截取正方形图片</span></div><div class="line"> squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,</div><div class="line"> squareHeight);</div><div class="line"> &#125; <span class="keyword">else</span> <span class="keyword">if</span> (bmpHeight &lt; bmpWidth) &#123;<span class="comment">// 宽大于高</span></div><div class="line"> squareWidth = squareHeight = bmpHeight;</div><div class="line"> x = (bmpWidth - bmpHeight) / <span class="number">2</span>;</div><div class="line"> y = <span class="number">0</span>;</div><div class="line"> squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,</div><div class="line"> squareHeight);</div><div class="line"> &#125; <span class="keyword">else</span> &#123;</div><div class="line"> squareBitmap = bmp;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">if</span> (squareBitmap.getWidth() != diameter</div><div class="line"> || squareBitmap.getHeight() != diameter) &#123;</div><div class="line"> scaledSrcBmp = Bitmap.createScaledBitmap(squareBitmap, diameter,</div><div class="line"> diameter, <span class="keyword">true</span>);</div><div class="line"> &#125; <span class="keyword">else</span> &#123;</div><div class="line"> scaledSrcBmp = squareBitmap;</div><div class="line"> &#125;</div><div class="line"> Bitmap output = Bitmap.createBitmap(scaledSrcBmp.getWidth(),</div><div class="line"> scaledSrcBmp.getHeight(), Config.ARGB_8888);</div><div class="line"> Canvas canvas = <span class="keyword">new</span> Canvas(output);</div><div class="line"></div><div class="line"> Paint paint = <span class="keyword">new</span> Paint();</div><div class="line"> Rect rect = <span class="keyword">new</span> Rect(<span class="number">0</span>, <span class="number">0</span>, scaledSrcBmp.getWidth(),</div><div class="line"> scaledSrcBmp.getHeight());</div><div class="line"></div><div class="line"> paint.setAntiAlias(<span class="keyword">true</span>);</div><div class="line"> paint.setFilterBitmap(<span class="keyword">true</span>);</div><div class="line"> paint.setDither(<span class="keyword">true</span>);</div><div class="line"> canvas.drawARGB(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</div><div class="line"> canvas.drawCircle(scaledSrcBmp.getWidth() / <span class="number">2</span>,</div><div class="line"> scaledSrcBmp.getHeight() / <span class="number">2</span>, scaledSrcBmp.getWidth() / <span class="number">2</span>,</div><div class="line"> paint);</div><div class="line"> paint.setXfermode(<span class="keyword">new</span> PorterDuffXfermode(Mode.SRC_IN));</div><div class="line"> canvas.drawBitmap(scaledSrcBmp, rect, rect, paint);</div><div class="line"> bmp = <span class="keyword">null</span>;</div><div class="line"> squareBitmap = <span class="keyword">null</span>;</div><div class="line"> scaledSrcBmp = <span class="keyword">null</span>;</div><div class="line"> <span class="keyword">return</span> output;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 边缘画圆</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">drawCircleBorder</span><span class="params">(Canvas canvas, <span class="keyword">int</span> radius, <span class="keyword">int</span> color)</span></span></div><div class="line"> &#123;</div><div class="line"> Paint paint = <span class="keyword">new</span> Paint();</div><div class="line"> <span class="comment">/* 去锯齿 */</span></div><div class="line"> paint.setAntiAlias(<span class="keyword">true</span>);</div><div class="line"> paint.setFilterBitmap(<span class="keyword">true</span>);</div><div class="line"> paint.setDither(<span class="keyword">true</span>);</div><div class="line"> paint.setColor(color);</div><div class="line"> <span class="comment">/* 设置paint的 style 为STROKE:空心 */</span></div><div class="line"> paint.setStyle(Paint.Style.STROKE);</div><div class="line"> <span class="comment">/* 设置paint的外框宽度 */</span></div><div class="line"> paint.setStrokeWidth(mBorderThickness);</div><div class="line"> canvas.drawCircle(defaultWidth / <span class="number">2</span>, defaultHeight / <span class="number">2</span>, radius, paint);</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>attrs<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="tag">&lt;<span class="name">declare-styleable</span> <span class="attr">name</span>=<span class="string">"roundedimageview"</span>&gt;</span></div><div class="line"> <span class="tag">&lt;<span class="name">attr</span> <span class="attr">name</span>=<span class="string">"border_thickness"</span> <span class="attr">format</span>=<span class="string">"dimension"</span> /&gt;</span></div><div class="line"> <span class="tag">&lt;<span class="name">attr</span> <span class="attr">name</span>=<span class="string">"border_inside_color"</span> <span class="attr">format</span>=<span class="string">"color"</span> /&gt;</span></div><div class="line"> <span class="tag">&lt;<span class="name">attr</span> <span class="attr">name</span>=<span class="string">"border_outside_color"</span> <span class="attr">format</span>=<span class="string">"color"</span>&gt;</span><span class="tag">&lt;/<span class="name">attr</span>&gt;</span></div><div class="line"><span class="tag">&lt;/<span class="name">declare-styleable</span>&gt;</span></div></pre></td></tr></table></figure></p>
<blockquote>
<p>如果用Glide推荐用transForm转换</p>
</blockquote>
</content>
<summary type="html">
<p>自定义圆形控件,CircleImageView和RoundImageView,<br>其中使用CircleImageView,可以被Glide使用<br>使用RoundImageView,不可以被Glide使用,可以设置双边框<br>
</summary>
<category term="Android" scheme="http://itdais.com/tags/Android/"/>
<category term="图片加载" scheme="http://itdais.com/tags/%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD/"/>
<category term="自定义控件" scheme="http://itdais.com/tags/%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A7%E4%BB%B6/"/>
</entry>
<entry>
<title>AppCrash崩溃监听</title>
<link href="http://itdais.com/2016/08/28/Crash%E5%B4%A9%E6%BA%83%E7%9B%91%E5%90%AC/"/>
<id>http://itdais.com/2016/08/28/Crash崩溃监听/</id>
<published>2016-08-28T13:06:29.000Z</published>
<updated>2016-08-28T13:06:29.636Z</updated>
<content type="html"></content>
<summary type="html">
</summary>
</entry>
<entry>
<title>ScrollView嵌套ListView,GridView,ExpandableListView</title>
<link href="http://itdais.com/2016/08/26/ScrollView%E5%B5%8C%E5%A5%97ListView-GridView-ExpandableListView/"/>
<id>http://itdais.com/2016/08/26/ScrollView嵌套ListView-GridView-ExpandableListView/</id>
<published>2016-08-26T12:14:15.000Z</published>
<updated>2016-08-26T12:14:15.392Z</updated>
<content type="html"></content>
<summary type="html">
</summary>
</entry>
<entry>
<title>SwipeToRefresh滑动冲突解决</title>
<link href="http://itdais.com/2016/08/25/SwipeToRefresh%E6%BB%91%E5%8A%A8%E5%86%B2%E7%AA%81%E8%A7%A3%E5%86%B3/"/>
<id>http://itdais.com/2016/08/25/SwipeToRefresh滑动冲突解决/</id>
<published>2016-08-25T13:59:14.000Z</published>
<updated>2016-08-25T14:03:50.159Z</updated>
<content type="html"><p>解决SwipeToRefresh嵌套ViewPager等左右滑动和下拉刷新冲突的方案</p>
<a id="more"></a>
<p>自定义SwipeToRefresh<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">import</span> android.content.Context;</div><div class="line"><span class="keyword">import</span> android.support.v4.widget.SwipeRefreshLayout;</div><div class="line"><span class="keyword">import</span> android.util.AttributeSet;</div><div class="line"><span class="keyword">import</span> android.view.MotionEvent;</div><div class="line"><span class="keyword">import</span> android.view.ViewConfiguration;</div><div class="line"></div><div class="line"><span class="comment">/**</span></div><div class="line"> * 解决SwipeToRefresh嵌套ViewPager等左右滑动和下拉刷新冲突的方案</div><div class="line"> */</div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">HorizontalSwipeToRefresh</span> <span class="keyword">extends</span> <span class="title">SwipeRefreshLayout</span> </span>&#123;</div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> mTouchSlop;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">float</span> mPrevX;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">HorizontalSwipeToRefresh</span><span class="params">(Context context, AttributeSet attrs)</span> </span>&#123;</div><div class="line"> <span class="keyword">super</span>(context, attrs);</div><div class="line"></div><div class="line"> mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onInterceptTouchEvent</span><span class="params">(MotionEvent event)</span> </span>&#123;</div><div class="line"></div><div class="line"> <span class="keyword">switch</span> (event.getAction()) &#123;</div><div class="line"> <span class="keyword">case</span> MotionEvent.ACTION_DOWN:</div><div class="line"> mPrevX = MotionEvent.obtain(event).getX();</div><div class="line"> <span class="keyword">break</span>;</div><div class="line"></div><div class="line"> <span class="keyword">case</span> MotionEvent.ACTION_MOVE:</div><div class="line"> <span class="keyword">final</span> <span class="keyword">float</span> eventX = event.getX();</div><div class="line"> <span class="keyword">float</span> xDiff = Math.abs(eventX - mPrevX);</div><div class="line"></div><div class="line"> <span class="keyword">if</span> (xDiff &gt; mTouchSlop) &#123;</div><div class="line"> <span class="keyword">return</span> <span class="keyword">false</span>;</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="keyword">return</span> <span class="keyword">super</span>.onInterceptTouchEvent(event);</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
</content>
<summary type="html">
<p>解决SwipeToRefresh嵌套ViewPager等左右滑动和下拉刷新冲突的方案</p>
</summary>
<category term="Android" scheme="http://itdais.com/tags/Android/"/>
<category term="SwipeToRefresh" scheme="http://itdais.com/tags/SwipeToRefresh/"/>
<category term="滑动冲突" scheme="http://itdais.com/tags/%E6%BB%91%E5%8A%A8%E5%86%B2%E7%AA%81/"/>
<category term="自定义控件" scheme="http://itdais.com/tags/%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A7%E4%BB%B6/"/>
</entry>
<entry>
<title>EditText限制输入小数点后两位</title>
<link href="http://itdais.com/2016/07/28/EditText%E9%99%90%E5%88%B6%E8%BE%93%E5%85%A5%E5%B0%8F%E6%95%B0%E7%82%B9%E5%90%8E%E4%B8%A4%E4%BD%8D/"/>
<id>http://itdais.com/2016/07/28/EditText限制输入小数点后两位/</id>
<published>2016-07-28T12:37:32.000Z</published>
<updated>2016-08-02T13:21:14.544Z</updated>
<content type="html"><p>实现EditText只能输入小数点后两位的控制,主要是给EditText添加输入监听事件<br><a id="more"></a></p>
<h4 id="1、设置EditText"><a href="#1、设置EditText" class="headerlink" title="1、设置EditText"></a>1、设置EditText</h4><p>EditText设置输入类型为浮点型<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">android:inputType="numberDecimal"</div></pre></td></tr></table></figure></p>
<p>设置监听<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">mEditText.addTextChangedListener(<span class="keyword">new</span> MyTextWatcher());</div></pre></td></tr></table></figure></p>
<h4 id="2、监听器"><a href="#2、监听器" class="headerlink" title="2、监听器"></a>2、监听器</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div></pre></td><td class="code"><pre><div class="line"><span class="class"><span class="keyword">class</span> <span class="title">MyTextWatcher</span> <span class="keyword">implements</span> <span class="title">TextWatcher</span></span>&#123;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">beforeTextChanged</span><span class="params">(CharSequence s, <span class="keyword">int</span> start, <span class="keyword">int</span> count, <span class="keyword">int</span> after)</span></span></div><div class="line"> &#123;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onTextChanged</span><span class="params">(CharSequence s, <span class="keyword">int</span> start, <span class="keyword">int</span> before, <span class="keyword">int</span> count)</span></span></div><div class="line"> &#123;</div><div class="line"> <span class="keyword">if</span> (s.toString().contains(<span class="string">"."</span>)) &#123;</div><div class="line"> <span class="keyword">if</span> (s.length() - <span class="number">1</span> - s.toString().indexOf(<span class="string">"."</span>) &gt; <span class="number">2</span>) &#123;</div><div class="line"> s = s.toString().subSequence(<span class="number">0</span>,</div><div class="line"> s.toString().indexOf(<span class="string">"."</span>) + <span class="number">3</span>);</div><div class="line"> mEditText.setText(s);</div><div class="line"> mEditText.setSelection(s.length());</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">if</span> (s.toString().trim().substring(<span class="number">0</span>).equals(<span class="string">"."</span>)) &#123;</div><div class="line"> s = <span class="string">"0"</span> + s;</div><div class="line"> mEditText.setText(s);</div><div class="line"> mEditText.setSelection(<span class="number">2</span>);</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="keyword">if</span> (s.toString().startsWith(<span class="string">"0"</span>)</div><div class="line"> &amp;&amp; s.toString().trim().length() &gt; <span class="number">1</span>) &#123;</div><div class="line"> <span class="keyword">if</span> (!s.toString().substring(<span class="number">1</span>, <span class="number">2</span>).equals(<span class="string">"."</span>)) &#123;</div><div class="line"> mEditText.setText(s.subSequence(<span class="number">0</span>, <span class="number">1</span>));</div><div class="line"> mEditText.setSelection(<span class="number">1</span>);</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">afterTextChanged</span><span class="params">(Editable s)</span></span></div><div class="line"> &#123;</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<blockquote>
<p>当前已经实现了小数点后两位的控制了</p>
</blockquote>
<h4 id="3、拓展"><a href="#3、拓展" class="headerlink" title="3、拓展"></a>3、拓展</h4><p>实现当我们没有输入小数点,格式化数据为#.00的格式</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//判断是不是浮点型</span></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">boolean</span> <span class="title">isFolat</span><span class="params">(String value)</span></span></div><div class="line"> &#123;</div><div class="line"> <span class="keyword">boolean</span> bCheckResult = <span class="keyword">true</span>;</div><div class="line"> <span class="keyword">try</span> &#123;</div><div class="line"> Float dCheckValue = Float.parseFloat(value);</div><div class="line"> <span class="keyword">if</span> (dCheckValue <span class="keyword">instanceof</span> Float == <span class="keyword">false</span>) &#123;</div><div class="line"> bCheckResult = <span class="keyword">false</span>;</div><div class="line"> &#125;</div><div class="line"> &#125; <span class="keyword">catch</span> (NumberFormatException e) &#123;</div><div class="line"> bCheckResult = <span class="keyword">false</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">return</span> bCheckResult;</div><div class="line"> &#125;</div><div class="line"> </div><div class="line"> </div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 格式化字符串</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> String <span class="title">formatFloat</span><span class="params">(String str)</span></span></div><div class="line"> &#123;</div><div class="line"> <span class="keyword">if</span> (isFolat(str)) &#123;</div><div class="line"> DecimalFormat format = <span class="keyword">new</span> DecimalFormat(<span class="string">"#0.00"</span>);</div><div class="line"> <span class="keyword">return</span> format.format(Double.parseDouble(str));</div><div class="line"> &#125; <span class="keyword">else</span> &#123;</div><div class="line"> <span class="keyword">return</span> str;</div><div class="line"> &#125;</div><div class="line"> &#125;</div></pre></td></tr></table></figure>
</content>
<summary type="html">
<p>实现EditText只能输入小数点后两位的控制,主要是给EditText添加输入监听事件<br>
</summary>
<category term="Android" scheme="http://itdais.com/tags/Android/"/>
<category term="Widget" scheme="http://itdais.com/tags/Widget/"/>
<category term="EditText" scheme="http://itdais.com/tags/EditText/"/>
</entry>
<entry>
<title>加载Https的图片</title>
<link href="http://itdais.com/2016/07/20/%E5%8A%A0%E8%BD%BDHttps%E7%9A%84%E5%9B%BE%E7%89%87/"/>
<id>http://itdais.com/2016/07/20/加载Https的图片/</id>
<published>2016-07-20T13:25:20.000Z</published>
<updated>2016-07-28T13:04:00.584Z</updated>
<content type="html"><p>本文介绍的是如何在项目中加载已Https为开头的图片,图片加载框架是Glide和UIL,当加载图片时候禁用掉所有的 SSL 证书检查。</p>
<a id="more"></a>
<h3 id="UIL加载图片"><a href="#UIL加载图片" class="headerlink" title="UIL加载图片"></a>UIL加载图片</h3><blockquote>
<p>ImageLoader我们需要自己写一个图片加载替换掉原有的imageDownloader,在application中配置就可以了</p>
</blockquote>
<ol>
<li><p>在Application中初始化ImageLoader</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MyApplication</span> <span class="keyword">extends</span> <span class="title">Application</span> </span>&#123;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onCreate</span><span class="params">()</span></span></div><div class="line"> &#123;</div><div class="line"> <span class="keyword">super</span>.onCreate();</div><div class="line"> <span class="comment">//设置OKHttp 支持https请求</span></div><div class="line"> OkHttpUtils.getInstance().setCertificates();</div><div class="line"></div><div class="line"> initImageLoader();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">initImageLoader</span><span class="params">()</span></span></div><div class="line"> &#123;</div><div class="line"> ImageLoaderConfiguration config = <span class="keyword">new</span> ImageLoaderConfiguration</div><div class="line"> .Builder(getApplicationContext())</div><div class="line"> .threadPriority(Thread.NORM_PRIORITY - <span class="number">2</span>)</div><div class="line"> .denyCacheImageMultipleSizesInMemory()</div><div class="line"> .diskCacheFileNameGenerator(<span class="keyword">new</span> Md5FileNameGenerator())</div><div class="line"> <span class="comment">//替换允许Https的图片加载</span></div><div class="line"> .imageDownloader(<span class="keyword">new</span> AuthImageDownloader(<span class="keyword">this</span>))</div><div class="line"> .tasksProcessingOrder(QueueProcessingType.LIFO).build();</div><div class="line"> ImageLoader.getInstance().init(config);</div><div class="line"> &#125; </div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
<li><p>AuthImageDownloader代码</p>
</li>
</ol>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">import</span> com.nostra13.universalimageloader.core.download.BaseImageDownloader;</div><div class="line"></div><div class="line"><span class="keyword">import</span> java.io.BufferedInputStream;</div><div class="line"><span class="keyword">import</span> java.io.IOException;</div><div class="line"><span class="keyword">import</span> java.io.InputStream;</div><div class="line"><span class="keyword">import</span> java.net.HttpURLConnection;</div><div class="line"><span class="keyword">import</span> java.net.MalformedURLException;</div><div class="line"><span class="keyword">import</span> java.net.URL;</div><div class="line"><span class="keyword">import</span> java.security.KeyManagementException;</div><div class="line"><span class="keyword">import</span> java.security.NoSuchAlgorithmException;</div><div class="line"></div><div class="line"><span class="keyword">import</span> javax.net.ssl.HostnameVerifier;</div><div class="line"><span class="keyword">import</span> javax.net.ssl.HttpsURLConnection;</div><div class="line"><span class="keyword">import</span> javax.net.ssl.SSLContext;</div><div class="line"><span class="keyword">import</span> javax.net.ssl.SSLSession;</div><div class="line"><span class="keyword">import</span> javax.net.ssl.SSLSocketFactory;</div><div class="line"></div><div class="line"><span class="comment">/**</span></div><div class="line"> * HTTPS的图片加载</div><div class="line"> */</div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">AuthImageDownloader</span> <span class="keyword">extends</span> <span class="title">BaseImageDownloader</span> </span>&#123;</div><div class="line"></div><div class="line"> <span class="keyword">private</span> SSLSocketFactory mSSLSocketFactory;</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">AuthImageDownloader</span><span class="params">(Context context)</span> </span>&#123;</div><div class="line"> <span class="keyword">super</span>(context);</div><div class="line"> SSLContext sslContext = sslContextForTrustedCertificates();</div><div class="line"> mSSLSocketFactory = sslContext.getSocketFactory();</div><div class="line"> &#125;</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">AuthImageDownloader</span><span class="params">(Context context, <span class="keyword">int</span> connectTimeout, <span class="keyword">int</span> readTimeout)</span> </span>&#123;</div><div class="line"> <span class="keyword">super</span>(context, connectTimeout, readTimeout);</div><div class="line"> SSLContext sslContext = sslContextForTrustedCertificates();</div><div class="line"> mSSLSocketFactory = sslContext.getSocketFactory();</div><div class="line"> &#125;</div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">protected</span> InputStream <span class="title">getStreamFromNetwork</span><span class="params">(String imageUri, Object extra)</span> <span class="keyword">throws</span> IOException</span></div><div class="line"> &#123;</div><div class="line"> URL url = <span class="keyword">null</span>;</div><div class="line"> <span class="keyword">try</span> &#123;</div><div class="line"> url = <span class="keyword">new</span> URL(imageUri);</div><div class="line"> &#125; <span class="keyword">catch</span> (MalformedURLException e) &#123;</div><div class="line"> &#125;</div><div class="line"> HttpURLConnection conn = (HttpURLConnection) url.openConnection();</div><div class="line"> conn.setConnectTimeout(connectTimeout);</div><div class="line"> conn.setReadTimeout(readTimeout);</div><div class="line"></div><div class="line"> <span class="keyword">if</span> (conn <span class="keyword">instanceof</span> HttpsURLConnection) &#123;</div><div class="line"> ((HttpsURLConnection)conn).setSSLSocketFactory(mSSLSocketFactory);</div><div class="line"> ((HttpsURLConnection)conn).setHostnameVerifier((DO_NOT_VERIFY));</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">return</span> <span class="keyword">new</span> BufferedInputStream(conn.getInputStream(), BUFFER_SIZE);</div><div class="line"> &#125;</div><div class="line"> <span class="comment">// always verify the host - dont check for certificate</span></div><div class="line"> <span class="keyword">final</span> HostnameVerifier DO_NOT_VERIFY = <span class="keyword">new</span> HostnameVerifier() &#123;</div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">verify</span><span class="params">(String hostname, SSLSession session)</span> </span>&#123;</div><div class="line"> <span class="keyword">return</span> <span class="keyword">true</span>;</div><div class="line"> &#125;</div><div class="line"> &#125;;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> SSLContext <span class="title">sslContextForTrustedCertificates</span><span class="params">()</span> </span>&#123;</div><div class="line"> javax.net.ssl.TrustManager[] trustAllCerts = <span class="keyword">new</span> javax.net.ssl.TrustManager[<span class="number">1</span>];</div><div class="line"> javax.net.ssl.TrustManager tm = <span class="keyword">new</span> miTM();</div><div class="line"> trustAllCerts[<span class="number">0</span>] = tm;</div><div class="line"> SSLContext sc = <span class="keyword">null</span>;</div><div class="line"> <span class="keyword">try</span> &#123;</div><div class="line"> sc = SSLContext.getInstance(<span class="string">"SSL"</span>);</div><div class="line"> sc.init(<span class="keyword">null</span>, trustAllCerts, <span class="keyword">null</span>);</div><div class="line"> <span class="comment">//javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());</span></div><div class="line"> &#125; <span class="keyword">catch</span> (NoSuchAlgorithmException e) &#123;</div><div class="line"> e.printStackTrace();</div><div class="line"> &#125;<span class="keyword">catch</span> (KeyManagementException e) &#123;</div><div class="line"> e.printStackTrace();</div><div class="line"> &#125;<span class="keyword">finally</span> &#123;</div><div class="line"> <span class="keyword">return</span> sc;</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="class"><span class="keyword">class</span> <span class="title">miTM</span> <span class="keyword">implements</span> <span class="title">javax</span>.<span class="title">net</span>.<span class="title">ssl</span>.<span class="title">TrustManager</span>, <span class="title">javax</span>.<span class="title">net</span>.<span class="title">ssl</span>.<span class="title">X509TrustManager</span> </span>&#123;</div><div class="line"> <span class="keyword">public</span> java.security.cert.X509Certificate[] getAcceptedIssuers() &#123;</div><div class="line"> <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isServerTrusted</span><span class="params">(</span></span></div><div class="line"> java.security.cert.X509Certificate[] certs) &#123;</div><div class="line"> <span class="keyword">return</span> <span class="keyword">true</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isClientTrusted</span><span class="params">(</span></span></div><div class="line"> java.security.cert.X509Certificate[] certs) &#123;</div><div class="line"> <span class="keyword">return</span> <span class="keyword">true</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">checkServerTrusted</span><span class="params">(</span></span></div><div class="line"> java.security.cert.X509Certificate[] certs, String authType)</div><div class="line"> <span class="keyword">throws</span> java.security.cert.CertificateException &#123;</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">checkClientTrusted</span><span class="params">(</span></span></div><div class="line"> java.security.cert.X509Certificate[] certs, String authType)</div><div class="line"> <span class="keyword">throws</span> java.security.cert.CertificateException &#123;</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h3 id="Glide加载图片"><a href="#Glide加载图片" class="headerlink" title="Glide加载图片"></a>Glide加载图片</h3><p>Glide加载Https需要自定义Module,并且要整合Okhttp,让okhttp禁用掉所有的 SSL 证书检查。</p>
<ol>
<li>gradle引用</li>
</ol>
<blockquote>
<p>引用中介绍的比较麻烦,Glide已经提供了Module给我们使用。</p>
</blockquote>
<figure class="highlight gradle"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">compile</span> <span class="string">'com.squareup.okhttp3:okhttp:3.3.1'</span></div><div class="line"><span class="keyword">compile</span> <span class="string">'com.github.bumptech.glide:glide:3.7.0'</span></div><div class="line"><span class="comment">/*提供的Module*/</span></div><div class="line"><span class="keyword">compile</span> <span class="string">'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'</span></div></pre></td></tr></table></figure>
<ol>
<li><p>application中初始化</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//让Glide能用HTTPS</span></div><div class="line">Glide.get(<span class="keyword">this</span>).register(GlideUrl.class, InputStream.class, <span class="keyword">new</span> OkHttpUrlLoader.Factory(RetrofitUtils.getOkHttpClient()));</div></pre></td></tr></table></figure>
</li>
<li><p>设置证书<br>这个不是必须的,当你没有证书的时候,就不需要获取,如果有就拿到InputStream,传到下面的getOkHttpClient()的方法中</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">try</span> &#123;</div><div class="line"> InputStream input = getAssets().open(<span class="string">"server.cer"</span>);</div><div class="line">&#125; <span class="keyword">catch</span> (IOException e) &#123;</div><div class="line"> e.printStackTrace();</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
<li><p>配置OkHttp允许Https</p>
<p>获取OkHttpClien</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line"><span class="comment">/**</span></div><div class="line"> * 获取OkHttpClient</div><div class="line"> * 设置允许HTTPS</div><div class="line"> * */</div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> OkHttpClient <span class="title">getOkHttpClient</span><span class="params">(InputStream... certificates)</span></span></div><div class="line">&#123;</div><div class="line"> SSLSocketFactory sslSocketFactory = HttpsUtils.getSslSocketFactory(certificates, <span class="keyword">null</span>, <span class="keyword">null</span>);</div><div class="line"> OkHttpClient.Builder builder = <span class="keyword">new</span> OkHttpClient().newBuilder();</div><div class="line"> builder = builder.sslSocketFactory(sslSocketFactory);</div><div class="line"> builder.hostnameVerifier(<span class="keyword">new</span> HostnameVerifier() &#123;</div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">verify</span><span class="params">(String hostname, SSLSession session)</span></span></div><div class="line"> &#123;</div><div class="line"> <span class="keyword">return</span> <span class="keyword">true</span>;</div><div class="line"> &#125;</div><div class="line"> &#125;);</div><div class="line"> <span class="keyword">return</span> builder.build();</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
</ol>
<p>HttpsUtils中可以传递证书进入,如果没有证书就传null</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div><div class="line">126</div><div class="line">127</div><div class="line">128</div><div class="line">129</div><div class="line">130</div><div class="line">131</div><div class="line">132</div><div class="line">133</div><div class="line">134</div><div class="line">135</div><div class="line">136</div><div class="line">137</div><div class="line">138</div><div class="line">139</div><div class="line">140</div><div class="line">141</div><div class="line">142</div><div class="line">143</div><div class="line">144</div><div class="line">145</div><div class="line">146</div><div class="line">147</div><div class="line">148</div><div class="line">149</div><div class="line">150</div><div class="line">151</div><div class="line">152</div><div class="line">153</div><div class="line">154</div><div class="line">155</div><div class="line">156</div><div class="line">157</div><div class="line">158</div><div class="line">159</div><div class="line">160</div><div class="line">161</div><div class="line">162</div><div class="line">163</div><div class="line">164</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">import</span> java.io.IOException;</div><div class="line"><span class="keyword">import</span> java.io.InputStream;</div><div class="line"><span class="keyword">import</span> java.security.KeyManagementException;</div><div class="line"><span class="keyword">import</span> java.security.KeyStore;</div><div class="line"><span class="keyword">import</span> java.security.KeyStoreException;</div><div class="line"><span class="keyword">import</span> java.security.NoSuchAlgorithmException;</div><div class="line"><span class="keyword">import</span> java.security.SecureRandom;</div><div class="line"><span class="keyword">import</span> java.security.UnrecoverableKeyException;</div><div class="line"><span class="keyword">import</span> java.security.cert.CertificateException;</div><div class="line"><span class="keyword">import</span> java.security.cert.CertificateFactory;</div><div class="line"><span class="keyword">import</span> java.security.cert.X509Certificate;</div><div class="line"></div><div class="line"><span class="keyword">import</span> javax.net.ssl.HostnameVerifier;</div><div class="line"><span class="keyword">import</span> javax.net.ssl.KeyManager;</div><div class="line"><span class="keyword">import</span> javax.net.ssl.KeyManagerFactory;</div><div class="line"><span class="keyword">import</span> javax.net.ssl.SSLContext;</div><div class="line"><span class="keyword">import</span> javax.net.ssl.SSLSession;</div><div class="line"><span class="keyword">import</span> javax.net.ssl.SSLSocketFactory;</div><div class="line"><span class="keyword">import</span> javax.net.ssl.TrustManager;</div><div class="line"><span class="keyword">import</span> javax.net.ssl.TrustManagerFactory;</div><div class="line"><span class="keyword">import</span> javax.net.ssl.X509TrustManager;</div><div class="line"></div><div class="line"><span class="comment">/**</span></div><div class="line"> * 设置允许Https</div><div class="line"> */</div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">HttpsUtils</span></span>&#123;</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> SSLSocketFactory <span class="title">getSslSocketFactory</span><span class="params">(InputStream[] certificates, InputStream bksFile, String password)</span></span>&#123;</div><div class="line"> <span class="keyword">try</span>&#123;</div><div class="line"> TrustManager[] trustManagers = prepareTrustManager(certificates);</div><div class="line"> KeyManager[] keyManagers = prepareKeyManager(bksFile, password);</div><div class="line"> SSLContext sslContext = SSLContext.getInstance(<span class="string">"TLS"</span>);</div><div class="line"> TrustManager trustManager = <span class="keyword">null</span>;</div><div class="line"> <span class="keyword">if</span> (trustManagers != <span class="keyword">null</span>)&#123;</div><div class="line"> trustManager = <span class="keyword">new</span> MyTrustManager(chooseTrustManager(trustManagers));</div><div class="line"> &#125; <span class="keyword">else</span>&#123;</div><div class="line"> trustManager = <span class="keyword">new</span> UnSafeTrustManager();</div><div class="line"> &#125;</div><div class="line"> sslContext.init(keyManagers, <span class="keyword">new</span> TrustManager[]&#123;trustManager&#125;, <span class="keyword">new</span> SecureRandom());</div><div class="line"> <span class="keyword">return</span> sslContext.getSocketFactory();</div><div class="line"> &#125; <span class="keyword">catch</span> (NoSuchAlgorithmException e)&#123;</div><div class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError(e);</div><div class="line"> &#125; <span class="keyword">catch</span> (KeyManagementException e)&#123;</div><div class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError(e);</div><div class="line"> &#125; <span class="keyword">catch</span> (KeyStoreException e)&#123;</div><div class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError(e);</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="class"><span class="keyword">class</span> <span class="title">UnSafeHostnameVerifier</span> <span class="keyword">implements</span> <span class="title">HostnameVerifier</span></span>&#123;</div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">verify</span><span class="params">(String hostname, SSLSession session)</span></span>&#123;</div><div class="line"> <span class="keyword">return</span> <span class="keyword">true</span>;</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">UnSafeTrustManager</span> <span class="keyword">implements</span> <span class="title">X509TrustManager</span></span>&#123;</div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">checkClientTrusted</span><span class="params">(X509Certificate[] chain, String authType)</span><span class="keyword">throws</span> CertificateException</span>&#123;&#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">checkServerTrusted</span><span class="params">(X509Certificate[] chain, String authType)</span><span class="keyword">throws</span> CertificateException</span>&#123;&#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="keyword">public</span> X509Certificate[] getAcceptedIssuers()&#123;</div><div class="line"> <span class="keyword">return</span> <span class="keyword">new</span> X509Certificate[]&#123;&#125;;</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> TrustManager[] prepareTrustManager(InputStream... certificates)&#123;</div><div class="line"> <span class="keyword">if</span> (certificates == <span class="keyword">null</span> || certificates.length &lt;= <span class="number">0</span>) <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line"> <span class="keyword">try</span>&#123;</div><div class="line"> CertificateFactory certificateFactory = CertificateFactory.getInstance(<span class="string">"X.509"</span>);</div><div class="line"> KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());</div><div class="line"> keyStore.load(<span class="keyword">null</span>);</div><div class="line"> <span class="keyword">int</span> index = <span class="number">0</span>;</div><div class="line"> <span class="keyword">for</span> (InputStream certificate : certificates)&#123;</div><div class="line"> String certificateAlias = Integer.toString(index++);</div><div class="line"> keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));</div><div class="line"> <span class="keyword">try</span>&#123;</div><div class="line"> <span class="keyword">if</span> (certificate != <span class="keyword">null</span>)</div><div class="line"> certificate.close();</div><div class="line"> &#125; <span class="keyword">catch</span> (IOException e)&#123;</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"> TrustManagerFactory trustManagerFactory = <span class="keyword">null</span>;</div><div class="line"> trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());</div><div class="line"> trustManagerFactory.init(keyStore);</div><div class="line"> TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();</div><div class="line"> <span class="keyword">return</span> trustManagers;</div><div class="line"> &#125; <span class="keyword">catch</span> (NoSuchAlgorithmException e)&#123;</div><div class="line"> e.printStackTrace();</div><div class="line"> &#125; <span class="keyword">catch</span> (CertificateException e)&#123;</div><div class="line"> e.printStackTrace();</div><div class="line"> &#125; <span class="keyword">catch</span> (KeyStoreException e)&#123;</div><div class="line"> e.printStackTrace();</div><div class="line"> &#125; <span class="keyword">catch</span> (Exception e)&#123;</div><div class="line"> e.printStackTrace();</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line"></div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> KeyManager[] prepareKeyManager(InputStream bksFile, String password)&#123;</div><div class="line"> <span class="keyword">try</span>&#123;</div><div class="line"> <span class="keyword">if</span> (bksFile == <span class="keyword">null</span> || password == <span class="keyword">null</span>) <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line"> KeyStore clientKeyStore = KeyStore.getInstance(<span class="string">"BKS"</span>);</div><div class="line"> clientKeyStore.load(bksFile, password.toCharArray());</div><div class="line"> KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());</div><div class="line"> keyManagerFactory.init(clientKeyStore, password.toCharArray());</div><div class="line"> <span class="keyword">return</span> keyManagerFactory.getKeyManagers();</div><div class="line"> &#125; <span class="keyword">catch</span> (KeyStoreException e)&#123;</div><div class="line"> e.printStackTrace();</div><div class="line"> &#125; <span class="keyword">catch</span> (NoSuchAlgorithmException e)&#123;</div><div class="line"> e.printStackTrace();</div><div class="line"> &#125; <span class="keyword">catch</span> (UnrecoverableKeyException e)&#123;</div><div class="line"> e.printStackTrace();</div><div class="line"> &#125; <span class="keyword">catch</span> (CertificateException e)&#123;</div><div class="line"> e.printStackTrace();</div><div class="line"> &#125; <span class="keyword">catch</span> (IOException e)&#123;</div><div class="line"> e.printStackTrace();</div><div class="line"> &#125; <span class="keyword">catch</span> (Exception e)&#123;</div><div class="line"> e.printStackTrace();</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> X509TrustManager <span class="title">chooseTrustManager</span><span class="params">(TrustManager[] trustManagers)</span></span>&#123;</div><div class="line"> <span class="keyword">for</span> (TrustManager trustManager : trustManagers)&#123;</div><div class="line"> <span class="keyword">if</span> (trustManager <span class="keyword">instanceof</span> X509TrustManager)&#123;</div><div class="line"> <span class="keyword">return</span> (X509TrustManager) trustManager;</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">MyTrustManager</span> <span class="keyword">implements</span> <span class="title">X509TrustManager</span></span>&#123;</div><div class="line"> <span class="keyword">private</span> X509TrustManager defaultTrustManager;</div><div class="line"> <span class="keyword">private</span> X509TrustManager localTrustManager;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">MyTrustManager</span><span class="params">(X509TrustManager localTrustManager)</span> <span class="keyword">throws</span> NoSuchAlgorithmException, KeyStoreException</span>&#123;</div><div class="line"> TrustManagerFactory var4 = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());</div><div class="line"> var4.init((KeyStore) <span class="keyword">null</span>);</div><div class="line"> defaultTrustManager = chooseTrustManager(var4.getTrustManagers());</div><div class="line"> <span class="keyword">this</span>.localTrustManager = localTrustManager;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">checkClientTrusted</span><span class="params">(X509Certificate[] chain, String authType)</span> <span class="keyword">throws</span> CertificateException</span>&#123;&#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">checkServerTrusted</span><span class="params">(X509Certificate[] chain, String authType)</span> <span class="keyword">throws</span> CertificateException</span>&#123;</div><div class="line"> <span class="keyword">try</span>&#123;</div><div class="line"> defaultTrustManager.checkServerTrusted(chain, authType);</div><div class="line"> &#125; <span class="keyword">catch</span> (CertificateException ce)&#123;</div><div class="line"> localTrustManager.checkServerTrusted(chain, authType);</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="keyword">public</span> X509Certificate[] getAcceptedIssuers()&#123;</div><div class="line"> <span class="keyword">return</span> <span class="keyword">new</span> X509Certificate[<span class="number">0</span>];</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>所有代码引入后就可以,Glide就可以加载Https开头的图片了。</p>
<h3 id="引用"><a href="#引用" class="headerlink" title="引用"></a>引用</h3><blockquote>
<p><a href="http://blog.csdn.net/wk843620202/article/details/50979790" target="_blank" rel="external">完美解决imageloader加载https图片</a><br><a href="https://futurestud.io/blog/glide-module-example-accepting-self-signed-https-certificates" target="_blank" rel="external">Glide加载Https</a><br><a href="http://www.open-open.com/lib/view/open1456706981984.html" target="_blank" rel="external">Glide加载Https中文翻译</a></p>
</blockquote>
</content>
<summary type="html">
<p>本文介绍的是如何在项目中加载已Https为开头的图片,图片加载框架是Glide和UIL,当加载图片时候禁用掉所有的 SSL 证书检查。</p>
</summary>
<category term="Android" scheme="http://itdais.com/tags/Android/"/>
<category term="图片加载" scheme="http://itdais.com/tags/%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD/"/>
<category term="HTTPS" scheme="http://itdais.com/tags/HTTPS/"/>
</entry>
<entry>
<title>Android ADB端口被占用</title>
<link href="http://itdais.com/2016/07/18/Android%20ADB%E7%AB%AF%E5%8F%A3%E8%A2%AB%E5%8D%A0%E7%94%A8/"/>
<id>http://itdais.com/2016/07/18/Android ADB端口被占用/</id>
<published>2016-07-18T13:45:18.000Z</published>
<updated>2016-07-28T13:04:03.531Z</updated>
<content type="html"><p>最近几天使用android studio1.5.1的时候一直提示错误,一开始没在意,重启就好了.但是总不能一直报错就重启吧,查看下问题原因吧,发现是android adb的端口被占用了。当使用到音乐播放器如酷狗酷我或者使用了豌豆荚、360手机助手等软件时候,是会抢占掉adb的端口的。</p>
<a id="more"></a>
<h4 id="解决方法一-杀死占用进程"><a href="#解决方法一-杀死占用进程" class="headerlink" title="解决方法一:杀死占用进程"></a>解决方法一:杀死占用进程</h4><h4 id="解决方法二-重设adb的端口"><a href="#解决方法二-重设adb的端口" class="headerlink" title="解决方法二:重设adb的端口"></a>解决方法二:重设adb的端口</h4></content>
<summary type="html">
<p>最近几天使用android studio1.5.1的时候一直提示错误,一开始没在意,重启就好了.但是总不能一直报错就重启吧,查看下问题原因吧,发现是android adb的端口被占用了。当使用到音乐播放器如酷狗酷我或者使用了豌豆荚、360手机助手等软件时候,是会抢占掉adb的端口的。</p>
</summary>
<category term="Android" scheme="http://itdais.com/tags/Android/"/>
<category term="BUG" scheme="http://itdais.com/tags/BUG/"/>
</entry>
<entry>
<title>屏幕管理工具类</title>
<link href="http://itdais.com/2016/07/18/%E5%B1%8F%E5%B9%95%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7%E7%B1%BB/"/>
<id>http://itdais.com/2016/07/18/屏幕管理工具类/</id>
<published>2016-07-18T13:15:20.000Z</published>
<updated>2016-08-02T13:21:37.458Z</updated>
<content type="html"><p>提供了dp互转px,sp互转px,获取屏幕宽高,获取状态栏高度、toolbar高度、底部虚拟菜单高度等等。</p>
<blockquote>
<p>dp(dip): device independent pixels(设备独立像素).不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。</p>
<p>使用dp和sp,系统会根据屏幕密度的变化自动进行转换。<br>如果设置表示长度、高度等属性时可以使用dp。但如果设置字体,需要使用sp。dp是与密度无关,sp除了与密度无关外,还与scale无关。</p>
<p> px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。</p>
<p> sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。</p>
</blockquote>
<a id="more"></a>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div><div class="line">126</div><div class="line">127</div><div class="line">128</div><div class="line">129</div><div class="line">130</div><div class="line">131</div><div class="line">132</div><div class="line">133</div><div class="line">134</div><div class="line">135</div><div class="line">136</div><div class="line">137</div><div class="line">138</div><div class="line">139</div><div class="line">140</div><div class="line">141</div><div class="line">142</div><div class="line">143</div><div class="line">144</div><div class="line">145</div><div class="line">146</div><div class="line">147</div><div class="line">148</div><div class="line">149</div><div class="line">150</div><div class="line">151</div><div class="line">152</div><div class="line">153</div><div class="line">154</div><div class="line">155</div><div class="line">156</div><div class="line">157</div><div class="line">158</div><div class="line">159</div><div class="line">160</div><div class="line">161</div><div class="line">162</div><div class="line">163</div><div class="line">164</div><div class="line">165</div><div class="line">166</div><div class="line">167</div><div class="line">168</div><div class="line">169</div><div class="line">170</div><div class="line">171</div><div class="line">172</div><div class="line">173</div><div class="line">174</div><div class="line">175</div><div class="line">176</div><div class="line">177</div><div class="line">178</div><div class="line">179</div><div class="line">180</div><div class="line">181</div><div class="line">182</div><div class="line">183</div><div class="line">184</div><div class="line">185</div><div class="line">186</div><div class="line">187</div><div class="line">188</div><div class="line">189</div><div class="line">190</div><div class="line">191</div><div class="line">192</div><div class="line">193</div><div class="line">194</div><div class="line">195</div><div class="line">196</div><div class="line">197</div><div class="line">198</div><div class="line">199</div><div class="line">200</div><div class="line">201</div><div class="line">202</div><div class="line">203</div><div class="line">204</div><div class="line">205</div><div class="line">206</div><div class="line">207</div><div class="line">208</div><div class="line">209</div><div class="line">210</div><div class="line">211</div><div class="line">212</div><div class="line">213</div><div class="line">214</div><div class="line">215</div><div class="line">216</div><div class="line">217</div><div class="line">218</div><div class="line">219</div><div class="line">220</div><div class="line">221</div><div class="line">222</div><div class="line">223</div><div class="line">224</div><div class="line">225</div><div class="line">226</div><div class="line">227</div><div class="line">228</div><div class="line">229</div><div class="line">230</div><div class="line">231</div><div class="line">232</div><div class="line">233</div><div class="line">234</div><div class="line">235</div><div class="line">236</div><div class="line">237</div><div class="line">238</div><div class="line">239</div><div class="line">240</div><div class="line">241</div><div class="line">242</div><div class="line">243</div><div class="line">244</div><div class="line">245</div><div class="line">246</div><div class="line">247</div><div class="line">248</div><div class="line">249</div><div class="line">250</div><div class="line">251</div><div class="line">252</div><div class="line">253</div><div class="line">254</div><div class="line">255</div><div class="line">256</div><div class="line">257</div><div class="line">258</div><div class="line">259</div><div class="line">260</div><div class="line">261</div><div class="line">262</div><div class="line">263</div><div class="line">264</div><div class="line">265</div><div class="line">266</div><div class="line">267</div><div class="line">268</div><div class="line">269</div><div class="line">270</div><div class="line">271</div><div class="line">272</div><div class="line">273</div><div class="line">274</div><div class="line">275</div><div class="line">276</div><div class="line">277</div></pre></td><td class="code"><pre><div class="line">import android.app.Activity;</div><div class="line">import android.content.Context;</div><div class="line">import android.content.res.Configuration;</div><div class="line">import android.content.res.Resources;</div><div class="line">import android.content.res.TypedArray;</div><div class="line">import android.graphics.Bitmap;</div><div class="line">import android.graphics.Rect;</div><div class="line">import android.util.DisplayMetrics;</div><div class="line">import android.util.Log;</div><div class="line">import android.util.TypedValue;</div><div class="line">import android.view.View;</div><div class="line">import android.view.Window;</div><div class="line"></div><div class="line">public class DensityUtils &#123;</div><div class="line"></div><div class="line"> private static final float DOT_FIVE = 0.5f;</div><div class="line"></div><div class="line"> /**</div><div class="line"> * dip to px</div><div class="line"> *</div><div class="line"> * @param context</div><div class="line"> * @param dip</div><div class="line"> * @return</div><div class="line"> */</div><div class="line"> public static int dip2px(Context context, float dip) &#123;</div><div class="line"></div><div class="line"> float density = getDensity(context);</div><div class="line"> return (int) (dip * density + DensityUtils.DOT_FIVE);</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> /**</div><div class="line"> * px to dip</div><div class="line"> *</div><div class="line"> * @param context</div><div class="line"> * @param px</div><div class="line"> * @return</div><div class="line"> */</div><div class="line"> public static int px2dip(Context context, float px) &#123;</div><div class="line"> float density = getDensity(context);</div><div class="line"> return (int) (px / density + DOT_FIVE);</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> /**</div><div class="line"> * 将px值转换为sp值,保证文字大小不变</div><div class="line"> *</div><div class="line"> * @param pxValue</div><div class="line"> * @param pxValue</div><div class="line"> * (DisplayMetrics类中属性scaledDensity)</div><div class="line"> * @return</div><div class="line"> */</div><div class="line"> public static int px2sp(Context context, float pxValue) &#123;</div><div class="line"> final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;</div><div class="line"> return (int) (pxValue / fontScale + 0.5f);</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> /**</div><div class="line"> * 将sp值转换为px值,保证文字大小不变</div><div class="line"> *</div><div class="line"> * @param spValue</div><div class="line"> * @param spValue</div><div class="line"> * (DisplayMetrics类中属性scaledDensity)</div><div class="line"> * @return</div><div class="line"> */</div><div class="line"> public static int sp2px(Context context, float spValue) &#123;</div><div class="line"> final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;</div><div class="line"> return (int) (spValue * fontScale + 0.5f);</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> private static DisplayMetrics sDisplayMetrics;</div><div class="line"></div><div class="line"> /**</div><div class="line"> * get screen width</div><div class="line"> *</div><div class="line"> * @param context</div><div class="line"> * @return</div><div class="line"> */</div><div class="line"> public static int getDisplayWidth(Context context) &#123;</div><div class="line"> initDisplayMetrics(context);</div><div class="line"> return sDisplayMetrics.widthPixels;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> /**</div><div class="line"> * get screen height</div><div class="line"> *</div><div class="line"> * @param context</div><div class="line"> * @return</div><div class="line"> */</div><div class="line"> public static int getDisplayHeight(Context context) &#123;</div><div class="line"> initDisplayMetrics(context);</div><div class="line"> return sDisplayMetrics.heightPixels;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> /**</div><div class="line"> * get screen density</div><div class="line"> *</div><div class="line"> * @param context</div><div class="line"> * @return</div><div class="line"> */</div><div class="line"> public static float getDensity(Context context) &#123;</div><div class="line"> initDisplayMetrics(context);</div><div class="line"> return sDisplayMetrics.density;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"></div><div class="line"> /**</div><div class="line"> * get screen density dpi</div><div class="line"> *</div><div class="line"> * @param context</div><div class="line"> * @return</div><div class="line"> */</div><div class="line"> public static int getDensityDpi(Context context) &#123;</div><div class="line"> initDisplayMetrics(context);</div><div class="line"> return sDisplayMetrics.densityDpi;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> /**</div><div class="line"> * init display metrics</div><div class="line"> *</div><div class="line"> * @param context</div><div class="line"> */</div><div class="line"> private static synchronized void initDisplayMetrics(Context context) &#123;</div><div class="line"> sDisplayMetrics = context.getResources().getDisplayMetrics();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> /**</div><div class="line"> * is landscape</div><div class="line"> *</div><div class="line"> * @param context</div><div class="line"> * @return</div><div class="line"> */</div><div class="line"> public static boolean isLandscape(Context context) &#123;</div><div class="line"> return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> /**</div><div class="line"> * is portrait</div><div class="line"> *</div><div class="line"> * @param context</div><div class="line"> * @return</div><div class="line"> */</div><div class="line"> public static boolean isPortrait(Context context) &#123;</div><div class="line"> return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> public static int getActvieHeight(Activity activity)&#123;</div><div class="line"> Dimension dimen = new Dimension();</div><div class="line"> // 用户绘制区域</div><div class="line"> Rect outRect = new Rect();</div><div class="line"> activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect);</div><div class="line"> dimen.mWidth = outRect.width() ;</div><div class="line"> dimen.mHeight = outRect.height();</div><div class="line"> // end</div><div class="line"> return dimen.mHeight;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> /**</div><div class="line"> * 获得状态栏的高度</div><div class="line"> *</div><div class="line"> * @param activity</div><div class="line"> * @return</div><div class="line"> */</div><div class="line"> public static int getStatusHeight(Activity activity)</div><div class="line"> &#123;</div><div class="line">// Rect frame = new Rect();</div><div class="line">// activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);</div><div class="line">// int statusBarHeight = frame.top;</div><div class="line">// Log.d(&quot;111&quot;,&quot;statusBarHeight&quot;+statusBarHeight);</div><div class="line"> int statusHeight = -1;</div><div class="line"> try</div><div class="line"> &#123;</div><div class="line"> Class&lt;?&gt; clazz = Class.forName(&quot;com.android.internal.R$dimen&quot;);</div><div class="line"> Object object = clazz.newInstance();</div><div class="line"> int height = Integer.parseInt(clazz.getField(&quot;status_bar_height&quot;)</div><div class="line"> .get(object).toString());</div><div class="line"> statusHeight = activity.getResources().getDimensionPixelSize(height);</div><div class="line"> &#125; catch (Exception e)</div><div class="line"> &#123;</div><div class="line"> e.printStackTrace();</div><div class="line"> &#125;</div><div class="line"> return statusHeight;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> public int getNavigationBarHeight(Activity activity) &#123;</div><div class="line"> Resources resources = activity.getResources();</div><div class="line"> int resourceId = resources.getIdentifier(&quot;navigation_bar_height&quot;,&quot;dimen&quot;, &quot;android&quot;);</div><div class="line"> int height = resources.getDimensionPixelSize(resourceId);</div><div class="line"> Log.v(&quot;dbw&quot;, &quot;Navi height:&quot; + height);</div><div class="line"> return height;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> public static int getActionBarHeight(Context context) &#123;</div><div class="line"> TypedValue tv = new TypedValue();</div><div class="line"> if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) &#123;</div><div class="line"> int actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics());</div><div class="line"> return actionBarHeight;</div><div class="line"> &#125;else&#123;</div><div class="line"> return 0;</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"> /**</div><div class="line"> * get toolbar height</div><div class="line"> * @param context</div><div class="line"> * @return</div><div class="line"> */</div><div class="line"> public static int getToolbarHeight(Context context) &#123;</div><div class="line"> final TypedArray styledAttributes = context.getTheme().obtainStyledAttributes(</div><div class="line"> new int[]&#123;android.R.attr.actionBarSize&#125;);</div><div class="line"> int toolbarHeight = (int) styledAttributes.getDimension(0, 0);</div><div class="line"> styledAttributes.recycle();</div><div class="line"></div><div class="line"> return toolbarHeight;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> private int getTitleHeight(Activity activity) &#123;</div><div class="line"> int contentTop = activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();</div><div class="line"> //statusBarHeight是上面状态栏的高度</div><div class="line"> int titleBarHeight = contentTop - getStatusHeight(activity);</div><div class="line"> return titleBarHeight;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> private int getActionBarSizeHeight(Activity activity) &#123;</div><div class="line"> return activity.getActionBar().getHeight();</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> public static class Dimension &#123;</div><div class="line"> public int mWidth ;</div><div class="line"> public int mHeight ;</div><div class="line"> public Dimension()&#123;&#125;</div><div class="line"> &#125;</div><div class="line"></div><div class="line"> /**</div><div class="line"> * 获取当前屏幕截图,包含状态栏</div><div class="line"> *</div><div class="line"> * @param activity</div><div class="line"> * @return</div><div class="line"> */</div><div class="line"> public static Bitmap snapShotWithStatusBar(Activity activity)</div><div class="line"> &#123;</div><div class="line"> View view = activity.getWindow().getDecorView();</div><div class="line"> view.setDrawingCacheEnabled(true);</div><div class="line"> view.buildDrawingCache();</div><div class="line"> Bitmap bmp = view.getDrawingCache();</div><div class="line"> int width = getDisplayWidth(activity);</div><div class="line"> int height = getDisplayHeight(activity);</div><div class="line"> Bitmap bp = null;</div><div class="line"> bp = Bitmap.createBitmap(bmp, 0, 0, width, height);</div><div class="line"> view.destroyDrawingCache();</div><div class="line"> return bp;</div><div class="line"></div><div class="line"> &#125;</div><div class="line"></div><div class="line"> /**</div><div class="line"> * 获取当前屏幕截图,不包含状态栏</div><div class="line"> *</div><div class="line"> * @param activity</div><div class="line"> * @return</div><div class="line"> */</div><div class="line"> public static Bitmap snapShotWithoutStatusBar(Activity activity)</div><div class="line"> &#123;</div><div class="line"> View view = activity.getWindow().getDecorView();</div><div class="line"> view.setDrawingCacheEnabled(true);</div><div class="line"> view.buildDrawingCache();</div><div class="line"> Bitmap bmp = view.getDrawingCache();</div><div class="line"> Rect frame = new Rect();</div><div class="line"> activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);</div><div class="line"> int statusBarHeight = frame.top;</div><div class="line"></div><div class="line"> int width = getDisplayWidth(activity);</div><div class="line"> int height = getDisplayHeight(activity);</div><div class="line"> Bitmap bp = null;</div><div class="line"> bp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height</div><div class="line"> - statusBarHeight);</div><div class="line"> view.destroyDrawingCache();</div><div class="line"> return bp;</div><div class="line"></div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</content>
<summary type="html">
<p>提供了dp互转px,sp互转px,获取屏幕宽高,获取状态栏高度、toolbar高度、底部虚拟菜单高度等等。</p>
<blockquote>
<p>dp(dip): device independent pixels(设备独立像素).不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。</p>
<p>使用dp和sp,系统会根据屏幕密度的变化自动进行转换。<br>如果设置表示长度、高度等属性时可以使用dp。但如果设置字体,需要使用sp。dp是与密度无关,sp除了与密度无关外,还与scale无关。</p>
<p> px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。</p>
<p> sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。</p>
</blockquote>
</summary>
<category term="archives" scheme="http://itdais.com/categories/archives/"/>
<category term="Android" scheme="http://itdais.com/tags/Android/"/>
<category term="屏幕" scheme="http://itdais.com/tags/%E5%B1%8F%E5%B9%95/"/>
<category term="工具类" scheme="http://itdais.com/tags/%E5%B7%A5%E5%85%B7%E7%B1%BB/"/>
</entry>
<entry>
<title>通用验证工具类</title>
<link href="http://itdais.com/2016/07/06/%E9%80%9A%E7%94%A8%E9%AA%8C%E8%AF%81%E5%B7%A5%E5%85%B7%E7%B1%BB/"/>
<id>http://itdais.com/2016/07/06/通用验证工具类/</id>
<published>2016-07-06T15:02:10.000Z</published>
<updated>2016-07-28T13:04:02.041Z</updated>
<content type="html"><p>本文收集了一些常用的验证方法,如手机号码验证、银行卡验证等,以后会不定期的更新<br><a id="more"></a></p>
<h4 id="1、手机号码验证"><a href="#1、手机号码验证" class="headerlink" title="1、手机号码验证"></a>1、手机号码验证</h4><figure class="highlight markdown"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">/**</div><div class="line"> * 判断手机格式是否正确</div><div class="line"> * 表示以1开头,第二位可能是3/4/5/7/8等的任意一个,在加上后面的\d表示数字[0-9]的9位,总共加起来11位结束</div><div class="line"> *</div><div class="line"> * @return true 是手机号码</div><div class="line"> */</div><div class="line">public static boolean isMobile(String mobiles)</div><div class="line">&#123;</div><div class="line"><span class="code"> Pattern p = Pattern.compile("^1[3|4|5|7|8]\\d&#123;9&#125;$");</span></div><div class="line"><span class="code"> Matcher m = p.matcher(mobiles);</span></div><div class="line"><span class="code"> return m.matches();</span></div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h4 id="2、中文验证"><a href="#2、中文验证" class="headerlink" title="2、中文验证"></a>2、中文验证</h4><figure class="highlight markdown"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">/**</div><div class="line"> * 检查是否全部是中文</div><div class="line"> * @return true 全是中文</div><div class="line"> */</div><div class="line">public static boolean isChinaise(String body)</div><div class="line">&#123;</div><div class="line"><span class="code"> Pattern p = Pattern.compile("^[\\u4e00-\\u9fa5]+");</span></div><div class="line"><span class="code"> Matcher m = p.matcher(body);</span></div><div class="line"><span class="code"> return m.matches();</span></div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h4 id="3、银行卡校验"><a href="#3、银行卡校验" class="headerlink" title="3、银行卡校验"></a>3、银行卡校验</h4><p>Luhn<br>检验数字算法(Luhn Check Digit Algorithm),也叫做模数10公式,是一种简单的算法,用于验证银行卡、信用卡号码的有效性的算法。对所有大型信用卡公司发行的信用卡都起作用,这些公司包括美国Express、护照、万事达卡、Discover和用餐者俱乐部等。这种算法最初是在20世纪60年代由一组数学家制定,现在Luhn检验数字算法属于大众,任何人都可以使用它。</p>
<p>算法:将每个奇数加倍和使它变为单个的数字,如果必要的话通过减去9和在每个偶数上加上这些值。如果此卡要有效,那么,结果必须是10的倍数。</p>
<p>该校验的过程:<br>1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。<br>2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。<br>3、将奇数位总和加上偶数位总和,结果应该可以被10整除。<br><figure class="highlight markdown"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div></pre></td><td class="code"><pre><div class="line">/**</div><div class="line"><span class="code"> * 校验银行卡卡号</span></div><div class="line"><span class="code"> *</span></div><div class="line"><span class="code"> * @param cardId</span></div><div class="line"><span class="code"> * @return</span></div><div class="line"><span class="code"> */</span></div><div class="line"><span class="code"> public static boolean isBankCard(String cardId)</span></div><div class="line"><span class="code"> &#123;</span></div><div class="line"><span class="code"> char bit = getBankCardCheckCode(cardId.substring(0, cardId.length() - 1));</span></div><div class="line"><span class="code"> if (bit == 'N') &#123;</span></div><div class="line"><span class="code"> return false;</span></div><div class="line"><span class="code"> &#125;</span></div><div class="line"><span class="code"> return cardId.charAt(cardId.length() - 1) == bit;</span></div><div class="line"><span class="code"> &#125;</span></div><div class="line"></div><div class="line"><span class="code"> /**</span></div><div class="line"><span class="code"> * 从不含校验位的银行卡卡号采用 Luhn 校验算法获得校验位</span></div><div class="line"><span class="code"> *</span></div><div class="line"><span class="code"> * @param nonCheckCodeCardId</span></div><div class="line"><span class="code"> * @return</span></div><div class="line"><span class="code"> */</span></div><div class="line"><span class="code"> public static char getBankCardCheckCode(String nonCheckCodeCardId)</span></div><div class="line"><span class="code"> &#123;</span></div><div class="line"><span class="code"> if (nonCheckCodeCardId == null || nonCheckCodeCardId.trim().length() == 0</span></div><div class="line"><span class="code"> || !nonCheckCodeCardId.matches("\\d+")) &#123;</span></div><div class="line"><span class="code"> //如果传的不是数据返回N</span></div><div class="line"><span class="code"> return 'N';</span></div><div class="line"><span class="code"> &#125;</span></div><div class="line"><span class="code"> char[] chs = nonCheckCodeCardId.trim().toCharArray();</span></div><div class="line"><span class="code"> int luhmSum = 0;</span></div><div class="line"><span class="code"> for (int i = chs.length - 1, j = 0; i &gt;= 0; i--, j++) &#123;</span></div><div class="line"><span class="code"> int k = chs[i] - '0';</span></div><div class="line"><span class="code"> if (j % 2 == 0) &#123;</span></div><div class="line"><span class="code"> k *= 2;</span></div><div class="line"><span class="code"> k = k / 10 + k % 10;</span></div><div class="line"><span class="code"> &#125;</span></div><div class="line"><span class="code"> luhmSum += k;</span></div><div class="line"><span class="code"> &#125;</span></div><div class="line"><span class="code"> return (luhmSum % 10 == 0) ? '0' : (char) ((10 - luhmSum % 10) + '0');</span></div><div class="line"><span class="code"> &#125;</span></div></pre></td></tr></table></figure></p>
</content>
<summary type="html">
<p>本文收集了一些常用的验证方法,如手机号码验证、银行卡验证等,以后会不定期的更新<br>
</summary>
<category term="Android" scheme="http://itdais.com/tags/Android/"/>
<category term="工具类" scheme="http://itdais.com/tags/%E5%B7%A5%E5%85%B7%E7%B1%BB/"/>
</entry>
<entry>
<title>Hello World</title>
<link href="http://itdais.com/2016/07/04/hello-world/"/>
<id>http://itdais.com/2016/07/04/hello-world/</id>
<published>2016-07-04T15:05:44.269Z</published>
<updated>2016-07-04T15:05:44.270Z</updated>
<content type="html"><p>Welcome to <a href="https://hexo.io/" target="_blank" rel="external">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="external">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="external">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="external">GitHub</a>.</p>
<h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo new <span class="string">"My New Post"</span></div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="external">Writing</a></p>
<h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo server</div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="external">Server</a></p>
<h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo generate</div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="external">Generating</a></p>
<h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo deploy</div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="external">Deployment</a></p>
</content>
<summary type="html">
<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="external">Hexo</a>! This is your very first post. Check <a href="https://hexo.
</summary>
</entry>
</feed>