Android自定义组件的属性
来源:互联网 发布:php系统源码 编辑:程序博客网 时间:2024/05/16 11:43
原文地址:http://blog.csdn.net/ab_ba/article/details/7928711
当要编写自己的widget或者其他view组件时,能够定义自己的属性标签是很重要的,这让我们能够彻底定制view的外观。
知识点:
1.自定义属性标签及其格式属性。
2.如何创建自己的View。
3.如何使用自己的View。
一、自定义属性标签及其格式属性
在res/values下创建文件attrs.xml。先看一段其中的代码:
<?xml version="1.0" encoding="utf-8"?><resources><declare-styleable name="MyView"><attrname="textColor"format="color" /><attrname="textSize"format="dimension" /><attrname="background" format="reference"/></declare-styleable></resources>
这里定义了一个样式属性资源。名字就是MyView,然后有三个属性,文字的颜色,文字的大小,View的背景图片。可以看到attr除了name属性以外,还有一个format属性,它规定了这个属性的数据类型。这个format属性有很多,除了上面的color,dimension,reference以外,还有
reference:参考某一资源ID。
color:颜色值。
boolean:布尔值。
dimension:尺寸值。
float:浮点值。
integer:整型值。
string:字符串。
fraction:百分数。
enum:枚举值。
flag:位或运算。
二、如何创建自己的View
继承View或者它的子类,然后重写构造函数和onDraw函数。看看代码:
package com.wenix;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Style;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.util.Log;import android.view.View;public class MyView extends View {private static final String TAG = "MyView";private Paint mPaint;Drawable background;public MyView(Context context) {// TODO Auto-generated constructor stubsuper(context);}public MyView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubmPaint = new Paint();TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyView);//得到属性数组int textColor = a.getColor(R.styleable.MyView_textColor, Color.BLUE);//得到属性值,可以指定默认值,防止空值,注意引用名。float textSize = a.getDimension(R.styleable.MyView_textSize, 22);//注意get方法,跟format是一致的。background = a.getDrawable(R.styleable.MyView_background);mPaint.setColor(textColor);mPaint.setTextSize(textSize);a.recycle();//一定要recycle以下来保证属性值一致。}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);mPaint.setStyle(Style.FILL);Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.myview_background);canvas.drawBitmap(bitmap, 0, 0, mPaint);//Matrix matrix = new Matrix();//matrix.postScale(0, 0, 480, 800);//canvas.drawBitmap(bitmap, matrix, mPaint);mPaint.setColor(Color.RED);canvas.drawText("hello,world!", 20, 55, mPaint);}}
三、如何使用自定义View
有了自定义属性数组,又有了自定义View,下面说说怎么使用自定义View吧。看main.xml代码:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:wenix="http://schemas.android.com/apk/res/com.wenix" //最重要的就是这个命名空间,xmlns后写上你自己的标签,下面就可以引用属性 android:orientation="vertical" //了,res/后面跟上控件所在包的包名。 android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/background" ><com.wenix.MyViewandroid:id="@+id/myview"android:layout_width="fill_parent"android:layout_height="wrap_content"wenix:textColor="#ffffffff" //使用上面定义的标签来引用属性。wenix:textSize="22dp"/></LinearLayout>
然后去要用的地方用吧,看看MainActivity.java代码:
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><div style="position: absolute; left: 0px; top: 0px; width: 0px; height: 0px; z-index: 99;"><embed id="ZeroClipboardMovie_5" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="0" height="0" name="ZeroClipboardMovie_5" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&width=0&height=0" wmode="transparent"></div></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">package</span><span> com.wenix; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> android.app.Activity; </span></span></li><li class=""><span><span class="keyword">import</span><span> android.os.Bundle; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> android.util.DisplayMetrics; </span></span></li><li class=""><span><span class="keyword">import</span><span> android.util.Log; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> android.view.View; </span></span></li><li class=""><span><span class="keyword">import</span><span> android.view.View.OnClickListener; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> android.widget.Toast; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> MainActivity </span><span class="keyword">extends</span><span> Activity { </span></span></li><li class=""><span> <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> String TAG = </span><span class="string">"MainActivity"</span><span>; </span></span></li><li class="alt"><span> MyView myView; </span></li><li class=""><span> <span class="comment">/** Called when the activity is first created. */</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> onCreate(Bundle savedInstanceState) { </span></span></li><li class="alt"><span> <span class="keyword">super</span><span>.onCreate(savedInstanceState); </span></span></li><li class=""><span> setContentView(R.layout.main); </span></li><li class="alt"><span> </span></li><li class=""><span> myView = (MyView)findViewById(R.id.myview); </span></li><li class="alt"><span> myView.setOnClickListener(<span class="keyword">new</span><span> OnClickListener() { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> onClick(View v) { </span></span></li><li class="alt"><span> <span class="comment">// TODO Auto-generated method stub</span><span> </span></span></li><li class=""><span> Toast.makeText(MainActivity.<span class="keyword">this</span><span>, </span><span class="string">"onClick"</span><span>, Toast.LENGTH_LONG).show(); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> }); </span></li><li class="alt"><span> </span></li><li class=""><span> DisplayMetrics dm = <span class="keyword">new</span><span> DisplayMetrics(); </span></span></li><li class="alt"><span> getWindowManager().getDefaultDisplay().getMetrics(dm); </span></li><li class=""><span> Log.i(TAG,<span class="string">"screen width="</span><span>+dm.widthPixels+</span><span class="string">",screen height="</span><span>+dm.heightPixels);</span><span class="comment">//顺便写了段检测屏幕大小的代码。</span><span> </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">package com.wenix;import android.app.Activity;import android.os.Bundle;import android.util.DisplayMetrics;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Toast;public class MainActivity extends Activity {private static final String TAG = "MainActivity";MyView myView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); myView = (MyView)findViewById(R.id.myview); myView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "onClick", Toast.LENGTH_LONG).show();}}); DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); Log.i(TAG,"screen width="+dm.widthPixels+",screen height="+dm.heightPixels);//顺便写了段检测屏幕大小的代码。 }}</pre><br><p></p><pre></pre><br><p></p><p> 最后上效果图:</p><p><img src="http://img.my.csdn.net/uploads/201208/31/1346391048_7936.png" alt=""><br></p><p><br></p><br>
0 0
- Android自定义组件的属性
- Android自定义组件添加组件的属性
- android attrs组件自定义属性
- Android 自定义组件属性方式
- Android中自定义组件及自定义属性
- Android 使用自定义组件和自定义属性
- Android中自定义组件及自定义属性
- Android中自定义组件及自定义属性
- Android中自定义组件和它的属性
- 对于android中自定义组件属性的理解
- android图像图像处理——自定义组件的属性
- 自定义的组件xml属性
- React组件的自定义属性
- Android定制组件之图文 (自定义组件图) + TableLayout属性
- android的自定义属性
- Android自定义组件简单实例(自定义属性)
- 属性(Attribute)资源的使用:自定义组件
- Android组件的布局属性
- NLP - Machine Translation
- TCL--test
- hdoj 2588 GCD 【欧拉函数 问题转换】
- (4)风色从零单排《C++ Primer》 变量,引用,指针
- java8新特性
- Android自定义组件的属性
- 应用Setting中,不想让用户清除数据怎么办,贱贱的管理空间怎么实现的?
- HibernateTemplate的使用
- Loadrunner java vuser多台机器运行报错 Error: Compilation process failed解决方法
- thrift 继承设计
- cvCreateMTStumpClassifier中MT的含义
- 游戏中随机地图的实现
- 使用 symbolicatecrash 解析崩溃堆栈
- nc 自定义VO