自定义控件一般 都是继承相近的控件,比如,你想将按钮重新设计就可以继承button,如果没有相似的功能,就需要自己定义,这时可以继承view。
public class MyView extends View{
private MyView myView;
private float number;
public float getNumber() {
return number;
}
public void setNumber(float number) {
this.number = number;
}
public MyView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.myview, 0, 0);
float fromDegrees = a.getFloat(R.styleable.myview_fromDegrees, 23);//得到在xml中设的值,23为默认值
myView.setNumber(fromDegrees);
a.recycle();
}
}
其中 R.styleable.myview 是res/values文件夹下的attr文件:
<pre name="code" class="html"> <declare-styleable name="myview">
<attr name="fromDegrees" format="float|reference"/>
<attr name="toDegrees" format="float|reference" />
<attr name="childSize" format="float|reference" />
</declare-styleable>
format是其定义传什么值进去。都有以下几类:
1. reference:参考某一资源ID。 android:name = "@drawable/图片ID"
2. color:颜色值。android:name = "#00FF00"
3. boolean:布尔值。android:name = "true"
4. dimension:尺寸值。android:name = "42dip"
5. float:浮点值。android:name = "1.0"
6. integer:整型值。 android:name = "12"
7. string:字符串。android:name = "0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g"
8. fraction:百分数。android:name = "200%"
9. enum:枚举值。android:name = "vertical"
10. flag:位或运算。
用法: <attr name = "name" format = "reference | color" />
在xml中: android:name = "@drawable/图片ID | #0000ff" 这是可以一起使用的。
另:flag 还有另一种写法:
属性定义:
<declare-styleable name="名称">
<attr name="windowSoftInputMode">
<flag name = "stateUnspecified" value = "0" />
<flag name = "stateUnchanged" value = "1" />
<flag name = "stateHidden" value = "2" />
<flag name = "stateAlwaysHidden" value = "3"
/>
<flag name = "stateVisible" value = "4" />
<flag name = "stateAlwaysVisible" value = "5"
/>
<flag name = "adjustUnspecified" value = "0x00"
/>
<flag name = "adjustResize" value = "0x10" />
<flag name = "adjustPan" value = "0x20" />
<flag name = "adjustNothing" value = "0x30" />
</attr> </declare-styleable>
属性使用:
<activity
android:name = ".StyleAndThemeActivity"
android:label = "@string/app_name"
android:windowSoftInputMode = "stateUnspecified | stateUnchanged | stateHidden">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
以上是自定义组件其属性或用onDraw()画出特定的效果,而有时是需要几个组件合到一起,这时可以在layout文件中定义xml将多个组件合在一起在自定义组将语xml文件关联。
<span style="font-size:18px;">public class MyImage extends RelativeLayout{
private ProgressBar progressBar;
private MyView myview;
public MyImage(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
init(context);
applyAttrs(attrs);
}
private void init(Context context){
LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
li.inflate(R.layout.whater, this);
progressBar = (ProgressBar) findViewById(R.id.progress);
progressBar.setVisibility(View.GONE);
myview = (MyView) findViewById(R.id.view);
}
}</span>
如上,组件相合,也可以将以前自定义的组件合在一起。