自定义组件及其属性

本文介绍如何在Android中创建自定义视图与布局,包括继承View实现特定效果、定义属性集并在XML中引用它们的方法。此外,还展示了如何将自定义组件组合成更复杂的界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义控件一般 都是继承相近的控件,比如,你想将按钮重新设计就可以继承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>

如上,组件相合,也可以将以前自定义的组件合在一起。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值