-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
1006 lines (952 loc) · 131 KB
/
search.xml
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
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title><![CDATA[自定义View_7_属性动画_2]]></title>
<url>/2017/09/15/%E8%87%AA%E5%AE%9A%E4%B9%89View_7_%E5%B1%9E%E6%80%A7%E5%8A%A8%E7%94%BB_2/</url>
<content type="html"><![CDATA[<h2 id="TypeEvaluator"><a href="#TypeEvaluator" class="headerlink" title="TypeEvaluator"></a>TypeEvaluator</h2><h2 id="ArgbEvaluator"><a href="#ArgbEvaluator" class="headerlink" title="ArgbEvaluator"></a>ArgbEvaluator</h2><h2 id="自定义Evaluator"><a href="#自定义Evaluator" class="headerlink" title="自定义Evaluator"></a>自定义Evaluator</h2><h2 id="PropertyValuesHolder"><a href="#PropertyValuesHolder" class="headerlink" title="PropertyValuesHolder"></a>PropertyValuesHolder</h2><p>PropertyValuesHolder是用来在同一个动画中对不同的属性进行操作.</p>
<pre><code>PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("scaleX", 1);
PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("scaleY", 1);
PropertyValuesHolder holder3 = PropertyValuesHolder.ofFloat("alpha", 1);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(view, holder1, holder2, holder3)
animator.start();
</code></pre><h2 id="AnimatorSet"><a href="#AnimatorSet" class="headerlink" title="AnimatorSet"></a>AnimatorSet</h2><p> 有了AnimatorSet就可以对多个Animator进行统一的规划和管理,让他们按照你想要的顺序工作</p>
<ul>
<li>创建AnimatorSet 对象</li>
<li>AnimatorSet animatorSet = new AnimatorSet();</li>
<li>创建animator</li>
<li>ObjectAnimator animator1 = ObjectAnimator.ofFloat(view, “alpha”, 0, 1);</li>
<li>ObjectAnimator animator2 = ObjectAnimator.ofFloat(view, “translationX”, -200, 200);</li>
<li><p>ObjectAnimator animator3 = ObjectAnimator.ofFloat(view, “rotation”, 0, 1080);</p>
<pre><code> animatorSet.play (animator1).with (animator2); // 一起执行
animatorSet.play (animator1).before (animator2);//先执行后面再执行前面
animatorSet.play (animator1).after (animator2); //先执行前面在执行后面
animatorSet.playTogether(animator2, animator3); // 2 和 3 同时开始
animatorSet.playSequentially (animator2, animator3); // 2 和 3 依次开始
</code></pre></li>
</ul>
<h2 id="PropertyValusHolder-ofKeyFrame"><a href="#PropertyValusHolder-ofKeyFrame" class="headerlink" title="PropertyValusHolder.ofKeyFrame()"></a>PropertyValusHolder.ofKeyFrame()</h2><ul>
<li>创建keyframe对象</li>
<li>Keyframe keyframe1 = Keyframe.ofFloat(0, 0);(时间完成度,动画完成度) </li>
<li>Keyframe keyframe2 = Keyframe.ofFloat(0, 0);(时间完成度,动画完成度)</li>
<li>Keyframe keyframe3 = Keyframe.ofFloat(0, 0);(时间完成度,动画完成度)</li>
<li>PropertyValuesHolder holder = PropertyValuesHolder.ofKeyframe(“progress”, keyframe1, keyframe2, keyframe3);</li>
<li>ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(view, holder);</li>
<li>animator.start(); </li>
</ul>
<h2 id="ValueAnimator"><a href="#ValueAnimator" class="headerlink" title="ValueAnimator"></a>ValueAnimator</h2>]]></content>
</entry>
<entry>
<title><![CDATA[自定义View_6_属性动画_1]]></title>
<url>/2017/09/14/%E8%87%AA%E5%AE%9A%E4%B9%89View_6_%E5%B1%9E%E6%80%A7%E5%8A%A8%E7%94%BB_1/</url>
<content type="html"><![CDATA[<h2 id="ViewPropertyAnimator"><a href="#ViewPropertyAnimator" class="headerlink" title="ViewPropertyAnimator"></a>ViewPropertyAnimator</h2><ul>
<li>常用方法</li>
<li>其中xxBy()方法是带增量的方法</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align:center">view中的方法</th>
<th style="text-align:center">功能</th>
<th style="text-align:center">对应ViewPropertyAnimator中的方法</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">setTranslationX()</td>
<td style="text-align:center">设置X轴偏移</td>
<td style="text-align:center">translationX(),translationXBy()</td>
</tr>
<tr>
<td style="text-align:center">setTranslationY()</td>
<td style="text-align:center">设置Y轴偏移</td>
<td style="text-align:center">translationY(),translationYBy()</td>
</tr>
<tr>
<td style="text-align:center">setTranslationY()</td>
<td style="text-align:center">设置Z轴偏移</td>
<td style="text-align:center">translationZ(),translationZBy()</td>
</tr>
<tr>
<td style="text-align:center">setX()</td>
<td style="text-align:center">设置x轴的绝对位置</td>
<td style="text-align:center">x(),xBy()</td>
</tr>
<tr>
<td style="text-align:center">setY()</td>
<td style="text-align:center">设置Y轴的绝对位置</td>
<td style="text-align:center">y(),yBy()</td>
</tr>
<tr>
<td style="text-align:center">setZ()</td>
<td style="text-align:center">设置Z轴的绝对位置</td>
<td style="text-align:center">z(),zBy()</td>
</tr>
<tr>
<td style="text-align:center">setRotaion()</td>
<td style="text-align:center">设置平面旋转</td>
<td style="text-align:center">rotation(),rotationBy()</td>
</tr>
<tr>
<td style="text-align:center">setRotaionX()</td>
<td style="text-align:center">设置沿X轴旋转</td>
<td style="text-align:center">rotationX(),rotationXBy()</td>
</tr>
<tr>
<td style="text-align:center">setRotaionY()</td>
<td style="text-align:center">设置沿Y轴旋转</td>
<td style="text-align:center">rotationY(),rotationYBy()</td>
</tr>
<tr>
<td style="text-align:center">setScaleX()</td>
<td style="text-align:center">设置横向缩放</td>
<td style="text-align:center">scaleX(),scaleXBy()</td>
</tr>
<tr>
<td style="text-align:center">setScaleY()</td>
<td style="text-align:center">设置纵向缩放</td>
<td style="text-align:center">scaleY(),scaleYBy()</td>
</tr>
<tr>
<td style="text-align:center">setAlpha()</td>
<td style="text-align:center">设置透明度</td>
<td style="text-align:center">alpha(),alphaBy()</td>
</tr>
</tbody>
</table>
<h2 id="ObjcetAnimator"><a href="#ObjcetAnimator" class="headerlink" title="ObjcetAnimator"></a>ObjcetAnimator</h2><ul>
<li>使用方法<ul>
<li>如果是自定义控件,需要添加setter/getter方法</li>
<li>使用ObjectAnimator,ofXXX()创建ObjectAnimator对象</li>
<li>调用start方法执行动画</li>
</ul>
</li>
</ul>
<h2 id="通用功能"><a href="#通用功能" class="headerlink" title="通用功能"></a>通用功能</h2><ul>
<li><p>setDuration(int duration) 设置动画时长,单位毫秒</p>
</li>
<li><p>设置监听器</p>
<ul>
<li>ViewPropertyanimator.setListenrer()/ObjObjectAnimator.addListener()</li>
<li>ViewPropertyanimator.setUpdataListener()/ObObjectAnimator.addUpdateListener()</li>
<li>ViewPropertyanimator.withStartAction()/endAction()</li>
<li>ObjectAnimator.AddPauseListener()</li>
</ul>
</li>
</ul>
<ul>
<li>setInterpolator(Interpolator interpolator) 设置动画的差值器</li>
</ul>
]]></content>
</entry>
<entry>
<title><![CDATA[自定义View_5_绘制顺序]]></title>
<url>/2017/09/13/%E8%87%AA%E5%AE%9A%E4%B9%89View_5_%E7%BB%98%E5%88%B6%E9%A1%BA%E5%BA%8F/</url>
<content type="html"><![CDATA[<h2 id="绘制流程简述"><a href="#绘制流程简述" class="headerlink" title="绘制流程简述"></a>绘制流程简述</h2><pre><code>1.背景
2.主体
3.子View
4.滑动边缘渐变和滑动条
5.前景
一般来说一个View 或 ViewGroup的绘制不会都包含这几项,但是必然逃不出这几项
</code></pre><h2 id="onDraw"><a href="#onDraw" class="headerlink" title="onDraw()"></a>onDraw()</h2><pre><code>写在super.onDraw() 下面
绘制的内容会覆盖之前控件的内容
写在super.onDraw() 上面
绘制的内容会被控件自身的内容覆盖,但是可以绘制纯色背景使用
</code></pre><h2 id="dispatchDraw-绘制子View的方法"><a href="#dispatchDraw-绘制子View的方法" class="headerlink" title="dispatchDraw() (绘制子View的方法)"></a>dispatchDraw() (绘制子View的方法)</h2><ul>
<li>在ViewGroup中如果使用onDraw()绘制的内容,在添加子View之后会覆盖之前的内容,在这里就得使用dispatchDraw()</li>
</ul>
<pre><code>写在super.dispatchDraw() 下面
覆盖在子View之上
写在super.dispatchDraw() 上面
子View覆盖原有内容
</code></pre><h2 id="onDrawForeground"><a href="#onDrawForeground" class="headerlink" title="onDrawForeground()"></a>onDrawForeground()</h2><pre><code>写在super.onDrawForeground() 下面
绘制的内容会盖住前景,滑动边缘渐变,滑动条
写在super.onDrawForeground() 上面
前景,滑动边缘渐变,滑动条会盖住绘制的内容
</code></pre><h2 id="draw"><a href="#draw" class="headerlink" title="draw()"></a>draw()</h2><pre><code>draw() 是一个绘制过程的总调度方法.
写在super.draw(), 上面
之后的内容会把之前的内容覆盖
写在super.draw(), 下面
绘制的内容会把之前的内容覆盖
</code></pre>]]></content>
</entry>
<entry>
<title><![CDATA[自定义View_4_Canvas对绘制的辅助]]></title>
<url>/2017/09/12/%E8%87%AA%E5%AE%9A%E4%B9%89View_4_Canvas%E5%AF%B9%E7%BB%98%E5%88%B6%E7%9A%84%E8%BE%85%E5%8A%A9/</url>
<content type="html"><![CDATA[<h2 id="范围裁切"><a href="#范围裁切" class="headerlink" title="范围裁切"></a>范围裁切</h2><ul>
<li>canvas.clipRect()</li>
<li>canvas.clipPath()</li>
</ul>
<h2 id="几何变换"><a href="#几何变换" class="headerlink" title="几何变换"></a>几何变换</h2><h4 id="使用Canvas-做常见的二维变换"><a href="#使用Canvas-做常见的二维变换" class="headerlink" title="使用Canvas 做常见的二维变换"></a>使用Canvas 做常见的二维变换</h4><ul>
<li>canvas.translate(float dx,float dy) 平移</li>
<li>canvas.rotate(float degrees,float px,float py) 旋转</li>
<li>canvas.scale(float sx,float sy,float px, flaot py) 缩放</li>
<li>canvas.skew(float sx,float sy) 错切</li>
</ul>
<h4 id="使用Matrix-做常见和不常见的二维变换"><a href="#使用Matrix-做常见和不常见的二维变换" class="headerlink" title="使用Matrix 做常见和不常见的二维变换"></a>使用Matrix 做常见和不常见的二维变换</h4><ul>
<li>创建Matrix 对象</li>
<li>调用Matrix的pre/post(Translate/Rotate/Scale/Skew)</li>
<li>使用Canvas.setMatrix(matrix) 或Canvas.concat(matrix) 把几何变换引用到Canvas</li>
<li>matrix.setPolyToPoly() 自定义变换</li>
</ul>
<h4 id="使用Camera-做三维的变换"><a href="#使用Camera-做三维的变换" class="headerlink" title="使用Camera 做三维的变换"></a>使用Camera 做三维的变换</h4><ul>
<li>创建Camera对象</li>
<li>Camera.save() 保存状态</li>
<li>rotate*() 三维旋转</li>
<li>translate(float x,float y,float z) 移动</li>
<li>setLocation(x,y,z) 设置虚拟相机的位置</li>
<li>Camera.restore() 恢复装态</li>
<li>applyToCanvas(canvas) 把变换投影到Canvas</li>
</ul>
]]></content>
</entry>
<entry>
<title><![CDATA[自定义View_3_文字的绘制]]></title>
<url>/2017/09/11/%E8%87%AA%E5%AE%9A%E4%B9%89View_3_%E6%96%87%E5%AD%97%E7%9A%84%E7%BB%98%E5%88%B6/</url>
<content type="html"><![CDATA[<h2 id="绘制文字的方式"><a href="#绘制文字的方式" class="headerlink" title="绘制文字的方式"></a>绘制文字的方式</h2><ul>
<li>drawText()</li>
<li>drawTextRun()</li>
<li>drawTextOnPath()</li>
<li><p>StaticLayout 绘制多行文本,支持自动换行</p>
<p> 使用的是</p>
<pre><code>String text1 = "Lorem Ipsum is simply dummy text of the printing and typesetting industry.";
StaticLayout staticLayout1 = new StaticLayout(text1, paint, 600,
Layout.Alignment.ALIGN_NORMAL, 1, 0, true);
String text2 = "a\nbc\ndefghi\njklm\nnopqrst\nuvwx\nyz";
StaticLayout staticLayout2 = new StaticLayout(text2, paint, 600,
Layout.Alignment.ALIGN_NORMAL, 1, 0, true);
canvas.save();
canvas.translate(50, 100);
staticLayout1.draw(canvas);
canvas.translate(0, 200);
staticLayout2.draw(canvas);
canvas.restore();
</code></pre></li>
</ul>
<h2 id="Paint对文字绘制的辅助"><a href="#Paint对文字绘制的辅助" class="headerlink" title="Paint对文字绘制的辅助"></a>Paint对文字绘制的辅助</h2><h4 id="设置显示效果类"><a href="#设置显示效果类" class="headerlink" title="设置显示效果类"></a>设置显示效果类</h4><ul>
<li>setTextSize() 设置文字大小</li>
<li>setTypeface() 设置字体</li>
<li>setFakeBoldText() 是否使用伪粗体</li>
<li>setStrikeThruText() 是否添加删除线</li>
<li>setUnderlineText() 是否添加下划线</li>
<li>setTextSkewX() 设置文字的倾斜角度</li>
<li>setTextScaleX() 设置文字的宽度</li>
<li>setLetterSpacing() 设置字符间距,默认值为0</li>
<li>setTextAlign() 设置文字的对齐方式</li>
</ul>
<h4 id="测量文字尺寸类"><a href="#测量文字尺寸类" class="headerlink" title="测量文字尺寸类"></a>测量文字尺寸类</h4><ul>
<li>float getFontSpacing() 获取推荐的行距</li>
<li><p>FontMetircs getFontMetircs() 获取测量对象,提供了几个文字排版方面的数值</p>
<pre><code>ascent
ascent的值是负值,因为在baseline的上方
descent
descent的值是正值,因为在baseline的下方
top
bottom
leading
</code></pre></li>
<li><p>getTextBounds(String text,int start,int end,Rect bounds) 获取文字的显示范围</p>
</li>
<li>measureText(String text) 测量文字的宽度</li>
<li>getTextWidths(String text,float[] widths) 获取字符串的每个字符的宽度,并返回widths</li>
</ul>
]]></content>
</entry>
<entry>
<title><![CDATA[lambda表达式]]></title>
<url>/2017/09/01/lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F/</url>
<content type="html"><![CDATA[<h2 id="lambda表达式的基本语法"><a href="#lambda表达式的基本语法" class="headerlink" title="lambda表达式的基本语法"></a>lambda表达式的基本语法</h2><p><strong><br> 参数列表 -> 表达式
</strong></p>
<h2 id="参数列表"><a href="#参数列表" class="headerlink" title="参数列表"></a>参数列表</h2><ul>
<li>如果没有参数,直接使用()表示,() 不能省略</li>
<li>如果只有一个参数,并且写了参数类型,参数外面一定要加()</li>
<li>如果只有一个参数,并且参数不写类型,那么参数外面可以不用加()</li>
<li>如果有两个或多个参数,不管是否写参数类型,都要加上()</li>
<li>如果参数要加修饰符,或者标签,参数一定要加上完整的参数类型</li>
</ul>
<h2 id="表达式"><a href="#表达式" class="headerlink" title="表达式"></a>表达式</h2><ul>
<li>如果表达式只有一行可以直接写,不需要写{}</li>
<li>如果表达式有多行,需要用{}变成代码块</li>
<li>如果表达式是代码块,并且需要返回值,那么在代码块中就必须有一个返回值</li>
<li>如果只有单行的情况,并且方法需要返回值,就不能有return,编译器就会自动帮我们推导出来</li>
</ul>
<h2 id="lambda表达式中的变量"><a href="#lambda表达式中的变量" class="headerlink" title="lambda表达式中的变量"></a>lambda表达式中的变量</h2><ul>
<li>参数</li>
<li>局部变量</li>
<li>自由变量 (不是参数也不是局部变量)</li>
<li>lambda 表达式中的自由变量会被保存,无论什么时候执行lambda,都可以直接使用,但是不可以修改变量的值</li>
<li>操作自由变量的代码块称作为(闭包)</li>
<li>lambda 表达式中的this指向, 产生 lambad表达式的方法中的this</li>
</ul>
<h2 id="函数式接口"><a href="#函数式接口" class="headerlink" title="函数式接口:"></a>函数式接口:</h2><ul>
<li>我们能够写lambda表达式的地方,一个接口,且接口中只有一个抽象方法</li>
<li>在Java中,把只有一个抽象方法的接称为函数式接口,如果一个接口是函数式接口,我们可以再接口上添加@FunctionalInterface标签说明这是一个函数式接口 (作用 1: 检查,2:文档)</li>
<li>无论 是否加@FunctionalInterface ,只要满足函数式接口的接口,Java都会直接识别为函数式接口</li>
<li>简化函数式接口的使用是Java中提供的Lambda表达式唯一的作用</li>
<li>可以用接口来直接引用一个lambda表达式</li>
<li>函数式接口中可以编写Object对象中的方法</li>
<li>lambda表达式中的异常处理:<br>1:直接在代码中try catch<br>2:接口的方法声明中抛出异常</li>
</ul>
<h2 id="方法引用"><a href="#方法引用" class="headerlink" title="方法引用"></a>方法引用</h2><ul>
<li>类:: 静态方法</li>
<li>对象:: 方法</li>
<li>对象:: 静态方法</li>
</ul>
]]></content>
</entry>
<entry>
<title><![CDATA[RxJava - 01]]></title>
<url>/2017/07/20/RxJava-01/</url>
<content type="html"><![CDATA[<h2 id="RxJava-01"><a href="#RxJava-01" class="headerlink" title="RxJava -01"></a>RxJava -01</h2>]]></content>
</entry>
<entry>
<title><![CDATA[自定义View_2_Paint详解]]></title>
<url>/2017/07/18/%E8%87%AA%E5%AE%9A%E4%B9%89View_2_Paint%E8%AF%A6%E8%A7%A3/</url>
<content type="html"><![CDATA[<h2 id="自定义View-2-Paint详解"><a href="#自定义View-2-Paint详解" class="headerlink" title="自定义View_2_Paint详解"></a>自定义View_2_Paint详解</h2><h3 id="颜色"><a href="#颜色" class="headerlink" title="颜色"></a>颜色</h3><ul>
<li>serColor()</li>
<li>setRGB()</li>
<li>setARGB()</li>
<li><p>setShader() 在Android中并不直接使用Shader这个类,而是直接使用它的子类</p>
<ul>
<li>LinearGradient 线性渐变</li>
<li>RadialGradient 辐射渐变</li>
<li>SweepGradient 扫描渐变</li>
<li>BitmapGradient 绘制Bitmap重的像素信息</li>
<li>composeGradient 混合着色器</li>
</ul>
</li>
<li><p>setColorFilter() 也是使用的ColorFilter的子类</p>
<ul>
<li>LigheingColorFilter 模拟简单的光照</li>
<li>PorterDuffColorFilter 使用指定的一种颜色和指定的一种PorterDuff.Mode来和绘制的对象进行合成</li>
<li>ColorMatrixColorFilter 内部使用的是一个4*5的矩阵对绘制的每一个像素进行转换</li>
</ul>
</li>
<li><p>setXfermode() 设置绘制的内容的颜色处理方案 (PorterDuffXfermode)</p>
<ul>
<li>使用注意点<ul>
<li>使用离屏缓冲</li>
<li>使用离屏缓冲可以把绘制的内容单独的绘制缓冲层,Xfermode 就不会出现奇怪的情况</li>
<li>View.setLayerType()</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h3><ul>
<li>setAntiAlias()</li>
<li>setStyle()</li>
<li><p>线条形状</p>
<ul>
<li>setStrokeWidth() 设置线条宽度</li>
<li>setStrokeCap() 设置线头的形状</li>
<li>setStrokeJoin() 设置拐角的形状</li>
<li>setStrokeMiter() 设置Miter型拐角的延长线的最大值</li>
</ul>
</li>
<li><p>色彩优化</p>
<ul>
<li>setDither() 是否开启抖动</li>
<li>setFilterBitmap() 设置是否使用双线性过滤来绘制Bitmap</li>
</ul>
</li>
<li><p>setPathEffect() 使用PathEffect给图形的轮廓设置效果</p>
<ul>
<li>单一效果<ul>
<li>CornerPathEffect 把所有的拐角变成圆角</li>
<li>DiscrerePathEffect 把线条进行随机的偏离</li>
<li>DasHPathEffect 使用虚线绘制线条</li>
<li>PathDashPathEffect 使用Path 绘制虚线</li>
</ul>
</li>
<li>组合效果<ul>
<li>sumPathEffect 两种效果分别对Path进行绘制</li>
<li>compostPathEffect 先使用第一PathEffect绘制,然后在对改变后的Path使用另一个PathEffect绘制</li>
</ul>
</li>
</ul>
</li>
<li><p>setShadowLater() 在绘制内容之下加一层阴影</p>
</li>
<li>setMaskFilter() 在绘制内容之上添加效果<ul>
<li>MaskFilter<ul>
<li>BlurMaskFilter 模糊效果</li>
<li>EmbossMaskFilter 浮雕效果</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="drawText-相关"><a href="#drawText-相关" class="headerlink" title="drawText()相关"></a>drawText()相关</h3><h5 id="初始化"><a href="#初始化" class="headerlink" title="初始化"></a>初始化</h5><ul>
<li>reset() 重置Paint的属性为默认值</li>
<li>set(Paint src) 把src的所有属性都复制过来</li>
<li>setFlags() 批量设置Flags</li>
</ul>
]]></content>
</entry>
<entry>
<title><![CDATA[自定义View_1_绘制基础]]></title>
<url>/2017/07/15/%E8%87%AA%E5%AE%9A%E4%B9%89View_1_%E7%BB%98%E5%88%B6%E5%9F%BA%E7%A1%80/</url>
<content type="html"><![CDATA[<h2 id="自定义View1绘制基础"><a href="#自定义View1绘制基础" class="headerlink" title="自定义View1绘制基础"></a>自定义View<em>1</em>绘制基础</h2><ul>
<li>自定义View的绘制主要是重写绘制的方法 ,其中最长用的就是onDraw()方法</li>
<li>绘制的关键是Canvas的使用<ul>
<li>Canvas的绘制类方法 : drawXXX() 关键参数 Paint</li>
<li>Canvas的辅助类方法 : Canvas的裁切和几何变换</li>
<li>可以使用不同的绘制方法来控制遮盖关系</li>
</ul>
</li>
</ul>
<h2 id="自定义绘制知识的4个级别"><a href="#自定义绘制知识的4个级别" class="headerlink" title="自定义绘制知识的4个级别"></a>自定义绘制知识的4个级别</h2><p>1 Canvas的 drawXXX();</p>
<p>2 Paint;</p>
<p>3 Canvas的裁切和几何变换</p>
<p>4 使用不同的绘制方法控制遮盖关系</p>
<h2 id="Canvas的drawXXX-和-Paint的基本使用"><a href="#Canvas的drawXXX-和-Paint的基本使用" class="headerlink" title="Canvas的drawXXX()和 Paint的基本使用"></a>Canvas的drawXXX()和 Paint的基本使用</h2><pre><code>Canvas.drawColor(@ColorInt int color)
填充颜色
Canvas.drawRGB(int r,int g,int b)
填充颜色
Canvas.drawARGB(int a,int r,int g,int b)
填充颜色
Canvas.drawCircle(float centerX,float centerY,float radius,Paint paint)
画圆 (圆心坐标,半径,paint)
Canvas.drawRect(float left,float top,float right,float bottom,Paint paint)
画矩形 (矩形左上角坐标,矩形右下角坐标,paint)
Canvas.drawPoint(float x,float y,Paint paint)
画点 (坐标,paint)
Canvas.drawPoints(float[] pts,int offset,int count,Paint paint)
画多个点 (坐标数组,开始的组数,绘制的组数,paint)
Canvas.drawOval(float left,float top,float right,float ,bottom,Paint paint)
画椭圆 (椭圆坐标,paint)
Canvas.drawLine(float startX,float startY,float stopX, float stopY,Paint paint)
画线 (开始坐标,结束坐标,paint)
Canvas.drawRoundRect(float left,float top,float right,float bottom,float rx,float ry,Paint paint)
画圆角矩形 (矩形坐标,圆角半径X,,圆角半径Y,paint)
Canvas.drawArc(float left,flaot top,float right,float buttom,float startAngle,float sweepAngle,boolean suerCenter,Paint paint)
画扇形 (扇形所在矩形的坐标,开始角度,绘制的角度,是否连接圆心,paint)
Canvas.drawPath(Path path ,Paint paint)
画Path (path,paint)
Canvas.drawBitmap(Bitmap bitmap ,float left,float top,Paint paint)
画Bitmap (bitmap,绘制的坐标,paint)
Canvas.drawText(String text,float x,float y,Paint paint)
画Text (text,绘制的坐标,paint)
Paint.setColor(@ColorInt int color) //paint color
Paint.setStyle(Paint.style style) //style.FILL(填充) style.STROKE(划线)
Paint.setStrokeWidth(flaot width) //画线的width
Paint.setAntiAlias(Boolean aa) //开关抗锯齿
Paint.setStrokeCap(Paint.Cap cap) //圆点和矩形点
Paint.setTextSize(int textSize) //textSize
</code></pre>]]></content>
</entry>
<entry>
<title><![CDATA[Kotlin-01]]></title>
<url>/2017/07/13/Kotlin-01/</url>
<content type="html"><![CDATA[<h1 id="Kotlin-01"><a href="#Kotlin-01" class="headerlink" title="Kotlin-01"></a>Kotlin-01</h1><h2 id="基本语法和Java的区别"><a href="#基本语法和Java的区别" class="headerlink" title="基本语法和Java的区别"></a>基本语法和Java的区别</h2><h4 id="字段声明"><a href="#字段声明" class="headerlink" title="字段声明"></a>字段声明</h4><pre><code>在java中
private class Person{
privata String name;
private int age;
}
在 kotlin中
cless Person{
val name: String
val age:Int
}
</code></pre><ul>
<li>kotlin不同之处<ul>
<li>没有private ,protected,public 这种权限修饰的关键字,取而代之的是 val(常量) 和 var(变量)修饰符</li>
<li>所有的类型首字母大写</li>
<li>最终的格式(修饰符 变量名 : 类型 =变量的值 ) (没有最后 “;” 符号)</li>
</ul>
</li>
</ul>
<h4 id="继承关系"><a href="#继承关系" class="headerlink" title="继承关系"></a>继承关系</h4><pre><code>在Java中
private class Student extends Person{
private double height;
private int coures;
}
在Kotlin中
首先想要被继承的类要在class 之前加上 open 关键字才可以继承
open cless Person{
val name: String
val age:Int
}
class Student :Persion(){
val height:Double
val coures:Int
}
</code></pre>]]></content>
</entry>
<entry>
<title><![CDATA[FlowLayout]]></title>
<url>/2017/07/11/FlowLayout/</url>
<content type="html"><![CDATA[<h2 id="FlowLayout"><a href="#FlowLayout" class="headerlink" title="FlowLayout"></a>FlowLayout</h2><p>####基本思路</p>
<ul>
<li>使用Line内部类的方式管理每一行中出现的View,当View在当前行放不下的时候换到下一行</li>
<li><p>Line 内部需要控制的参数包括当前行的高度,当前行的最大宽度,当前行的已使用宽度,子View的横向之间的间隔,当前行的View集合</p>
<ul>
<li>addView();添加子View (确定行高,行最大宽度,已使用的宽度)</li>
<li>canAddView();判断View是否可以再当前行内继续添加</li>
<li>layout(); 指定子View的显示位置,循环测量子View(平均分布),每个子View的间隔=view.getMeasureWidth()+space</li>
</ul>
</li>
<li><p>onMeasure();</p>
<ul>
<li>遍历子View,测量子View,添加子View到Line对象中,在讲Linedu对象添加到Lines集合中</li>
<li>测量自己</li>
</ul>
</li>
</ul>
<ul>
<li>onLayout(); <ul>
<li>只负责高度的展示,宽度和子View的位置让Line执行</li>
</ul>
</li>
</ul>
<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></pre></td><td class="code"><pre><div class="line"></div><div class="line"></div><div class="line">public class FlowLayout extends ViewGroup {</div><div class="line"> /**</div><div class="line"> * 存储行的集合,管理行</div><div class="line"> */</div><div class="line"> private List<Line> mLines = new ArrayList<>();</div><div class="line"> /**</div><div class="line"> * 水平和竖直的间距</div><div class="line"> */</div><div class="line"> private float vertical_space;</div><div class="line"> private float horizontal_space;</div><div class="line"></div><div class="line"> // 当前行的指针</div><div class="line"> private Line mCurrentLine;</div><div class="line"></div><div class="line"> // 行的最大宽度,除去边距的宽度</div><div class="line"> private int mMaxWidth;</div><div class="line"></div><div class="line"> public FlowLayout(Context context) {</div><div class="line"> this(context, null);</div><div class="line"> }</div><div class="line"></div><div class="line"> public FlowLayout(Context context, AttributeSet attrs) {</div><div class="line"> super(context, attrs);</div><div class="line"></div><div class="line"> // 获取自定义属性</div><div class="line"> TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.FlowLayout);</div><div class="line"> horizontal_space = array.getDimension(R.styleable.FlowLayout_width_space,0);</div><div class="line"> vertical_space = array.getDimension(R.styleable.FlowLayout_height_space,0);</div><div class="line"> array.recycle();</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> @Override</div><div class="line"> protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {</div><div class="line"> // 每次测量之前都先清空集合,不让会覆盖掉以前</div><div class="line"> mLines.clear();</div><div class="line"> mCurrentLine = null;</div><div class="line"></div><div class="line"> // 获取总宽度</div><div class="line"> int width = MeasureSpec.getSize(widthMeasureSpec);</div><div class="line"> // 计算最大的宽度</div><div class="line"> mMaxWidth = width - getPaddingLeft() - getPaddingRight();</div><div class="line"></div><div class="line"> // ******************** 测量孩子 ********************</div><div class="line"> // 遍历获取孩子</div><div class="line"> int childCount = this.getChildCount();</div><div class="line"> for (int i = 0; i < childCount; i++) {</div><div class="line"> View childView = getChildAt(i);</div><div class="line"> // 测量孩子</div><div class="line"> measureChild(childView, widthMeasureSpec, heightMeasureSpec);</div><div class="line"></div><div class="line"> // 测量完需要将孩子添加到管理行的孩子的集合中,将行添加到管理行的集合中</div><div class="line"></div><div class="line"> if (mCurrentLine == null) {</div><div class="line"> // 初次添加第一个孩子的时候</div><div class="line"> mCurrentLine = new Line(mMaxWidth, horizontal_space);</div><div class="line"> // 添加孩子</div><div class="line"> mCurrentLine.addView(childView);</div><div class="line"> // 添加行</div><div class="line"> mLines.add(mCurrentLine);</div><div class="line"></div><div class="line"> } else {</div><div class="line"> // 行中有孩子的时候,判断时候能添加</div><div class="line"> if (mCurrentLine.canAddView(childView)) {</div><div class="line"> // 继续往该行里添加</div><div class="line"> mCurrentLine.addView(childView);</div><div class="line"> } else {</div><div class="line"> // 添加到下一行</div><div class="line"> mCurrentLine = new Line(mMaxWidth, horizontal_space);</div><div class="line"> mCurrentLine.addView(childView);</div><div class="line"> mLines.add(mCurrentLine);</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> // ******************** 测量自己 *********************</div><div class="line"> // 测量自己只需要计算高度,宽度肯定会被填充满的</div><div class="line"> int height = getPaddingTop() + getPaddingBottom();</div><div class="line"> for (int i = 0; i < mLines.size(); i++) {</div><div class="line"> // 所有行的高度</div><div class="line"> height += mLines.get(i).height;</div><div class="line"> }</div><div class="line"> // 所有竖直的间距</div><div class="line"> height += (mLines.size() - 1) * vertical_space;</div><div class="line"></div><div class="line"> // 测量</div><div class="line"> setMeasuredDimension(width, height);</div><div class="line"> }</div><div class="line"></div><div class="line"> @Override</div><div class="line"> protected void onLayout(boolean changed, int l, int t, int r, int b) {</div><div class="line"> // 这里只负责高度的位置,具体的宽度和子孩子的位置让具体的行去管理</div><div class="line"> l = getPaddingLeft();</div><div class="line"> t = getPaddingTop();</div><div class="line"> for (int i = 0; i < mLines.size(); i++) {</div><div class="line"> // 获取行</div><div class="line"> Line line = mLines.get(i);</div><div class="line"> // 管理</div><div class="line"> line.layout(t, l);</div><div class="line"></div><div class="line"> // 更新高度</div><div class="line"> t += line.height;</div><div class="line"> if (i != mLines.size() - 1) {</div><div class="line"> // 不是最后一条就添加间距</div><div class="line"> t += vertical_space;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> /**</div><div class="line"> * 内部类,行管理器,管理每一行的孩子</div><div class="line"> */</div><div class="line"> public class Line {</div><div class="line"> // 定义一个行的集合来存放子View</div><div class="line"> private List<View> views = new ArrayList<>();</div><div class="line"> // 行的最大宽度</div><div class="line"> private int maxWidth;</div><div class="line"> // 行中已经使用的宽度</div><div class="line"> private int usedWidth;</div><div class="line"> // 行的高度</div><div class="line"> private int height;</div><div class="line"> // 孩子之间的距离</div><div class="line"> private float space;</div><div class="line"></div><div class="line"> // 通过构造初始化最大宽度和边距</div><div class="line"> public Line(int maxWidth, float horizontalSpace) {</div><div class="line"> this.maxWidth = maxWidth;</div><div class="line"> this.space = horizontalSpace;</div><div class="line"> }</div><div class="line"></div><div class="line"> /**</div><div class="line"> * 往集合里添加孩子</div><div class="line"> */</div><div class="line"> public void addView(View view) {</div><div class="line"> int childWidth = view.getMeasuredWidth();</div><div class="line"> int childHeight = view.getMeasuredHeight();</div><div class="line"></div><div class="line"> // 更新行的使用宽度和高度</div><div class="line"> if (views.size() == 0) {</div><div class="line"> // 集合里没有孩子的时候</div><div class="line"> if (childWidth > maxWidth) {</div><div class="line"> usedWidth = maxWidth;</div><div class="line"> height = childHeight;</div><div class="line"> } else {</div><div class="line"> usedWidth = childWidth;</div><div class="line"> height = childHeight;</div><div class="line"> }</div><div class="line"> } else {</div><div class="line"> usedWidth += childWidth + space;</div><div class="line"> height = childHeight > height ? childHeight : height;</div><div class="line"> }</div><div class="line"></div><div class="line"> // 添加孩子到集合</div><div class="line"> views.add(view);</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> /**</div><div class="line"> * 判断当前的行是否能添加孩子</div><div class="line"> *</div><div class="line"> * @return</div><div class="line"> */</div><div class="line"> public boolean canAddView(View view) {</div><div class="line"> // 集合里没有数据可以添加</div><div class="line"> if (views.size() == 0) {</div><div class="line"> return true;</div><div class="line"> }</div><div class="line"></div><div class="line"> // 最后一个孩子的宽度大于剩余宽度就不添加</div><div class="line"> if (view.getMeasuredWidth() > (maxWidth - usedWidth - space)) {</div><div class="line"> return false;</div><div class="line"> }</div><div class="line"></div><div class="line"> // 默认可以添加</div><div class="line"> return true;</div><div class="line"> }</div><div class="line"></div><div class="line"> /**</div><div class="line"> * 指定孩子显示的位置</div><div class="line"> *</div><div class="line"> * @param t</div><div class="line"> * @param l</div><div class="line"> */</div><div class="line"> public void layout(int t, int l) {</div><div class="line"> // 平分剩下的空间</div><div class="line"> int avg = (maxWidth - usedWidth) / views.size();</div><div class="line"></div><div class="line"> // 循环指定孩子位置</div><div class="line"> for (View view : views) {</div><div class="line"> // 获取宽高</div><div class="line"> int measuredWidth = view.getMeasuredWidth();</div><div class="line"> int measuredHeight = view.getMeasuredHeight();</div><div class="line"> // 重新测量</div><div class="line"> view.measure(MeasureSpec.makeMeasureSpec(measuredWidth + avg, MeasureSpec.EXACTLY),</div><div class="line"> MeasureSpec.makeMeasureSpec(measuredHeight, MeasureSpec.EXACTLY));</div><div class="line"> // 重新获取宽度值</div><div class="line"> measuredWidth = view.getMeasuredWidth();</div><div class="line"></div><div class="line"> int top = t;</div><div class="line"> int left = l;</div><div class="line"> int right = measuredWidth + left;</div><div class="line"> int bottom = measuredHeight + top;</div><div class="line"> // 指定位置</div><div class="line"> view.layout(left, top, right, bottom);</div><div class="line"></div><div class="line"> // 更新数据</div><div class="line"> l += measuredWidth + space;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
]]></content>
</entry>
<entry>
<title><![CDATA[全局大喇叭 --- 广播详解]]></title>
<url>/2017/03/08/%E5%85%A8%E5%B1%80%E5%A4%A7%E5%96%87%E5%8F%AD-%E5%B9%BF%E6%92%AD%E8%AF%A6%E8%A7%A3/</url>
<content type="html"><![CDATA[<h4 id="广播接收"><a href="#广播接收" class="headerlink" title="广播接收"></a>广播接收</h4><p><img src="http://upload-images.jianshu.io/upload_images/1747785-f5cde23a83fee62a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="img"><br><img src="http://upload-images.jianshu.io/upload_images/1747785-a9134c95974ad0f6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="img"></p>
<ul>
<li>动态注册 <ul>
<li>创建一个类继承与BroadcastReceiver ,重写onReceiver()方法</li>
<li>在想要接收广播的地方注册广播,并销毁广播</li>
<li>只有在Action和在IntetnFilter对象中添加的Action的值完全吻合的时候才会促发广播接收者的onReceiver()方法</li>
<li>动态注册依赖与App的某一组件,只有的当那个组件启动的时候才会注册广播,所以说有一定的局限性</li>
</ul>
</li>
</ul>
<p><img src="http://upload-images.jianshu.io/upload_images/1747785-5e497fe427422cf7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="img"></p>
<ul>
<li>静态注册<ul>
<li>静态注册是以xml的形式注册到manifest.xml 文件中</li>
<li>并在该Receiver中添加IntentFilter的各种参数,比如上图中的开机广播</li>
</ul>
</li>
</ul>
<h4 id="自定义广播"><a href="#自定义广播" class="headerlink" title="自定义广播"></a>自定义广播</h4><p><img src="http://upload-images.jianshu.io/upload_images/1747785-3afe92f14d16ccaf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="img"><br><img src="http://upload-images.jianshu.io/upload_images/1747785-2f1f6ee588acfe48.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="img"></p>
<ul>
<li>创建广播接收器 </li>
<li>创建自定义的action</li>
<li>创建Intent intent=new Intent(“自定义action”)</li>
<li>在调用Context的sendBroadcast(intent)</li>
<li><p>通过这种方式创建的自定义广播是标准的广播,也就是说当广播接收器接收到广播的时机不分先后,而且都会收到</p>
</li>
<li><p>发送有序广播</p>
<ul>
<li>将发送广播的sendBroadcast()方法替换为sendOrderedBroadcast(intent ,null);</li>
<li>当发送有序广播时候,就可以在广播接收器中设置官博接收器的优先级,和调用abortBroadcast()来拦截广播</li>
</ul>
</li>
</ul>
<h4 id="使用本地广播"><a href="#使用本地广播" class="headerlink" title="使用本地广播"></a>使用本地广播</h4><p><img src="http://upload-images.jianshu.io/upload_images/1747785-7fab1cf4c60a2b1d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="img"></p>
<ul>
<li>使用本地广播可以有效的避免安全问题,使用本地广播发送出的广播,只有在本应用内才能收到</li>
<li>只需要将通过LocaBroadcastManager.getInstance()获取一个LocalBroadcast的实例,</li>
<li>以后不管是发送广播还是注册广播接收器都使用该实例对象,就可使用本地广播</li>
</ul>
<h4 id="广播的最佳实践"><a href="#广播的最佳实践" class="headerlink" title="广播的最佳实践"></a>广播的最佳实践</h4><ul>
<li><p>实现强制下线功能</p>
</li>
<li><p>分析: 不管在任何界面都要实现随时的下线功能,不可能所有的类中都要重新注册广播接收器,所以最好的方法就是在定义在基类中</p>
</li>
<li>强制下线相当与是关闭所有界面,即Activity,所以也在基类中创建一个Activity的管理类在要下线的时候一次性关闭所有的Activity</li>
<li>要想在界面上弹出一个Dialog,就只能是动态注册广播</li>
<li>因为要保证只有处于栈顶的Activity才能接收到这条强制下线的广播,所以在基类的onResume()注册广播,在onPause()中取消注册</li>
</ul>
]]></content>
</entry>
<entry>
<title><![CDATA[Android 数据持久化]]></title>
<url>/2017/03/06/Android-%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/</url>
<content type="html"><![CDATA[<h2 id="Android-数据持久化"><a href="#Android-数据持久化" class="headerlink" title="Android 数据持久化"></a>Android 数据持久化</h2><p>@第一行代码</p>
<h4 id="数据持久化简介"><a href="#数据持久化简介" class="headerlink" title="数据持久化简介"></a>数据持久化简介</h4><ul>
<li>数据持久化就是就将手机或是电脑中的临时数据(瞬时数据)保存到存储设备中,即使设备断电,或者关机的情况下,这些数据任然不会丢失.</li>
</ul>
<h4 id="文件"><a href="#文件" class="headerlink" title="文件"></a>文件</h4><ul>
<li>文件存储是数据持久化的最基本的一种数据存储方式,,他不对存储的内容进行任何格式化处理.所有的数据都是原封不动的保存到文件中,适合存储一些简单的文本数据和二进制数据.</li>
</ul>
<ul>
<li>文件读写<ul>
<li>write</li>
<li><img src="http://om4pdatog.bkt.clouddn.com/File_save.png" alt="img"><ul>
<li>首先根据Context类中的一个openFileOutput()方法,把要保存的的数据存到文件中,参数一是文件名,参数二是文件的操作模式</li>
<li>主要有两种操作模式,MODE_PRICATE 和 MODE_APPEND,</li>
<li>其中MODE_PRICATE 是默认的操作模式, 表示文件名存在的时候就会覆盖之前存储的数据</li>
<li>MODE_APPEND 表示文件存在的时候就会,继续往该文件中追加内容</li>
<li>openFileOutput()会返回一个FileOutputStream 对象,剩下的就是JAVA对流的操作将数据写到文件中</li>
<li>保存好的文件默认会保存在data/data/包名/files/目录中</li>
</ul>
</li>
<li>read</li>
<li><img src="http://om4pdatog.bkt.clouddn.com/File_read.png" alt="img"></li>
</ul>
</li>
</ul>
<h4 id="SharedPreferences"><a href="#SharedPreferences" class="headerlink" title="SharedPreferences"></a>SharedPreferences</h4><ul>
<li><p>不同于文件存储,SharedPreferences 保存的数据使用的键值对的形式.也就是说在保存一条数据的时候就要为这条数据添加一个Key,在获取这条数据的时候也是根据这个key来获取值,而且SharedPreferences 还支持不同的数据类型,保存为int类型,取出来的就是int类型,保存为String类型,取出来的时候就是Stirng类型</p>
</li>
<li><p>获取SharedPreferences 实例</p>
<ul>
<li>Context 类中的getSharedPreferences(),第一个参数是SharedPreferences的文件名,参数二是操作模式,目前只有MODE_PRICATE 这一种模式可选</li>
<li>Activity类中的getPreferences(),只有一个参数,操作模式,获取的SharedPreferences文件名为当前活动的类名.</li>
<li>PreferencesManager 类中的getDefaultSharedPreferences() ,这时一个静态方法,接收一个Context参数,并自动使用当前的包名前缀来命名SharedPreferences文件</li>
</ul>
</li>
<li><p>在获取SharedPreferences 对象之后就可以向SharedPreferences 来提交数据了,提交数据一般有三个步骤</p>
<ul>
<li>调用SharedPreferences 的Edit(),获取SharedPreferences.Editor对象</li>
<li>向SharedPrefercens.Editor 对象添加数据 edit.putString();</li>
<li>将数据提交 edit.apply();</li>
</ul>
</li>
<li><p>ShreadPreferences 保存的文件默认会在data/data/包名/shared_prefs/目录下</p>
</li>
</ul>
<h4 id="SQLite"><a href="#SQLite" class="headerlink" title="SQLite"></a>SQLite</h4><ul>
<li>创建数据库<ul>
<li>创建类集成SQLiteOpenHelper,重写onCreate()和onUpgrade()</li>
<li>构造方法的四个参数 ,参数一为Context,参数二为数据库名称,第三个参数为自定义的Cursor对象,在这里一般传入null,参数四为当前数据的版本,都是整数,一般开始都为1</li>
<li>在onCreate() 通过SQLiteDatabase 对象调用execSQL(“这里传入建表的SQL语句”)</li>
<li>在创建数据库的时候一般是通过获取SQLiteOpenHelper对象,然后掉用getReadableDatabse()就会执行创建数据库的操作</li>
<li>如果在创建数据库的时候检测到数据库已经存在就不会再执行创建数据库的操作</li>
</ul>
</li>
<li>升级数据库<ul>
<li>在升级数据在数据库的版本上要+1;当出现无法创建数据库的时候可以在onUpgrade()方法中执行</li>
<li>先将之前的数据库删掉; db.execSQL(“ drop table id exists TBALE_NAME”)</li>
<li>然后再次调用onCreate() 创建数据库</li>
</ul>
</li>
<li><p>添加数据</p>
<ul>
<li>在SQLite 中执行CRUD 的操作都是在SQLiteDatabase 对象的基础上操作的</li>
<li>添加是调用SQLiteDatabase 对象的 insert(),这里有三个参数</li>
<li>参数一是:表名,参数二是:在未指定添加数据情况下给某些可能为空的列自动赋值null,一般我们用不到,在这里一般传入NULL,参数三是ContentValue对象,他通过一系列重载的方法,可以传入不同类型的数据</li>
</ul>
</li>
<li><p>更新数据</p>
<ul>
<li>SQLiteDatabase 对象调用update() </li>
<li>参数一:表名 参数二:ContentValue对象,参数三和参数四用于约束某一行或者某几行中的数据,不指定的话就是默认更新所有行</li>
</ul>
</li>
<li><p>删除数据</p>
<ul>
<li>SQLiteDatabase 对象调用delete()</li>
<li>三个参数;参数一是表名,参数二和参数三还是用于约束</li>
</ul>
</li>
<li>查询数据<ul>
<li>SQLiteDatabase 对象调用query() ,这个方法有最少的也是有七个参数</li>
<li>参数一: 固定不变还是表名 </li>
<li>参数二: 查询列名</li>
<li>参数三: 约束条件</li>
<li>参数四: 占位符对应的值</li>
<li>参数五: 需要排序的列</li>
<li>参数六: 排序约束</li>
<li>参数七: 制定查询结果的排序</li>
<li>不指定参数默认查询所有数据</li>
</ul>
</li>
<li>使用传统的SQL操作数据库<ul>
<li>添加,删除,修改 execSQL(“SQL”)</li>
<li>查询 , rawQuery(“SQL”)</li>
</ul>
</li>
</ul>
<h4 id="使用开源项目-LitePal"><a href="#使用开源项目-LitePal" class="headerlink" title="使用开源项目 LitePal"></a>使用开源项目 LitePal</h4><ul>
<li>LItePal简介<ul>
<li>LItePal 是一个开源的Android数据库框架,它采用的是对象关系映射(ORM)的模式,它将我们平时开发用到的一些常用功能进行了封装,不用编写一行SQL语句就可以完成建表和各种增删改查的操作.</li>
</ul>
</li>
<li>配置LitePal<ul>
<li>添加依赖 comple ‘org.litepal.android:core:1.4.1’</li>
<li>在main文件夹下创建 asstes 文件夹, 并创建litepal.xml 文件夹<ul>
<li><img src="http://om4pdatog.bkt.clouddn.com/litepal.png" alt="img"> </li>
<li>dbname 表示数据库的名称</li>
<li>version 表示数据库版本</li>
<li>list 表示用于指定所有的映射模型</li>
</ul>
</li>
<li>manifest.xml 配置application 节点 name属性值为 org.litepal.LitePalApplication</li>
</ul>
</li>
</ul>
<ul>
<li>创建和升级数据库<ul>
<li>创建一个Javabean 类,把这个类的完整类名添加到litepal.xml 中的lsit 标签中的 <mapping> </li>
<li>创建数据的时候只需要调用 <code>LitePal.getDatabase();</code> 就可已完成数据的创建.</li>
<li>升级数据库 只需要修改两个地方<ul>
<li>第一在litepal.xml 修改你的数据库版本号</li>
<li>第二,如果有新建的bean类,还需要把它的全名添加到litepal.xml 文件的list 标签中.</li>
</ul>
</li>
</ul>
</li>
<li>添加数据<ul>
<li>添加数据的方法和在Java中对对象的操作是一样的</li>
<li>创建Bean 类对象</li>
<li>调用对象的set…()方法</li>
<li>在完成数据的添加之后调用对象save() 方法 就可以完成添加数据的操作 </li>
</ul>
</li>
<li>更新数据<ul>
<li>对已经存储的对象操作<ul>
<li>对与已经存在的对象进行操作 可以直接对象调用set方法,然后调用save()</li>
</ul>
</li>
<li>如果当前对象是第一次创建的话可以使用 updateAll() 方法进行跟新数据,方法内的参数也是用于条件约束的,但是此方法不可以为参数设置默认值,如果为参数设置默认值,那么litepal 是不会对这个参数进行更新操作</li>
<li>对于想要设置默认参数的操作LitePal 提供了一个setToDefaule()方法 只要在方法内传入想要修改的字段名(列名)就可以</li>
</ul>
</li>
<li>删除数据<ul>
<li>通过DataSupport.deleteAll()方法</li>
<li>第一个参数表示要删出哪一张表的的数据 ,参数的值类的字节码对象</li>
<li>后面两个参数表示指定的约束条件</li>
</ul>
</li>
<li>查询数据<ul>
<li>使用DataSupport.findAll(), 只需要输入要查询的类的字节码即可查询这个表中的所有数据</li>
<li>查询第一条 DataSupport.findFirst()</li>
<li>查询最后一条 DataSuppprt.findLast();</li>
<li>也可以使用连缀查询<ul>
<li>DataSupport.select(“name”,”author”).find(Book.class); 查询book表中name和author的这两列的数据</li>
<li>DataSupport.where(“pages>?”, 100).fins(“Book.class”); 查询book表中页数大于400的数据</li>
<li>DataSupport.order(“price desc”).find(“Book.class”); 查询Book表所有的数据,并按照书价从高到低排序</li>
<li>DataSupport.limit(3).find(“Book.class”); 查询表中的前三条数据</li>
<li>DataSupport.limit(3).offset(1).find(“Book.class”);查询表中的2.3.4条数据 offset 用于设置偏移量</li>
<li>DataSupport.select(“”name,”price”,”pages”).where(“pages>?”,100).order(“pages”).limit(10).offset(10).find(“Book.class”);这条徒具表示的是查询Book表中第10-20条满足pages大于100这个条件的name,price,pages三列的数据,并将最后的数据按照pages升序排列</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></content>
</entry>
<entry>
<title><![CDATA[Android中引入百分比布局]]></title>
<url>/2017/03/03/Android%E4%B8%AD%E5%BC%95%E5%85%A5%E7%99%BE%E5%88%86%E6%AF%94%E5%B8%83%E5%B1%80/</url>
<content type="html"><![CDATA[<h2 id="Android-中引入百分比布局"><a href="#Android-中引入百分比布局" class="headerlink" title="Android 中引入百分比布局"></a>Android 中引入百分比布局</h2><ul>
<li>一直以来,由于Android设备的多样性,要想达到在不同设备上尽可能的显示相同的效果.屏幕适配也是开发者不得考虑的一件事</li>
<li>在以前适配的方案无非是 <ul>
<li>禁用绝对布局</li>
<li>使用相对布局</li>
<li>使用线性布局,使用权重属性</li>
<li>在者就是根据不同分辨率创建不同的dimens文件</li>
<li>针对图片适配的话尽可能的使用.9图</li>
</ul>
</li>
<li>现在Android引入了一中全新的布局方式来解决这个问题—百分比布局,这种布局不再使用以前warp-content,mtach-parent这种方式来指定控件的大小,而是可以直接指定控件在布局中所占的百分比,这样的话就可以实现平分布局或者是任意比例分割布局的效果了.</li>
<li>由于LinearLayout 已经支持按比例分布控件,所以百分比布局只为FramLayout和RelativeLayout这两个控件进行了拓展,提供了PercentFramlayout 和PercentRelativeLayout</li>
<li>由于百分比布局是新增布局,所以在使用的时候需要先在build.gradle添加 百分比布局的依赖,他就在support包下</li>
</ul>
<pre><code><figure class="highlight plain"><figcaption><span>'com.android.support:percent:24.2.1' </span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"> </div></pre></td></tr></table></figure>
</code></pre><ul>
<li>在使用的时候就和平常的布局一样,在他布局被的控件就可以使用layout_widthPercent layout_heightPercent 这来两个属性开控制控件在布局中所占的百分比了</li>
</ul>
<p> <img src="http://om4pdatog.bkt.clouddn.com/PercentRelativelayout.png" alt="img"><br> <img src="http://om4pdatog.bkt.clouddn.com/PercentRelativeLayout_View.png" alt="img"></p>
]]></content>
</entry>
<entry>
<title><![CDATA[探究Activity]]></title>
<url>/2017/03/02/%E6%8E%A2%E7%A9%B6Activity/</url>
<content type="html"><![CDATA[<h2 id="探究Activity"><a href="#探究Activity" class="headerlink" title="探究Activity"></a>探究Activity</h2><h4 id="Activity的基本使用"><a href="#Activity的基本使用" class="headerlink" title="Activity的基本使用"></a>Activity的基本使用</h4><ul>
<li>1.手动创建Activity<ul>
<li>自定义class继承 appCompatActivity或是其他Activity类</li>
<li>通过setContentView(“布局”)为Activity添加布局文件</li>
<li>在AndroidManifest.xml 注册改 Activity</li>
</ul>
</li>
<li>2.在Activity中使用Toast<ul>
<li>Toast.makeText(“上下文,Context的子类”,”显示的字符串”,Toast.LENGTH_SHORT).show(); </li>
</ul>
</li>
<li>3.在Activity中使用Menu<ul>
<li>创建item菜单</li>
<li>在Activity中重写onCreateOptionsMenu(Menu menu),加载资源文件到menu上,当返回值为true 的时候 menu 才会显示 </li>
</ul>
</li>
<li>4.销毁Activity<ul>
<li>Activity中调用 finish() 销毁当前的Activity </li>
</ul>
</li>
</ul>
<h4 id="Intent的使用"><a href="#Intent的使用" class="headerlink" title="Intent的使用"></a>Intent的使用</h4><ul>
<li>显式Intent<ul>
<li>显式Intent ,顾名思义 是指确切的知道将要打开的Activity,</li>
<li>使用方式,new Intent(Context, NextActivity.class); </li>
</ul>
</li>
<li>隐式Intent<ul>
<li>隐式Intent ,是指在没有确定知道要跳转的Activity,使用了一系列的action,category,由系统去分析这个Intent,找到合适的Activity并启动</li>
<li>在activtiy指定了action 或是categroy 时,启动Activity的Intent必须都与该Activity参数都一一对应时候才会启动该Activity</li>
<li>category 的默认参数一般不用写,也可以启动</li>
<li>比如启动系统浏览器打开百度<ul>
<li>Intent intent=new Intent(Intent.ACTION.VIEW);</li>
<li>intetn.setData(Uri.parse(“<a href="http://www.baidu.com" target="_blank" rel="external">http://www.baidu.com</a>“))</li>
<li>staetActivity(intent);</li>
</ul>
</li>
<li>比如启动打电话<ul>
<li>Intent intent=new Intent(Intent.ACTION.DLAL);</li>
<li>intent.setData(Uri.parse(“tel:10086”));</li>
<li>startActivity(intent); </li>
</ul>
</li>
</ul>
</li>
<li>向下一个Activity传递参数<ul>
<li>传递参数可使用intent.putExtra(“KEY”,”value”)</li>
<li>该方法重载,可以传递多种数据类型</li>
<li>可以使用传递Bundle对象</li>
<li>要想传递其他的对象类型的参数的时候,该类必须实现Serializable 或者 Parcelable</li>
<li>在启动的Activity 中通过 getIntent() 获取Intent对象<ul>
<li>在通过intent对象,获取传递过来的参数,比如传递额String类型的参数,就通过intent.getStringExtra(“KEY”)</li>
<li>传递的整数,就通过intent.getIntExtra(“KEY”); </li>
</ul>
</li>
</ul>
</li>
<li>返回数据给上一个Activity<ul>
<li>在返回给上一个Activity参数中用到的是一个requesCode 和一个 resultCode</li>
<li>requestCode用于标记是从哪个Activiyt启动的</li>
<li>resultCode用于标记是从哪个Activity返回的</li>
<li>在需要返回个上一个Activty数据这种情况的时候,启动Activity的方式就不是原来的startActivity(intent)了</li>
<li>具体使用<ul>
<li>ActivityOne startActivitForResutl(intent,requestCode) requestCode 随意指定,但一定要唯一</li>
<li>ActivityTwo setResult( resultCode ,intent); finish; resultCode 随意指定,但一定要唯一</li>
<li>当ActivityTwo 销毁的时候就会调用ActivityOne 中的onActivityResult(int requestCode,int resultCode,Intent data)</li>
<li>在判断requestCode 和 resultCode 都准确无误的情况下,就可以使用date.getStringExtra(“KEY”),获取返回的数据</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="Activity-的生命周期"><a href="#Activity-的生命周期" class="headerlink" title="Activity 的生命周期"></a>Activity 的生命周期</h4><ul>
<li>完整的生命周期<ul>
<li>onCreate() > onStart() > onResume > onPause() > onStop() > onDestroy()</li>
<li>onRestatrt();</li>
</ul>
</li>
<li>不同状态下的方法回调<ul>
<li>启动ActivityOne onCreate() > onStart() > onResume();</li>
<li>在ActivityOne 中启动 ActivityTwo ActivityOne 中会调用 onPause() > onStop() </li>
<li>从ActivityTwo 中返回 ActivityOne ActivityOne中会调用onRestart() > onStart() > onResume();</li>
<li>在ActivtiyOne中按下返回键时 ActivityOne 中会调用onPause() > onStop() > onDestroy();</li>
<li>如果在新打开的Activity没有完全的遮挡住下面的Activity的时候, 下面的Activity只会回调 onPause(),还是属于可见的状态,再次返回的时候也只是会回调onResume()</li>
</ul>
</li>
<li>Activity的被销毁时的数据存储<ul>
<li>当手机的内存不足的情况下,会销毁处于停止状态的Activity.为了优化用户体验, 所以这时数据的保存就显得尤为重要.</li>
<li>在Activity销毁的时候必然会调用onSaveInstaceState(Bundle outState),可以通过bundle 以键值对的形式传递参数,</li>
<li>当Activity再次重新创建的时候调用的onCreate(Bundle onSaveInstaceState) 取出Bundle所携带的参数</li>
<li>因为第一次创建Activity的时候没有返回的参数,所以要在这里判断Bundle是否为null之后在进行下一步操作</li>
</ul>
</li>
</ul>
<h4 id="Activity-的启动模式"><a href="#Activity-的启动模式" class="headerlink" title="Activity 的启动模式"></a>Activity 的启动模式</h4><ul>
<li>standard 每一Activity 默认的启动模式,是以先进后出的结构进行,每次打开一个新的Activity都会重新创建</li>
<li>singleTop 单栈顶模式,在启动一个Activity时候判断是否在栈顶,如果不再栈顶,就会重新创建一个新的Activity实例,如果在栈顶,就会复用该栈顶的Activity 实例.</li>
<li>singleTask 单任务栈模式, 再打开一个新的Activity的时候会判断该Activity是否在该任务栈存在,如果存在,就选择复用,不存在就会新创建一个Activity的实例</li>
<li>singleInstance 单独的返回栈管理一个Activity </li>
</ul>
<h4 id="Activity-的最佳实践"><a href="#Activity-的最佳实践" class="headerlink" title="Activity 的最佳实践"></a>Activity 的最佳实践</h4><ul>
<li>知晓当前在那个Activity<ul>
<li>创建BaseActivity 在onCreate()中调用getClass().getSimpleName(), 让所有的Activity都继承BaseActivity</li>
</ul>
</li>
<li>安全的退出Activity<ul>
<li>创建ActivtiController . 添加addActivity(Activity activity) 并在BaseActivity 的onCreate() 中调用</li>
<li>添加removeActivity(Activity activity) 在BaseActivity的onDestroy()中调用</li>
<li>创建finishAllActivity() 在需要关闭所有Activity的地方调用即可</li>
</ul>
</li>
<li>启动Activity的最佳写法<ul>
<li>将打开Activity所需要用到的参数,以方法的形式封装,只把需要用到的参数对外暴露,简单,明了</li>
</ul>
</li>
</ul>
]]></content>
</entry>
<entry>
<title><![CDATA[Android menu 使用]]></title>
<url>/2017/03/01/Android%20menu%20%E4%BD%BF%E7%94%A8/</url>
<content type="html"><![CDATA[<h2 id="Android-menu-使用"><a href="#Android-menu-使用" class="headerlink" title="Android menu 使用"></a>Android menu 使用</h2><h4 id="使用步骤"><a href="#使用步骤" class="headerlink" title="使用步骤"></a>使用步骤</h4><h4 id="创建菜单项"><a href="#创建菜单项" class="headerlink" title="创建菜单项"></a>创建菜单项</h4><p><img src="http://om4pdatog.bkt.clouddn.com/menu_path.png" alt="img"><br><img src="http://om4pdatog.bkt.clouddn.com/menu_item.png" alt="img"></p>
<p>1.在res文件夹下创建menu文件夹,用与存放xml文件,然后在menu 文件夹中创建menu.xml文件,编写menu文件<br> 2.menu.xml , 一个item就表示一个菜单项,每一个item 必不可少的就是id(唯一标识服)和title(item 名称)</p>
<h4 id="重写onCreateOptionsMenu-Menu-menu-创建菜单"><a href="#重写onCreateOptionsMenu-Menu-menu-创建菜单" class="headerlink" title="重写onCreateOptionsMenu(Menu menu) 创建菜单"></a>重写onCreateOptionsMenu(Menu menu) 创建菜单</h4><p><img src="http://om4pdatog.bkt.clouddn.com/createOptionsMenu.png" alt="img"></p>
<p>1.使用getMenuInflater() 获取MenuInflater 对象,通过inflate(@MenuRes int menuRes, Menu menu)就可以创建菜单了,inflate接受两个参数,第一个参数标识我们通过那个资源文件来创建文件,第二个参数表示我们常见出来的菜单项将添加到哪个menu对象上.</p>
<h4 id="重写onOptionsitemSelected-MenuItem-item-实现菜单项的点击事件"><a href="#重写onOptionsitemSelected-MenuItem-item-实现菜单项的点击事件" class="headerlink" title="重写onOptionsitemSelected(MenuItem item) 实现菜单项的点击事件"></a>重写onOptionsitemSelected(MenuItem item) 实现菜单项的点击事件</h4><p><img src="http://om4pdatog.bkt.clouddn.com/OptionsItemSelected.png" alt="img"></p>
<p>通过item.getItemId()即可获取到item项的资源ID,通过对比资源ID,即可进行后续操作</p>
]]></content>
</entry>
<entry>
<title><![CDATA[Android开发常用工具类]]></title>
<url>/2017/02/25/%E5%B7%A5%E5%85%B7%E7%B1%BB/</url>
<content type="html"><![CDATA[<h2 id="PwdCheckUtil"><a href="#PwdCheckUtil" class="headerlink" title="PwdCheckUtil"></a>PwdCheckUtil</h2><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></pre></td><td class="code"><pre><div class="line"></div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">PwdCheckUtil</span> </span>{</div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 规则1:至少包含大小写字母及数字中的一种</div><div class="line"> * 是否包含</div><div class="line"> *</div><div class="line"> * <span class="doctag">@param</span> str</div><div class="line"> * <span class="doctag">@return</span></div><div class="line"> */</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">isLetterOrDigit</span><span class="params">(String str)</span> </span>{</div><div class="line"> <span class="keyword">boolean</span> isLetterOrDigit = <span class="keyword">false</span>;<span class="comment">//定义一个boolean值,用来表示是否包含字母或数字</span></div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < str.length(); i++) {</div><div class="line"> <span class="keyword">if</span> (Character.isLetterOrDigit(str.charAt(i))) { <span class="comment">//用char包装类中的判断数字的方法判断每一个字符</span></div><div class="line"> isLetterOrDigit = <span class="keyword">true</span>;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> String regex = <span class="string">"^[a-zA-Z0-9]+$"</span>;</div><div class="line"> <span class="keyword">boolean</span> isRight = isLetterOrDigit && str.matches(regex);</div><div class="line"> <span class="keyword">return</span> isRight;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 规则2:至少包含大小写字母及数字中的两种</div><div class="line"> * 是否包含</div><div class="line"> *</div><div class="line"> * <span class="doctag">@param</span> str</div><div class="line"> * <span class="doctag">@return</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> <span class="keyword">boolean</span> <span class="title">isLetterDigit</span><span class="params">(String str)</span> </span>{</div><div class="line"> <span class="keyword">boolean</span> isDigit = <span class="keyword">false</span>;<span class="comment">//定义一个boolean值,用来表示是否包含数字</span></div><div class="line"> <span class="keyword">boolean</span> isLetter = <span class="keyword">false</span>;<span class="comment">//定义一个boolean值,用来表示是否包含字母</span></div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < str.length(); i++) {</div><div class="line"> <span class="keyword">if</span> (Character.isDigit(str.charAt(i))) { <span class="comment">//用char包装类中的判断数字的方法判断每一个字符</span></div><div class="line"> isDigit = <span class="keyword">true</span>;</div><div class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (Character.isLetter(str.charAt(i))) { <span class="comment">//用char包装类中的判断字母的方法判断每一个字符</span></div><div class="line"> isLetter = <span class="keyword">true</span>;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> String regex = <span class="string">"^[a-zA-Z0-9]+$"</span>;</div><div class="line"> <span class="keyword">return</span> isDigit && isLetter && str.matches(regex);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 规则3:必须同时包含大小写字母及数字</div><div class="line"> * 是否包含</div><div class="line"> *</div><div class="line"> * <span class="doctag">@param</span> str</div><div class="line"> * <span class="doctag">@return</span></div><div class="line"> */</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">isContainAll</span><span class="params">(String str)</span> </span>{</div><div class="line"> <span class="keyword">boolean</span> isDigit = <span class="keyword">false</span>;<span class="comment">//定义一个boolean值,用来表示是否包含数字</span></div><div class="line"> <span class="keyword">boolean</span> isLowerCase = <span class="keyword">false</span>;<span class="comment">//定义一个boolean值,用来表示是否包含字母</span></div><div class="line"> <span class="keyword">boolean</span> isUpperCase = <span class="keyword">false</span>;</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < str.length(); i++) {</div><div class="line"> <span class="keyword">if</span> (Character.isDigit(str.charAt(i))) { <span class="comment">//用char包装类中的判断数字的方法判断每一个字符</span></div><div class="line"> isDigit = <span class="keyword">true</span>;</div><div class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (Character.isLowerCase(str.charAt(i))) { <span class="comment">//用char包装类中的判断字母的方法判断每一个字符</span></div><div class="line"> isLowerCase = <span class="keyword">true</span>;</div><div class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (Character.isUpperCase(str.charAt(i))) {</div><div class="line"> isUpperCase = <span class="keyword">true</span>;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> String regex = <span class="string">"^[a-zA-Z0-9]+$"</span>;</div><div class="line"> <span class="keyword">boolean</span> isRight = isDigit && isLowerCase && isUpperCase && str.matches(regex);</div><div class="line"> <span class="keyword">return</span> isRight;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 判断EditText输入的数字、中文还是字母方法</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">whatIsInput</span><span class="params">(Context context, EditText edInput)</span> </span>{</div><div class="line"> String txt = edInput.getText().toString();</div><div class="line"></div><div class="line"> Pattern p = Pattern.compile(<span class="string">"[0-9]*"</span>);</div><div class="line"> Matcher m = p.matcher(txt);</div><div class="line"> <span class="keyword">if</span> (m.matches()) {</div><div class="line"> Toast.makeText(context, <span class="string">"输入的是数字"</span>, Toast.LENGTH_SHORT).show();</div><div class="line"> }</div><div class="line"> p = Pattern.compile(<span class="string">"[a-zA-Z]"</span>);</div><div class="line"> m = p.matcher(txt);</div><div class="line"> <span class="keyword">if</span> (m.matches()) {</div><div class="line"> Toast.makeText(context, <span class="string">"输入的是字母"</span>, Toast.LENGTH_SHORT).show();</div><div class="line"> }</div><div class="line"> p = Pattern.compile(<span class="string">"[\u4e00-\u9fa5]"</span>);</div><div class="line"> m = p.matcher(txt);</div><div class="line"> <span class="keyword">if</span> (m.matches()) {</div><div class="line"> Toast.makeText(context, <span class="string">"输入的是汉字"</span>, Toast.LENGTH_SHORT).show();</div><div class="line"> }</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<h2 id="MobileUtil"><a href="#MobileUtil" class="headerlink" title="MobileUtil"></a>MobileUtil</h2><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><div class="line">278</div><div class="line">279</div><div class="line">280</div><div class="line">281</div><div class="line">282</div><div class="line">283</div><div class="line">284</div><div class="line">285</div><div class="line">286</div><div class="line">287</div><div class="line">288</div><div class="line">289</div><div class="line">290</div><div class="line">291</div><div class="line">292</div><div class="line">293</div><div class="line">294</div><div class="line">295</div><div class="line">296</div><div class="line">297</div><div class="line">298</div><div class="line">299</div><div class="line">300</div><div class="line">301</div><div class="line">302</div><div class="line">303</div><div class="line">304</div><div class="line">305</div><div class="line">306</div><div class="line">307</div><div class="line">308</div><div class="line">309</div><div class="line">310</div><div class="line">311</div><div class="line">312</div><div class="line">313</div><div class="line">314</div><div class="line">315</div><div class="line">316</div><div class="line">317</div><div class="line">318</div><div class="line">319</div><div class="line">320</div><div class="line">321</div><div class="line">322</div><div class="line">323</div><div class="line">324</div><div class="line">325</div><div class="line">326</div><div class="line">327</div><div class="line">328</div><div class="line">329</div><div class="line">330</div><div class="line">331</div><div class="line">332</div><div class="line">333</div><div class="line">334</div><div class="line">335</div><div class="line">336</div><div class="line">337</div><div class="line">338</div><div class="line">339</div><div class="line">340</div><div class="line">341</div><div class="line">342</div><div class="line">343</div><div class="line">344</div><div class="line">345</div><div class="line">346</div><div class="line">347</div><div class="line">348</div><div class="line">349</div><div class="line">350</div><div class="line">351</div><div class="line">352</div><div class="line">353</div><div class="line">354</div><div class="line">355</div><div class="line">356</div><div class="line">357</div><div class="line">358</div><div class="line">359</div><div class="line">360</div><div class="line">361</div><div class="line">362</div><div class="line">363</div><div class="line">364</div><div class="line">365</div><div class="line">366</div><div class="line">367</div><div class="line">368</div><div class="line">369</div><div class="line">370</div><div class="line">371</div><div class="line">372</div><div class="line">373</div><div class="line">374</div><div class="line">375</div><div class="line">376</div><div class="line">377</div><div class="line">378</div><div class="line">379</div><div class="line">380</div><div class="line">381</div><div class="line">382</div><div class="line">383</div><div class="line">384</div><div class="line">385</div><div class="line">386</div><div class="line">387</div><div class="line">388</div><div class="line">389</div><div class="line">390</div><div class="line">391</div><div class="line">392</div><div class="line">393</div><div class="line">394</div><div class="line">395</div><div class="line">396</div><div class="line">397</div></pre></td><td class="code"><pre><div class="line">public class MobileUtil {</div><div class="line"></div><div class="line"> /**</div><div class="line"> * Print telephone info.</div><div class="line"> */</div><div class="line"> public static String printMobileInfo(Context context) {</div><div class="line"> Date date = new Date(System.currentTimeMillis());</div><div class="line"> SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");</div><div class="line"> String time = dateFormat.format(date);</div><div class="line"> StringBuilder sb = new StringBuilder();</div><div class="line"> sb.append("系统时间:").append(time).append("\n");</div><div class="line"> TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);</div><div class="line"> String IMSI = tm.getSubscriberId();</div><div class="line"> //IMSI前面三位460是国家号码,其次的两位是运营商代号,00、02是中国移动,01是联通,03是电信。</div><div class="line"> String providerName = null;</div><div class="line"> if (IMSI != null) {</div><div class="line"> if (IMSI.startsWith("46000") || IMSI.startsWith("46002")) {</div><div class="line"> providerName = "中国移动";</div><div class="line"> } else if (IMSI.startsWith("46001")) {</div><div class="line"> providerName = "中国联通";</div><div class="line"> } else if (IMSI.startsWith("46003")) {</div><div class="line"> providerName = "中国电信";</div><div class="line"> }</div><div class="line"> }</div><div class="line"> sb.append(providerName).append("\n").append(getNativePhoneNumber(context)).append("\n网络模式:").append(getNetType(context)).append("\nIMSI是:").append(IMSI);</div><div class="line"> sb.append("\nDeviceID(IMEI) :").append(tm.getDeviceId());</div><div class="line"> sb.append("\nDeviceSoftwareVersion:").append(tm.getDeviceSoftwareVersion());</div><div class="line"> sb.append("\ngetLine1Number :").append(tm.getLine1Number());</div><div class="line"> sb.append("\nNetworkCountryIso :").append(tm.getNetworkCountryIso());</div><div class="line"> sb.append("\nNetworkOperator :").append(tm.getNetworkOperator());</div><div class="line"> sb.append("\nNetworkOperatorName :").append(tm.getNetworkOperatorName());</div><div class="line"> sb.append("\nNetworkType :").append(tm.getNetworkType());</div><div class="line"> sb.append("\nPhoneType :").append(tm.getPhoneType());</div><div class="line"> sb.append("\nSimCountryIso :").append(tm.getSimCountryIso());</div><div class="line"> sb.append("\nSimOperator :").append(tm.getSimOperator());</div><div class="line"> sb.append("\nSimOperatorName :").append(tm.getSimOperatorName());</div><div class="line"> sb.append("\nSimSerialNumber :").append(tm.getSimSerialNumber());</div><div class="line"> sb.append("\ngetSimState :").append(tm.getSimState());</div><div class="line"> sb.append("\nSubscriberId :").append(tm.getSubscriberId());</div><div class="line"> sb.append("\nVoiceMailNumber :").append(tm.getVoiceMailNumber());</div><div class="line"></div><div class="line"> return sb.toString();</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> /**</div><div class="line"> * 打印系统信息</div><div class="line"> *</div><div class="line"> * @return</div><div class="line"> */</div><div class="line"> public static String printSystemInfo() {</div><div class="line"> Date date = new Date(System.currentTimeMillis());</div><div class="line"> SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");</div><div class="line"> String time = dateFormat.format(date);</div><div class="line"> StringBuilder sb = new StringBuilder();</div><div class="line"> sb.append("_______ 系统信息 ").append(time).append(" ______________");</div><div class="line"> sb.append("\nID :").append(Build.ID);</div><div class="line"> sb.append("\nBRAND :").append(Build.BRAND);</div><div class="line"> sb.append("\nMODEL :").append(Build.MODEL);</div><div class="line"> sb.append("\nRELEASE :").append(Build.VERSION.RELEASE);</div><div class="line"> sb.append("\nSDK :").append(Build.VERSION.SDK);</div><div class="line"></div><div class="line"> sb.append("\n_______ OTHER _______");</div><div class="line"> sb.append("\nBOARD :").append(Build.BOARD);</div><div class="line"> sb.append("\nPRODUCT :").append(Build.PRODUCT);</div><div class="line"> sb.append("\nDEVICE :").append(Build.DEVICE);</div><div class="line"> sb.append("\nFINGERPRINT :").append(Build.FINGERPRINT);</div><div class="line"> sb.append("\nHOST :").append(Build.HOST);</div><div class="line"> sb.append("\nTAGS :").append(Build.TAGS);</div><div class="line"> sb.append("\nTYPE :").append(Build.TYPE);</div><div class="line"> sb.append("\nTIME :").append(Build.TIME);</div><div class="line"> sb.append("\nINCREMENTAL :").append(Build.VERSION.INCREMENTAL);</div><div class="line"></div><div class="line"> sb.append("\n_______ CUPCAKE-3 _______");</div><div class="line"> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {</div><div class="line"> sb.append("\nDISPLAY :").append(Build.DISPLAY);</div><div class="line"> }</div><div class="line"></div><div class="line"> sb.append("\n_______ DONUT-4 _______");</div><div class="line"> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.DONUT) {</div><div class="line"> sb.append("\nSDK_INT :").append(Build.VERSION.SDK_INT);</div><div class="line"> sb.append("\nMANUFACTURER :").append(Build.MANUFACTURER);</div><div class="line"> sb.append("\nBOOTLOADER :").append(Build.BOOTLOADER);</div><div class="line"> sb.append("\nCPU_ABI :").append(Build.CPU_ABI);</div><div class="line"> sb.append("\nCPU_ABI2 :").append(Build.CPU_ABI2);</div><div class="line"> sb.append("\nHARDWARE :").append(Build.HARDWARE);</div><div class="line"> sb.append("\nUNKNOWN :").append(Build.UNKNOWN);</div><div class="line"> sb.append("\nCODENAME :").append(Build.VERSION.CODENAME);</div><div class="line"> }</div><div class="line"></div><div class="line"> sb.append("\n_______ GINGERBREAD-9 _______");</div><div class="line"> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {</div><div class="line"> sb.append("\nSERIAL :").append(Build.SERIAL);</div><div class="line"> }</div><div class="line"> return sb.toString();</div><div class="line"> }</div><div class="line"></div><div class="line"> /****</div><div class="line"> * 获取网络类型</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 String getNetType(Context context) {</div><div class="line"> try {</div><div class="line"> ConnectivityManager connectMgr = (ConnectivityManager) context</div><div class="line"> .getSystemService(Context.CONNECTIVITY_SERVICE);</div><div class="line"> NetworkInfo info = connectMgr.getActiveNetworkInfo();</div><div class="line"> if (info == null) {</div><div class="line"> return "";</div><div class="line"> }</div><div class="line"> if (info.getType() == ConnectivityManager.TYPE_WIFI) {</div><div class="line"> return "WIFI";</div><div class="line"> } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {</div><div class="line"> if (info.getSubtype() == TelephonyManager.NETWORK_TYPE_CDMA) {</div><div class="line"> return "CDMA";</div><div class="line"> } else if (info.getSubtype() == TelephonyManager.NETWORK_TYPE_EDGE) {</div><div class="line"> return "EDGE";</div><div class="line"> } else if (info.getSubtype() == TelephonyManager.NETWORK_TYPE_EVDO_0) {</div><div class="line"> return "EVDO0";</div><div class="line"> } else if (info.getSubtype() == TelephonyManager.NETWORK_TYPE_EVDO_A) {</div><div class="line"> return "EVDOA";</div><div class="line"> } else if (info.getSubtype() == TelephonyManager.NETWORK_TYPE_GPRS) {</div><div class="line"> return "GPRS";</div><div class="line"> }</div><div class="line"> /*</div><div class="line"> * else if(info.getSubtype() ==</div><div class="line"> * TelephonyManager.NETWORK_TYPE_HSDPA){ return "HSDPA"; }else</div><div class="line"> * if(info.getSubtype() == TelephonyManager.NETWORK_TYPE_HSPA){</div><div class="line"> * return "HSPA"; }else if(info.getSubtype() ==</div><div class="line"> * TelephonyManager.NETWORK_TYPE_HSUPA){ return "HSUPA"; }</div><div class="line"> */</div><div class="line"> else if (info.getSubtype() == TelephonyManager.NETWORK_TYPE_UMTS) {</div><div class="line"> return "UMTS";</div><div class="line"> } else {</div><div class="line"> return "3G";</div><div class="line"> }</div><div class="line"> } else {</div><div class="line"> return "";</div><div class="line"> }</div><div class="line"> } catch (Exception e) {</div><div class="line"> return "";</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> /**</div><div class="line"> * 获取当前设置的电话号码</div><div class="line"> */</div><div class="line"> public static String getNativePhoneNumber(Context context) {</div><div class="line"> TelephonyManager telephonyManager = (TelephonyManager) context</div><div class="line"> .getSystemService(Context.TELEPHONY_SERVICE);</div><div class="line"> String NativePhoneNumber = null;</div><div class="line"> NativePhoneNumber = telephonyManager.getLine1Number();</div><div class="line"> return String.format("手机号: %s", NativePhoneNumber);</div><div class="line"> }</div><div class="line"></div><div class="line"> /**</div><div class="line"> * IMSI是国际移动用户识别码的简称(International Mobile Subscriber Identity)</div><div class="line"> * IMSI共有15位,其结构如下:</div><div class="line"> * MCC+MNC+MIN</div><div class="line"> * MCC:Mobile Country Code,移动国家码,共3位,中国为460;</div><div class="line"> * MNC:Mobile NetworkCode,移动网络码,共2位</div><div class="line"> * 在中国,移动的代码为电00和02,联通的代码为01,电信的代码为03</div><div class="line"> * 合起来就是(也是Android手机中APN配置文件中的代码):</div><div class="line"> * 中国移动:46000 46002</div><div class="line"> * 中国联通:46001</div><div class="line"> * 中国电信:46003</div><div class="line"> * 举例,一个典型的IMSI号码为460030912121001</div><div class="line"> */</div><div class="line"> public static String getIMSI(Context context) {</div><div class="line"> TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);</div><div class="line"> String IMSI = telephonyManager.getSubscriberId();</div><div class="line"> return IMSI;</div><div class="line"> }</div><div class="line"></div><div class="line"> /**</div><div class="line"> * IMEI是International Mobile Equipment Identity (国际移动设备标识)的简称</div><div class="line"> * IMEI由15位数字组成的”电子串号”,它与每台手机一一对应,而且该码是全世界唯一的</div><div class="line"> * 其组成为:</div><div class="line"> * 1. 前6位数(TAC)是”型号核准号码”,一般代表机型</div><div class="line"> * 2. 接着的2位数(FAC)是”最后装配号”,一般代表产地</div><div class="line"> * 3. 之后的6位数(SNR)是”串号”,一般代表生产顺序号</div><div class="line"> * 4. 最后1位数(SP)通常是”0″,为检验码,目前暂备用</div><div class="line"> */</div><div class="line"> public static String getIMEI(Context context) {</div><div class="line"> TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);</div><div class="line"> String IMEI = telephonyManager.getDeviceId();</div><div class="line"> return IMEI;</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> /////_________________ 双卡双待系统IMEI和IMSI方案(see more on http://benson37.iteye.com/blog/1923946)</div><div class="line"></div><div class="line"> /**</div><div class="line"> * 双卡双待神机IMSI、IMSI、PhoneType信息</div><div class="line"> * <uses-permission android:name="android.permission.READ_PHONE_STATE"/></div><div class="line"> */</div><div class="line"> public static class TeleInfo {</div><div class="line"> public String imsi_1;</div><div class="line"> public String imsi_2;</div><div class="line"> public String imei_1;</div><div class="line"> public String imei_2;</div><div class="line"> public int phoneType_1;</div><div class="line"> public int phoneType_2;</div><div class="line"></div><div class="line"> @Override</div><div class="line"> public String toString() {</div><div class="line"> return "TeleInfo{" +</div><div class="line"> "imsi_1='" + imsi_1 + '\'' +</div><div class="line"> ", imsi_2='" + imsi_2 + '\'' +</div><div class="line"> ", imei_1='" + imei_1 + '\'' +</div><div class="line"> ", imei_2='" + imei_2 + '\'' +</div><div class="line"> ", phoneType_1=" + phoneType_1 +</div><div class="line"> ", phoneType_2=" + phoneType_2 +</div><div class="line"> '}';</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> /**</div><div class="line"> * MTK Phone.</div><div class="line"> * <p></div><div class="line"> * 获取 MTK 神机的双卡 IMSI、IMSI 信息</div><div class="line"> */</div><div class="line"> public static TeleInfo getMtkTeleInfo(Context context) {</div><div class="line"> TeleInfo teleInfo = new TeleInfo();</div><div class="line"> try {</div><div class="line"> Class<?> phone = Class.forName("com.android.internal.telephony.Phone");</div><div class="line"></div><div class="line"> Field fields1 = phone.getField("GEMINI_SIM_1");</div><div class="line"> fields1.setAccessible(true);</div><div class="line"> int simId_1 = (Integer) fields1.get(null);</div><div class="line"></div><div class="line"> Field fields2 = phone.getField("GEMINI_SIM_2");</div><div class="line"> fields2.setAccessible(true);</div><div class="line"> int simId_2 = (Integer) fields2.get(null);</div><div class="line"></div><div class="line"> TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);</div><div class="line"> Method getSubscriberIdGemini = TelephonyManager.class.getDeclaredMethod("getSubscriberIdGemini", int.class);</div><div class="line"> String imsi_1 = (String) getSubscriberIdGemini.invoke(tm, simId_1);</div><div class="line"> String imsi_2 = (String) getSubscriberIdGemini.invoke(tm, simId_2);</div><div class="line"> teleInfo.imsi_1 = imsi_1;</div><div class="line"> teleInfo.imsi_2 = imsi_2;</div><div class="line"></div><div class="line"> Method getDeviceIdGemini = TelephonyManager.class.getDeclaredMethod("getDeviceIdGemini", int.class);</div><div class="line"> String imei_1 = (String) getDeviceIdGemini.invoke(tm, simId_1);</div><div class="line"> String imei_2 = (String) getDeviceIdGemini.invoke(tm, simId_2);</div><div class="line"></div><div class="line"> teleInfo.imei_1 = imei_1;</div><div class="line"> teleInfo.imei_2 = imei_2;</div><div class="line"></div><div class="line"> Method getPhoneTypeGemini = TelephonyManager.class.getDeclaredMethod("getPhoneTypeGemini", int.class);</div><div class="line"> int phoneType_1 = (Integer) getPhoneTypeGemini.invoke(tm, simId_1);</div><div class="line"> int phoneType_2 = (Integer) getPhoneTypeGemini.invoke(tm, simId_2);</div><div class="line"> teleInfo.phoneType_1 = phoneType_1;</div><div class="line"> teleInfo.phoneType_2 = phoneType_2;</div><div class="line"> } catch (Exception e) {</div><div class="line"> e.printStackTrace();</div><div class="line"> }</div><div class="line"> return teleInfo;</div><div class="line"> }</div><div class="line"></div><div class="line"> /**</div><div class="line"> * MTK Phone.</div><div class="line"> * <p></div><div class="line"> * 获取 MTK 神机的双卡 IMSI、IMSI 信息</div><div class="line"> */</div><div class="line"> public static TeleInfo getMtkTeleInfo2(Context context) {</div><div class="line"> TeleInfo teleInfo = new TeleInfo();</div><div class="line"> try {</div><div class="line"> TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);</div><div class="line"> Class<?> phone = Class.forName("com.android.internal.telephony.Phone");</div><div class="line"> Field fields1 = phone.getField("GEMINI_SIM_1");</div><div class="line"> fields1.setAccessible(true);</div><div class="line"> int simId_1 = (Integer) fields1.get(null);</div><div class="line"> Field fields2 = phone.getField("GEMINI_SIM_2");</div><div class="line"> fields2.setAccessible(true);</div><div class="line"> int simId_2 = (Integer) fields2.get(null);</div><div class="line"></div><div class="line"> Method getDefault = TelephonyManager.class.getMethod("getDefault", int.class);</div><div class="line"> TelephonyManager tm1 = (TelephonyManager) getDefault.invoke(tm, simId_1);</div><div class="line"> TelephonyManager tm2 = (TelephonyManager) getDefault.invoke(tm, simId_2);</div><div class="line"></div><div class="line"> String imsi_1 = tm1.getSubscriberId();</div><div class="line"> String imsi_2 = tm2.getSubscriberId();</div><div class="line"> teleInfo.imsi_1 = imsi_1;</div><div class="line"> teleInfo.imsi_2 = imsi_2;</div><div class="line"></div><div class="line"> String imei_1 = tm1.getDeviceId();</div><div class="line"> String imei_2 = tm2.getDeviceId();</div><div class="line"> teleInfo.imei_1 = imei_1;</div><div class="line"> teleInfo.imei_2 = imei_2;</div><div class="line"></div><div class="line"> int phoneType_1 = tm1.getPhoneType();</div><div class="line"> int phoneType_2 = tm2.getPhoneType();</div><div class="line"> teleInfo.phoneType_1 = phoneType_1;</div><div class="line"> teleInfo.phoneType_2 = phoneType_2;</div><div class="line"> } catch (Exception e) {</div><div class="line"> e.printStackTrace();</div><div class="line"> }</div><div class="line"> return teleInfo;</div><div class="line"> }</div><div class="line"></div><div class="line"> /**</div><div class="line"> * Qualcomm Phone.</div><div class="line"> * 获取 高通 神机的双卡 IMSI、IMSI 信息</div><div class="line"> */</div><div class="line"> public static TeleInfo getQualcommTeleInfo(Context context) {</div><div class="line"> TeleInfo teleInfo = new TeleInfo();</div><div class="line"> try {</div><div class="line"> TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);</div><div class="line"> Class<?> simTMclass = Class.forName("android.telephony.MSimTelephonyManager");</div><div class="line"> // Object sim = context.getSystemService("phone_msim");</div><div class="line"> Object sim = context.getSystemService(Context.TELEPHONY_SERVICE);</div><div class="line"> int simId_1 = 0;</div><div class="line"> int simId_2 = 1;</div><div class="line"></div><div class="line"> Method getSubscriberId = simTMclass.getMethod("getSubscriberId", int.class);</div><div class="line"> String imsi_1 = (String) getSubscriberId.invoke(sim, simId_1);</div><div class="line"> String imsi_2 = (String) getSubscriberId.invoke(sim, simId_2);</div><div class="line"> teleInfo.imsi_1 = imsi_1;</div><div class="line"> teleInfo.imsi_2 = imsi_2;</div><div class="line"></div><div class="line"> Method getDeviceId = simTMclass.getMethod("getDeviceId", int.class);</div><div class="line"> String imei_1 = (String) getDeviceId.invoke(sim, simId_1);</div><div class="line"> String imei_2 = (String) getDeviceId.invoke(sim, simId_2);</div><div class="line"> teleInfo.imei_1 = imei_1;</div><div class="line"> teleInfo.imei_2 = imei_2;</div><div class="line"></div><div class="line"> Method getDataState = simTMclass.getMethod("getDataState");</div><div class="line"> int phoneType_1 = tm.getDataState();</div><div class="line"> int phoneType_2 = (Integer) getDataState.invoke(sim);</div><div class="line"> teleInfo.phoneType_1 = phoneType_1;</div><div class="line"> teleInfo.phoneType_2 = phoneType_2;</div><div class="line"> } catch (Exception e) {</div><div class="line"> e.printStackTrace();</div><div class="line"> }</div><div class="line"> return teleInfo;</div><div class="line"> }</div><div class="line"></div><div class="line"> /**</div><div class="line"> * Spreadtrum Phone.</div><div class="line"> * <p></div><div class="line"> * 获取 展讯 神机的双卡 IMSI、IMSI 信息</div><div class="line"> */</div><div class="line"> public static TeleInfo getSpreadtrumTeleInfo(Context context) {</div><div class="line"> TeleInfo teleInfo = new TeleInfo();</div><div class="line"> try {</div><div class="line"></div><div class="line"> TelephonyManager tm1 = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);</div><div class="line"> String imsi_1 = tm1.getSubscriberId();</div><div class="line"> String imei_1 = tm1.getDeviceId();</div><div class="line"> int phoneType_1 = tm1.getPhoneType();</div><div class="line"> teleInfo.imsi_1 = imsi_1;</div><div class="line"> teleInfo.imei_1 = imei_1;</div><div class="line"> teleInfo.phoneType_1 = phoneType_1;</div><div class="line"></div><div class="line"> Class<?> phoneFactory = Class.forName("com.android.internal.telephony.PhoneFactory");</div><div class="line"> Method getServiceName = phoneFactory.getMethod("getServiceName", String.class, int.class);</div><div class="line"> getServiceName.setAccessible(true);</div><div class="line"> TelephonyManager tm2 = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);</div><div class="line"> String imsi_2 = tm2.getSubscriberId();</div><div class="line"> String imei_2 = tm2.getDeviceId();</div><div class="line"> int phoneType_2 = tm2.getPhoneType();</div><div class="line"> teleInfo.imsi_2 = imsi_2;</div><div class="line"> teleInfo.imei_2 = imei_2;</div><div class="line"> teleInfo.phoneType_2 = phoneType_2;</div><div class="line"></div><div class="line"> } catch (Exception e) {</div><div class="line"> e.printStackTrace();</div><div class="line"> }</div><div class="line"> return teleInfo;</div><div class="line"> }</div><div class="line"></div><div class="line"> /**</div><div class="line"> * 获取 MAC 地址</div><div class="line"> * <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/></div><div class="line"> */</div><div class="line"> public static String getMacAddress(Context context) {</div><div class="line"> //wifi mac地址</div><div class="line"> WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);</div><div class="line"> WifiInfo info = wifi.getConnectionInfo();</div><div class="line"> String mac = info.getMacAddress();</div><div class="line"></div><div class="line"> return mac;</div><div class="line"> }</div><div class="line"></div><div class="line"> /**</div><div class="line"> * 获取 开机时间</div><div class="line"> */</div><div class="line"> public static String getBootTimeString() {</div><div class="line"> long ut = SystemClock.elapsedRealtime() / 1000;</div><div class="line"> int h = (int) ((ut / 3600));</div><div class="line"> int m = (int) ((ut / 60) % 60);</div><div class="line"></div><div class="line"> return h + ":" + m;</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title><![CDATA[MaterialDesignLibrary (在2.2以上的设备使用MaterialDesign)]]></title>
<url>/2017/02/20/MaterialDesign%20Library%20(%E5%9C%A82.2%E4%BB%A5%E4%B8%8A%E7%9A%84%E8%AE%BE%E5%A4%87%E4%BD%BF%E7%94%A8MaterialDesign)%20/</url>
<content type="html"><![CDATA[<h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><ul>
<li>从android 5.0出现的MaterialDesign的设计风格 ,一直是android开发界的设计风向标,从 Google paly ,Google+ 等app就可看出来Google对其的重视可以应用程度,也不知道为什么没有在国内流行起来.</li>
<li>在之前要想在自己的app上使用MaterialDesign风格的各种控件 无奈只能在5.0以上的设备实现,自从出现了MaterialDesignLibrary 现在也可以在2.2的设备上使用了 </li>
<li><a href="https://github.com/navasmdc/MaterialDesignLibrary" target="_blank" rel="external">项目地址</a></li>
</ul>
<h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><ul>
<li><p>添加依赖</p>
<pre><code>compile 'com.github.navasmdc:MaterialDesign:1.5@aar'
</code></pre></li>
<li><p>MaterialDesign Library 包含了众多的控件,下面挑选几个常用的</p>
</li>
</ul>
<ul>
<li>Button 实现了水波纹效果</li>
</ul>
<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"> </div><div class="line"><com.gc.materialdesign.views.ButtonFlat 透明背景的button,background属性修改的是Button的Text的Color</div><div class="line"> android:id="@+id/buttonflat"</div><div class="line"> android:layout_width="wrap_content"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> android:background="#1E88E5"</div><div class="line"> android:text="Button" /></div><div class="line"></div><div class="line"> <com.gc.materialdesign.views.ButtonRectangle 这里的background属性修改的才是Button的background</div><div class="line"> android:id="@+id/button"</div><div class="line"> android:layout_width="wrap_content"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> android:background="#1E88E5"</div><div class="line"> android:text="Button" /></div></pre></td></tr></table></figure>
<ul>
<li>Progress</li>
</ul>
<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></pre></td><td class="code"><pre><div class="line"></div><div class="line"><com.gc.materialdesign.views.ProgressBarCircularIndeterminate 实现5.0的圆形ProgressBar效果</div><div class="line"> android:id="@+id/progressBarCircularIndeterminate"</div><div class="line"> android:layout_width="32dp"</div><div class="line"> android:layout_height="32dp"</div><div class="line"> android:background="#1E88E5" /></div><div class="line"></div><div class="line"> <com.gc.materialdesign.views.ProgressBarIndeterminate 实现5.0的水平ProgressBar效果</div><div class="line"> android:id="@+id/progressBarIndeterminate"</div><div class="line"> android:layout_width="fill_parent"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> android:background="#1E88E5" /></div><div class="line"></div><div class="line"> <com.gc.materialdesign.views.ProgressBarIndeterminateDeterminate 实现5.0的水平ProgressBar效果</div><div class="line"> android:id="@+id/progressBarIndeterminateDeterminate"</div><div class="line"> android:layout_width="fill_parent"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> android:background="#1E88E5" /></div></pre></td></tr></table></figure>
<ul>
<li>Slider </li>
</ul>
<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></pre></td><td class="code"><pre><div class="line"></div><div class="line"><com.gc.materialdesign.views.Slider 普通的Slider</div><div class="line"> android:id="@+id/slider"</div><div class="line"> android:layout_width="fill_parent"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> android:background="#1E88E5"</div><div class="line"> materialdesign:max="50"</div><div class="line"> materialdesign:min="0"</div><div class="line"> /></div><div class="line"></div><div class="line"><com.gc.materialdesign.views.Slider 拖动带指示当前进度的Slider</div><div class="line"> android:id="@+id/slider"</div><div class="line"> android:layout_width="fill_parent"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> android:background="#1E88E5"</div><div class="line"> materialdesign:max="50"</div><div class="line"> materialdesign:min="0"</div><div class="line"> materialdesign:showNumberIndicator="true"/></div></pre></td></tr></table></figure>
<ul>
<li>SnackBar</li>
</ul>
<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"></div><div class="line">SnackBar snackbar = new SnackBar(Activity activity, String text, String buttonText, View.OnClickListener onClickListener);</div><div class="line">snackbar.show();</div></pre></td></tr></table></figure>
<ul>
<li>Dialog</li>
</ul>
<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"> </div><div class="line">Dialog dialog = new Dialog(Context context,String title, String message);</div><div class="line">dialog.show();</div></pre></td></tr></table></figure>
<ul>
<li>Color selector</li>
</ul>
<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"> </div><div class="line">ColorSelector colorSelector = new ColorSelector(Context context,int intialColor, OnColorSelectedListener onColorSelectedListener);</div><div class="line"> colorSelector.show();</div></pre></td></tr></table></figure>
<ul>
<li>如果出现 </li>
</ul>
<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"> </div><div class="line">java.lang.IllegalArgumentException: width and height must be > 0 </div><div class="line"> 可以通过添加 compile'com.nineoldandroids:library:2.4.0' 来解决</div></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title><![CDATA[Hexo博客简单搭建]]></title>
<url>/2017/02/10/Hexo%E5%8D%9A%E5%AE%A2%E7%AE%80%E5%8D%95%E6%90%AD%E5%BB%BA/</url>
<content type="html"><![CDATA[<h2 id="一-需要准备"><a href="#一-需要准备" class="headerlink" title="一 需要准备"></a>一 需要准备</h2><p>Github账号,并且创建repository<br><a href="https://git-scm.com" target="_blank" rel="external">Git</a><br><a href="https://nodejs.org/en" target="_blank" rel="external">Node.js</a></p>
<p>Git和Node.js都是默认安装就可以</p>
<h2 id="二-操作步骤"><a href="#二-操作步骤" class="headerlink" title="二 操作步骤"></a>二 操作步骤</h2><h3 id="Github"><a href="#Github" class="headerlink" title="Github"></a>Github</h3><ul>
<li>通过 ssh-keygen -t rsa -C “你的github邮箱” 生成秘钥.</li>
<li>在你的github的settings中找到SSH and GPG keys ,选择New SSH key,</li>
<li>把生成的is_rsa.pub文件中的全部内容拷贝到key中.</li>
</ul>
<h3 id="Git"><a href="#Git" class="headerlink" title="Git"></a>Git</h3><h5 id="1-选择任意文件夹作为你自己的博客文件夹-并在该目录下右键选择-Git-Bash-开始输入命令"><a href="#1-选择任意文件夹作为你自己的博客文件夹-并在该目录下右键选择-Git-Bash-开始输入命令" class="headerlink" title="1 选择任意文件夹作为你自己的博客文件夹,并在该目录下右键选择 Git Bash ,开始输入命令"></a>1 选择任意文件夹作为你自己的博客文件夹,并在该目录下右键选择 Git Bash ,开始输入命令</h5><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">npm install -g hexo-cli //安装hexo</div><div class="line">hexo init //初始化,再次操作后会生成一系列文件和文件夹</div><div class="line">hexo g //生成本地的静态文件</div><div class="line">hexo s //开启本地服务,现在就可以使用http://localhost:4000 在你本机预览界面</div></pre></td></tr></table></figure>
<h5 id="2-博客内容同步到Github-命令行安装跟部署相关的hexo插件"><a href="#2-博客内容同步到Github-命令行安装跟部署相关的hexo插件" class="headerlink" title="2 博客内容同步到Github,命令行安装跟部署相关的hexo插件"></a>2 博客内容同步到Github,命令行安装跟部署相关的hexo插件</h5><figure class="highlight plain"><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">npm install hexo-server --save //创建</div><div class="line">npm install hexo-deployer-git --save //安装自动部署发布工具</div></pre></td></tr></table></figure>
<h5 id="3-编辑Hexo的配置文件-config-yml"><a href="#3-编辑Hexo的配置文件-config-yml" class="headerlink" title="3 编辑Hexo的配置文件:_config.yml"></a>3 编辑Hexo的配置文件:_config.yml</h5><pre><code>使用主题,依然还是命令行,选择主题可以到https://hexo.io/themes/挑选,将选择好的主题下载解压之后,存放到
themes文件夹中,在你的博客文件夹中找到_config.yml文件,修改主题 theme: 主题名称 (中间要有空格)
修改发布地址,在_config.yml找到deploy节点,修改以下几个参数
</code></pre><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">type: git </div><div class="line">repo: [email protected]:你的Github_UserName/你的Github_UserName.github.io.git (这里是ssh的地址,不是https的)</div><div class="line">branch: master</div></pre></td></tr></table></figure>
<h5 id="4-重新部署-并提交"><a href="#4-重新部署-并提交" class="headerlink" title="4 重新部署,并提交"></a>4 重新部署,并提交</h5><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">hexo clean //先清除掉已经生成的旧文件</div><div class="line">hexo generate //再生成一次静态文件</div><div class="line">hexo server //在本地预览下</div><div class="line">hexo deploy //本地没问题之后,Ctrl + C 停掉本地预览,使用部署命令部署到 Github上</div></pre></td></tr></table></figure>
<p>当出现 <strong>INFO deploy done: git</strong> 就说明已经发布到Github上了,现在就可以到你的Github查看效果了</p>