天天看點

Android:自定義View、Paint、Canvas、attrs、customview、path

第一種:oncreate裡啟動自定義view

Activity代碼:

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

<code>import</code> <code>android.os.Bundle;</code>

<code>import</code> <code>android.app.Activity;</code>

<code>import</code> <code>android.view.Menu;</code>

<code>public</code> <code>class</code> <code>MainActivity </code><code>extends</code> <code>Activity</code>

<code>{</code>

<code>    </code><code>/**</code>

<code>     </code><code>* 兩種方法:</code>

<code>     </code><code>* 1.直接在layout裡找到自定義控件</code>

<code>     </code><code>* 2.oncreate裡啟動自定義view</code>

<code>     </code><code>*/</code>

<code>    </code><code>@Override</code>

<code>    </code><code>protected</code> <code>void</code> <code>onCreate(Bundle savedInstanceState)</code>

<code>    </code><code>{</code>

<code>        </code><code>super</code><code>.onCreate(savedInstanceState);</code>

<code>                                                                                                                                                                         </code> 

<code>        </code><code>//先new一個自定義view對象</code>

<code>        </code><code>VerticalTextView view = </code><code>new</code> <code>VerticalTextView(</code><code>this</code><code>);</code>

<code>        </code><code>setContentView(view);</code>

<code>//        setContentView(R.layout.activity_main);</code>

<code>    </code><code>}</code>

<code>                                                                                                                                                                     </code> 

<code>    </code><code>public</code> <code>boolean</code> <code>onCreateOptionsMenu(Menu menu)</code>

<code>        </code><code>getMenuInflater().inflate(R.menu.main, menu);</code>

<code>        </code><code>return</code> <code>true</code><code>;</code>

<code>}</code>

View類代碼:

30

31

32

33

34

35

36

37

<code>import</code> <code>android.content.Context;</code>

<code>import</code> <code>android.graphics.Bitmap;</code>

<code>import</code> <code>android.graphics.BitmapFactory;</code>

<code>import</code> <code>android.graphics.Canvas;</code>

<code>import</code> <code>android.graphics.Color;</code>

<code>import</code> <code>android.graphics.Paint;</code>

<code>import</code> <code>android.view.View;</code>

<code>public</code> <code>class</code> <code>VerticalTextView </code><code>extends</code> <code>View</code>

<code>    </code><code>//定義一個自定義角度的文本</code>

<code>    </code><code>private</code> <code>Paint mPaint;</code>

<code>    </code><code>public</code> <code>VerticalTextView(Context context)</code>

<code>        </code><code>super</code><code>(context);</code>

<code>        </code><code>init();</code>

<code>                                                                                                                                                    </code> 

<code>    </code><code>private</code> <code>void</code> <code>init()</code>

<code>        </code><code>mPaint = </code><code>new</code> <code>Paint();</code>

<code>        </code><code>mPaint.setColor(Color.BLUE);</code>

<code>        </code><code>mPaint.setTextSize(</code><code>50</code><code>);</code>

<code>        </code><code>mPaint.setAntiAlias(</code><code>true</code><code>);</code><code>//設定抗鋸齒</code>

<code>    </code><code>protected</code> <code>void</code> <code>onDraw(Canvas canvas)</code>

<code>        </code><code>super</code><code>.onDraw(canvas);</code>

<code>        </code><code>Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg);</code>

<code>                                                                                                                                                        </code> 

<code>        </code><code>canvas.rotate(</code><code>75</code><code>);</code>

<code>//        canvas.rotate(60,bitmap.getWidth()*2 , bitmap.getHeight()*2);</code>

<code>        </code><code>canvas.drawText(</code><code>"CanvasHello"</code><code>, </code><code>0</code><code>, </code><code>0</code><code>, mPaint);</code>

<code>        </code><code>canvas.drawBitmap(bitmap, </code><code>0</code><code>, </code><code>0</code><code>, mPaint);</code>

第二種:直接在layout裡找到自定義控件(直接建立custom view)

1.建立attrs檔案,增加自定義屬性:

增加屬性内容:

<code>&lt;declare-styleable name=</code><code>"LabelView"</code><code>&gt;</code>

<code>&lt;attr name=</code><code>"text"</code> <code>format=</code><code>"string"</code> <code>/&gt;</code>

<code>&lt;attr name=</code><code>"textColor"</code> <code>format=</code><code>"color"</code> <code>/&gt;</code>

<code>&lt;attr name=</code><code>"textSize"</code> <code>format=</code><code>"dimension"</code> <code>/&gt;</code>

<code>&lt;/declare-styleable&gt;</code>

或者:

<code>&lt;declare-styleable name=</code><code>"DraggableDot"</code><code>&gt;</code>

<code>&lt;attr name=</code><code>"radius"</code> <code>format=</code><code>"dimension"</code> <code>/&gt;</code>

<code>&lt;attr name=</code><code>"legend"</code> <code>format=</code><code>"string"</code> <code>/&gt;</code>

<code>&lt;attr name=</code><code>"anr"</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>enum</code> <code>name=</code><code>"none"</code> <code>value=</code><code>"0"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>enum</code> <code>name=</code><code>"thumbnail"</code> <code>value=</code><code>"1"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>enum</code> <code>name=</code><code>"drop"</code> <code>value=</code><code>"2"</code> <code>/&gt;</code>

<code>&lt;/attr&gt;</code>

範例:

<code>&lt;resources&gt;</code>

<code>    </code><code>&lt;declare-styleable name=</code><code>"MyView"</code><code>&gt;</code>

<code>        </code><code>&lt;attr name=</code><code>"mytext"</code> <code>format=</code><code>"string"</code> <code>/&gt;</code>

<code>        </code><code>&lt;attr name=</code><code>"mytextColor"</code> <code>format=</code><code>"color"</code> <code>/&gt;</code>

<code>        </code><code>&lt;attr name=</code><code>"mytextSize"</code> <code>format=</code><code>"dimension"</code> <code>/&gt;</code>

<code>    </code><code>&lt;/declare-styleable&gt;</code>

<code>&lt;/resources&gt;</code>

2.增加自己的命名空間,将android修改為自己的包名:

<code>&lt;RelativeLayout xmlns:android=</code><code>"http://schemas.android.com/apk/res/android"</code>

<code>xmlns:MyView=</code><code>"http://schemas.android.com/apk/res/com.example.aexh23_paint_canvas"</code>

3.在layout中建立自定義view,設定自定義屬性(控件包名記得修改):

<code>&lt;com.example.aexh23_paint_canvas.VerticalTextView</code>

<code>android:id=</code><code>"@+id/verticalTextView1"</code>

<code>android:layout_width=</code><code>"wrap_content"</code>

<code>android:layout_height=</code><code>"wrap_content"</code>

<code>MyView:mytext=</code><code>"HelloWorld"</code>

<code>MyView:mytextColor=</code><code>"#654321"</code>

<code>MyView:mytextSize=</code><code>"35sp"</code>

<code>android:layout_centerHorizontal=</code><code>"true"</code>

<code>android:layout_centerVertical=</code><code>"true"</code> <code>/&gt;</code>

<code>    </code><code>xmlns:MyView=</code><code>"http://schemas.android.com/apk/res/com.example.aexh23_paint_canvas"</code>

<code>    </code><code>xmlns:tools=</code><code>"http://schemas.android.com/tools"</code>

<code>    </code><code>android:layout_width=</code><code>"match_parent"</code>

<code>    </code><code>android:layout_height=</code><code>"match_parent"</code>

<code>    </code><code>tools:context=</code><code>".MainActivity"</code> <code>&gt;</code>

<code>    </code><code>&lt;com.example.aexh23_paint_canvas.VerticalTextView</code>

<code>        </code><code>android:id=</code><code>"@+id/verticalTextView1"</code>

<code>        </code><code>android:layout_width=</code><code>"wrap_content"</code>

<code>        </code><code>android:layout_height=</code><code>"wrap_content"</code>

<code>        </code><code>MyView:mytext=</code><code>"HelloWorld"</code>

<code>        </code><code>MyView:mytextColor=</code><code>"#654321"</code>

<code>        </code><code>MyView:mytextSize=</code><code>"35sp"</code>

<code>        </code><code>android:layout_centerHorizontal=</code><code>"true"</code>

<code>        </code><code>android:layout_centerVertical=</code><code>"true"</code> <code>/&gt;</code>

<code>&lt;/RelativeLayout&gt;</code>

4.在自定義view類中增加方法:

<code>setTextColor(a.getColor(R.styleable.LabelView_textColor, </code><code>0xFF000000</code><code>));</code>

<code>int</code> <code>textSize = a.getDimensionPixelOffset(R.styleable.LabelView_textSize, </code><code>0</code><code>);</code>

