Android之自定义View

package com.example.myview;

import android.content.Context;
import android.graphics.Canvas;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;

/**
 * 当开发者需要开发自定义View时,首先定义一个继承View基类的子类,然后重写View类的一个或多个方法,下面的类列出了通常可以被用户重写的方法
 * 重写构造器是定制View的最基本方式,当java代码创建一个View实例,或者根据XML布局文件加载并构造界面时将需要调用该方法
 */
public class MyView extends View {

	public static final String TAG = "MyView"; 
	
	public MyView(Context context) {
		super(context);
	}
	
	/**
	 * 这是一个回调方法,当应从XML布局文件加载该组件并利用它来构建界面之后,该方法将会被回调
	 */
	@Override
	protected void onFinishInflate() {
		super.onFinishInflate();
		Log.d(TAG, ">>>>>>>调用onFinishInflate()方法");
	}

	/**
	 * 调用该方法来检测View组件及它所包含的所有子组件的大小
	 */
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		Log.d(TAG, ">>>>>>>调用onMeasure(int,int)方法");
	}
	
	/**
	 * 当该组件需要分配其子组件的位置、大小时,该方法就会被回调
	 */
	@Override
	protected void onLayout(boolean changed, int left, int top, int right,
			int bottom) {
		super.onLayout(changed, left, top, right, bottom);
		Log.d(TAG, ">>>>>>>调用onLayout(boolean,int,int,int,int)方法");
	}
	
	/**
	 * 当该组件的大小被改变时回调该方法
	 */
	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		super.onSizeChanged(w, h, oldw, oldh);
		Log.d(TAG, ">>>>>>>调用onSizeChanged(int,int,int,int)方法");
	}
	
	/**
	 * 当该组件将要绘制它的内容时回调该方法进行绘制
	 */
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		Log.d(TAG, ">>>>>>>调用onDraw(Canvas)方法");
	}
	
	/**
	 * 当某个键被按下时触发该方法
	 */
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		Log.d(TAG, ">>>>>>>调用onKeyDown(int,KeyEvent)方法");
		return super.onKeyDown(keyCode, event);		
	}
	
	/**
	 * 当松开某个键时触发该方法
	 */
	@Override
	public boolean onKeyUp(int keyCode, KeyEvent event) {
		Log.d(TAG, ">>>>>>>调用onKeyUp(int,KeyEvent)方法");
		return super.onKeyUp(keyCode, event);
	}
	
	/**
	 * 当发生轨迹球事件时触发该方法
	 */
	@Override
	public boolean onTrackballEvent(MotionEvent event) {
		Log.d(TAG, ">>>>>>>调用onTrackballEvent(MotionEvent)方法");
		return super.onTrackballEvent(event);
	}
	
	/**
	 * 当发生轨触摸屏事件时触发该方法
	 */
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		Log.d(TAG, ">>>>>>>调用onTouchEvent(MotionEvent)方法");
		return super.onTouchEvent(event);
	}
	
	/**
	 * 当该组件得到、失去焦点时触发该方法
	 */
	@Override
	public void onWindowFocusChanged(boolean hasWindowFocus) {
		Log.d(TAG, ">>>>>>>调用onWindowFocusChanged(boolean)方法");
		super.onWindowFocusChanged(hasWindowFocus);
	}
	
	/**
	 * 当把该组件放入某个窗口时触发该方法
	 */
	@Override
	protected void onAttachedToWindow() {
		super.onAttachedToWindow();
		Log.d(TAG, ">>>>>>>调用onAttachedToWindow()方法");
	}
	
	/**
	 * 当把该组件从某个窗口上分离时触发该方法
	 */
	@Override
	protected void onDetachedFromWindow() {
		super.onDetachedFromWindow();
		Log.d(TAG, ">>>>>>>调用onDetachedFromWindow()方法");
	}
	
	/**
	 * 当包含该组件的窗口的可见性发生改变时触发该方法
	 */
	@Override
	protected void onWindowVisibilityChanged(int visibility) {
		super.onWindowVisibilityChanged(visibility);
		Log.d(TAG, ">>>>>>>调用onWindowVisibilityChanged(int)方法");
	}
}

 

/**
	 * 当组件通过XML被加载的时候,会调用这个构造方法进行实例化
	 * 如果通过XML加载时 需要添加这个构造方法 否则会android.view.inflateexception异常
	 * @param context
	 * @param atts
	 */
	public MyView(Context context,AttributeSet atts){
		super(context,atts);
	}



 

你可能感兴趣的:(android,android,自定义View)