[转载]Android 自定义view(可重用)-Android开发进阶&经验分享-eoe Android开发者社区_Android开发论坛 - Powered by Discuz!

[转载]Android 自定义view(可重用)-Android开发进阶&经验分享-eoe Android开发者社区_Android开发论坛 – Powered by Discuz!.

Android提供了强大的可复用组件,但特殊情况需要自己的自定义的View组件,下面自定义一个View
首先在values/attrs.xml中定义好自定义的View会有哪些属性需要在XML中配置:

<span class="pln">< ?xml version="1.0" encoding="utf-8"</span><span class="pun">?></span><span class="pln">
< resources>
< declare-styleable name="MyView">
< attr name="textColor" format="color" />
< attr name="textSize" format="dimension" />
//在attrs中定义background
< attr name="imgBackground" format="integer" />
< attr name="textPaddingLeft" format="dimension"/>
< attr name="textPaddingTop" format="dimension"/>
< /declare-styleable>
< /resources></span>

如果需要在配置文件中使用该自定义组件,注意一定要重写public View(Context context, AttributeSet attrs)的构造方法,而不是public View(Context context)。如果只需要在程序中利用代码使用该组件可以只覆写public View(Context context)

编写自定义的View-MyView.Java,继承View。

<span class="pln">
</span><span class="kwd">package</span><span class="pln"> eoe</span><span class="pun">.</span><span class="pln">cuntomizedview</span><span class="pun">;</span><span class="pln">
  
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">Calendar</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> test</span><span class="pun">.</span><span class="pln">cuntomizedview</span><span class="pun">.</span><span class="pln">R</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="typ">Context</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="pln">res</span><span class="pun">.</span><span class="typ">TypedArray</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span class="typ">Canvas</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span class="typ">Color</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span class="typ">Paint</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span class="typ">SystemClock</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">AttributeSet</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span class="typ">View</span><span class="pun">;</span><span class="pln">
  
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MyView</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Paint</span><span class="pln"> mPaint</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Context</span><span class="pln"> mContext</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> mStr</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">MyView</span><span class="pun">(</span><span class="typ">Context</span><span class="pln"> context</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AttributeSet</span><span class="pln"> attrs</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">super</span><span class="pun">(</span><span class="pln">context</span><span class="pun">,</span><span class="pln"> attrs</span><span class="pun">);</span><span class="pln">
mContext </span><span class="pun">=</span><span class="pln"> context</span><span class="pun">;</span><span class="pln">
nitMyView</span><span class="pun">();</span><span class="pln">
</span><span class="com">/*获取在xml中配置的属性值*/</span><span class="pln">
</span><span class="typ">TypedArray</span><span class="pln"> </span><span class="kwd">params</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> context</span><span class="pun">.</span><span class="pln">obtainStyledAttributes</span><span class="pun">(</span><span class="pln">attrs</span><span class="pun">,</span><span class="pln">R</span><span class="pun">.</span><span class="pln">styleable</span><span class="pun">.</span><span class="typ">MyView</span><span class="pun">);</span><span class="pln">
</span><span class="com">//取得</span><span class="pln">
backgroundint backgroudId </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">params</span><span class="pun">.</span><span class="pln">getResourceId</span><span class="pun">(</span><span class="pln">
R</span><span class="pun">.</span><span class="pln">styleable</span><span class="pun">.</span><span class="typ">MyView_imgBackground</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">backgroudId </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
setBackgroundResource</span><span class="pun">(</span><span class="pln">backgroudId</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> textColor </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">params</span><span class="pun">.</span><span class="pln">getColor</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">styleable</span><span class="pun">.</span><span class="typ">MyView_textColor</span><span class="pun">,</span><span class="lit">0XFFFFFFFF</span><span class="pun">);</span><span class="pln">
setTextColor</span><span class="pun">(</span><span class="pln">textColor</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">float</span><span class="pln"> textSize </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">params</span><span class="pun">.</span><span class="pln">getDimension</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">styleable</span><span class="pun">.</span><span class="typ">MyView_textSize</span><span class="pun">,</span><span class="pln"> </span><span class="lit">36</span><span class="pun">);</span><span class="pln">
setTextSize</span><span class="pun">(</span><span class="pln">textSize</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">float</span><span class="pln"> paddingLeft </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">params</span><span class="pun">.</span><span class="pln">getDimension</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">styleable</span><span class="pun">.</span><span class="typ">MyView_textPaddingLeft</span><span class="pun">,</span><span class="pln"> </span><span class="lit">41</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">float</span><span class="pln"> paddingTop </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">params</span><span class="pun">.</span><span class="pln">getDimension</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">styleable</span><span class="pun">.</span><span class="typ">MyView_textPaddingTop</span><span class="pun">,</span><span class="pln"> </span><span class="lit">21</span><span class="pun">);</span><span class="pln">
 
setPaddings</span><span class="pun">(</span><span class="pln">paddingLeft</span><span class="pun">,</span><span class="pln"> paddingTop</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
 
 
</span><span class="lit">@Override</span><span class="pln">
</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onDraw</span><span class="pun">(</span><span class="typ">Canvas</span><span class="pln"> canvas</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">super</span><span class="pun">.</span><span class="pln">onDraw</span><span class="pun">(</span><span class="pln">canvas</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">mStr </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
canvas</span><span class="pun">.</span><span class="pln">drawText</span><span class="pun">(</span><span class="pln">mStr</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> mPaint</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
canvas</span><span class="pun">.</span><span class="pln">drawText</span><span class="pun">(“</span><span class="pln">heiheihei</span><span class="pun">”,</span><span class="pln"> </span><span class="lit">30</span><span class="pun">,</span><span class="pln"> </span><span class="lit">60</span><span class="pun">,</span><span class="pln"> mPaint</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> initMyView</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
mPaint </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Paint</span><span class="pun">();</span><span class="pln">
mPaint</span><span class="pun">.</span><span class="pln">setColor</span><span class="pun">(</span><span class="typ">Color</span><span class="pun">.</span><span class="pln">WHITE</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setTextColor</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> textColor</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
mPaint</span><span class="pun">.</span><span class="pln">setColor</span><span class="pun">(</span><span class="lit">0XFFAABBCC</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setTextSize</span><span class="pun">(</span><span class="kwd">float</span><span class="pln"> textSize</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
mPaint</span><span class="pun">.</span><span class="pln">setTextSize</span><span class="pun">(</span><span class="pln">textSize</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setPaddings</span><span class="pun">(</span><span class="kwd">float</span><span class="pln"> paddingLeft</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> paddingTop</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
setPadding</span><span class="pun">((</span><span class="kwd">int</span><span class="pun">)</span><span class="pln">paddingLeft</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln">paddingTop</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span>

注意怎样在attrs中怎样定义background并取得background。

在layout中使用MyView

<span class="pln">
< ?xml version="1.0" encoding="utf-8"</span><span class="pun">?></span><span class="pln">
 
  
< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
  
< test.cuntomizedview.MyView android:id="@+id/v"
android:layout_width="fill_parent" android:layout_height="fill_parent"
app:textColor="#FFFFFFFF" app:textSize="40dip"
app:textPaddingLeft="40dip" app:textPaddingTop="40dip"
app:imgBackground="@drawable/bg_time"
/>
< /LinearLayout></span>
赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

登录

注册