<code>if</code> <code>(textSize &gt; </code><code>0</code><code>) {</code>

<code>    </code><code>setTextSize(textSize);</code>

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

<code>     </code><code>* 系統範例:LabelView</code>

<code>     </code><code>* 1.建立attrs檔案,增加屬性:</code>

<code>        </code><code>&lt;declare-styleable name="LabelView"&gt;</code>

<code>        </code><code>&lt;attr name="text" format="string" /&gt;</code>

<code>        </code><code>&lt;attr name="textColor" format="color" /&gt;</code>

<code>        </code><code>&lt;attr name="textSize" format="dimension" /&gt;</code>

<code>        </code><code>&lt;/declare-styleable&gt;</code>

<code>        </code><code>//////////////////////////////////////////////</code>

<code>        </code><code>&lt;declare-styleable name="DraggableDot"&gt;</code>

<code>        </code><code>&lt;attr name="radius" format="dimension" /&gt;</code>

<code>        </code><code>&lt;attr name="legend" format="string" /&gt;</code>

<code>        </code><code>&lt;attr name="anr"&gt;</code>

<code>            </code><code>&lt;enum name="none" value="0" /&gt;</code>

<code>            </code><code>&lt;enum name="thumbnail" value="1" /&gt;</code>

<code>            </code><code>&lt;enum name="drop" value="2" /&gt;</code>

<code>        </code><code>&lt;/attr&gt;</code>

<code>        </code><code>////////////////////////////////////////////////</code>

<code>                            </code> 

<code>        </code><code>2.增加自己的命名空間,将android修改為自己的包名</code>

<code>        </code><code>&lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"</code>

<code>        </code><code>xmlns:MyView="http://schemas.android.com/apk/res/com.example.aexh23_paint_canvas"</code>

<code>        </code><code>3.在layout中建立自定義view,增加屬性</code>

<code>        </code><code>&lt;com.example.aexh23_paint_canvas.VerticalTextView</code>

<code>        </code><code>android:id="@+id/verticalTextView1"</code>

<code>        </code><code>android:layout_width="wrap_content"</code>

<code>        </code><code>android:layout_height="wrap_content"</code>

<code>        </code><code>MyView:mytext="HelloWorld"</code>

<code>        </code><code>MyView:mytextColor="#654321"</code>

<code>        </code><code>MyView:mytextSize="35sp"</code>

<code>        </code><code>android:layout_centerHorizontal="true"</code>

<code>        </code><code>android:layout_centerVertical="true" /&gt;</code>

<code>        </code><code>4.在自定義view類中增加方法</code>

<code>        </code><code>setTextColor(a.getColor(R.styleable.LabelView_textColor, 0xFF000000));</code>

<code>        </code><code>int textSize = a.getDimensionPixelOffset(R.styleable.LabelView_textSize, 0);</code>

<code>        </code><code>if (textSize &gt; 0) {</code>

<code>            </code><code>setTextSize(textSize);</code>

<code>        </code><code>}</code>

<code>    </code><code>private</code> <code>CharSequence s;</code>

<code>    </code><code>private</code> <code>int</code> <code>c;</code>

<code>    </code><code>private</code> <code>int</code> <code>d;</code>

<code>                        </code> 

<code>    </code><code>public</code> <code>VerticalTextView(Context context, AttributeSet attrs)</code>

<code>        </code><code>super</code><code>(context, attrs);</code>

<code>        </code><code>TypedArray a = context.obtainStyledAttributes(attrs,</code>

<code>                </code><code>R.styleable.MyView);</code>

<code>        </code><code>s = a.getString(R.styleable.MyView_mytext);</code>

<code>        </code><code>c = a.getColor(R.styleable.MyView_mytextColor, </code><code>0xFF000000</code><code>);</code>

<code>        </code><code>d = a.getDimensionPixelOffset(R.styleable.MyView_mytextSize, </code><code>0</code><code>);</code>

<code>        </code><code>a.recycle();</code>

<code>    </code><code>//定義畫筆</code>

<code>        </code><code>mPaint.setColor(c );</code>

<code>        </code><code>mPaint.setTextSize(d);</code>

<code>        </code><code>mPaint.setAntiAlias(</code><code>true</code><code>);</code><code>// 設定抗鋸齒</code>

<code>        </code><code>canvas.rotate(</code><code>30</code><code>);</code>

<code>        </code><code>// canvas.rotate(60,bitmap.getWidth()*2 , bitmap.getHeight()*2);</code>

<code>        </code><code>canvas.drawText(s.toString(), </code><code>0</code><code>, </code><code>0</code><code>, mPaint);</code>

<code></code>

本文轉自 glblong 51CTO部落格,原文連結:http://blog.51cto.com/glblong/1228552,如需轉載請自行聯系原作者

繼續閱讀