`
遛遛遛
  • 浏览: 52472 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

Andrew自定义组件简单实现-View

 
阅读更多

所有的布局类和视图类都是继承View类。

 

当Android系统提供的一些View子类不能满足需求的时候,就需要自定义个View子类。

 

方法1: 直接继承View类

方法2: 继承View类的一个子类,例如:如果需要一个带有图像的TextView类,自定义类就可以直接去继承TextView类。

 

 

MyView类

 

package com.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class MyView extends View{

	private static final String namespace = "http://schemas.android.com/apk/res/android";
	private String mText;
	
	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mText = attrs.getAttributeValue(namespace, "text");
		
		if(mText == null) {
			mText="";
		}
		
	}

	@Override
	protected void onDraw(Canvas canvas) {
		 Paint p = new Paint();
		 p.setColor(Color.WHITE);
		 p.setTextSize(30);
		canvas.drawText(mText, 100, 100,p);
		super.onDraw(canvas);
	}

	public String getmText() {
		return mText;
	}

	public void setmText(String mText) {
		this.mText = mText;
	}
	
	

}

 

View类有三个构造方法,这里只实现了其中的一个带2个参数的构造,因为当在程序中,使用findViewById(id)获得组件实例的时候,调用的是带有2个参数的构造方法。

使用第二个参数的一些方法,可以在自定义类设定自己的属性,去XML文件里面定义的属性去找。

namespace为命名空间不多解释。

使用命名空间和不使用命名空间的区别:

mText = attrs.getAttributeValue(namespace, "text");

这里使用了命名空间,则在给mText赋值的时候,相对应于xml中的 android:text="呵呵呵呵"

 

mText = attrs.getAttributeValue(null, "texttext");

如果未使用命名空间,相对应xml中的 texttext="呵呵呵呵"

 

补上main.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<com.view.MyView
	android:id="@+id/mtext"  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:text="呵呵呵呵"
    />
    
</LinearLayout>
 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics