View组件相当于Swing编程中的Jpanel , 它是一个矩形的空白区域,View组件没有任何的内容
Android中其他控件可以看做他们都继承了View组件, 然后再View组件提供的空白区域上绘画外观.
从API中可以看出, View继承Object, 常用的TextView, ImageView 都是他直接子类, AbslistView 等是他的间接子类, 可以这样说Android中控件的基类都是View
当需要自定义某个控件时, 通常情况下继承View基类的子类, 然后重写View类的一个或者多个方法, 通常重写View中的方法有以下:
/**
* 自定义控件重新绘制内容是回调的方法
*/
@Override
protected
void
onDraw(Canvas canvas)
/**
* 触摸屏事件时触发的方法
*/
@Override
public
boolean
onTouchEvent(MotionEvent event)
/**
* 当应用从 xml布局文件加载该组件并用他来构建界面后,该方法被回调
*/
@Override
protected
void
onFinishInflate()
/**
* 调用改方法用来检测view组件以及他所包含的所有组件的大小
*/
@Override
protected
void
onMeasure(
int
widthMeasureSpec,
int
heightMeasureSpec)
/**
* 当该组件需要分配其子组件的位置,大小时改方法会被回调
*/
@Override
protected
void
onLayout(
boolean
changed,
int
left,
int
top,
int
right,
int
bottom)
/**
* 当该组件的大小被改变时回调该方法
*/
@Override
protected
void
onSizeChanged(
int
w,
int
h,
int
oldw,
int
oldh)
/**
* 当某个键被按下是调用该方法
*/
@Override
public
boolean
onKeyDown(
int
keyCode, KeyEvent event)
/**
* 当松开某个键时触发的改方法
*/
@Override
public
boolean
onKeyUp(
int
keyCode, KeyEvent event)
/**
* 当发生轨迹球事件的时候触发的该方法
*/
@Override
public
boolean
onTrackballEvent(MotionEvent event)
/**
* 当该组件得到, 失去焦点时触发该方法
*/
@Override
public
void
onWindowFocusChanged(
boolean
hasWindowFocus)
/**
* 当把改组件放入某个窗口时触发该方法
*/
@Override
protected
void
onAttachedToWindow()
/**
* 当把改组件从某个窗口分离时触发该方法
*/
@Override
protected
void
onDetachedFromWindow()
/**
* 当包含该组件的窗口的可见性发生变化时触发改方法
*/
@Override
protected
void
onVisibilityChanged(View changedView,
int
visibility)
需求: 创建一个可以跟随手指移动的View.
package
com.example.myview;
import
android.content.Context;
import
android.graphics.Bitmap;
import
android.graphics.BitmapFactory;
import
android.graphics.Canvas;
import
android.graphics.Color;
import
android.graphics.Paint;
import
android.util.AttributeSet;
import
android.view.MotionEvent;
import
android.view.View;
/**
*
* 跟随手指移动的自定义view
*
*/
public
class
MyView
extends
View {
private
Float
mCurrentX
=10f;
private
Float
mCurrentY
=20f;
//创建全局下的画笔
private
Paint
paint
=
new
Paint();
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
}
/**
* 自定义控件重新绘制内容是回调的方法
*/
@Override
protected
void
onDraw(Canvas canvas) {
//
TODO
Auto-generated method stub
super
.onDraw(canvas);
Bitmap bitmap = BitmapFactory.decodeResource (getResources(),R.drawable.
ic_launcher
);
paint
.setColor(Color.
RED
);
//在画布上绘画图片 1. 要绘制图片的bitmap信息 2.matrix 绘画矩阵 3. 画笔
canvas.drawBitmap(bitmap,
mCurrentX
,
mCurrentY
,
paint
);
}
/**
* 触摸屏事件时触发的方法
*/
@Override
public
boolean
onTouchEvent(MotionEvent event) {
//
TODO
Auto-generated method stub
mCurrentX
=event.getX();
//在手指触摸屏幕时候更新坐标位置
mCurrentY
=event.getY();
invalidate();
//通知 重新绘
return
true
;
}
}
在XML布局文件中引用:
<
com.example.myview.MyView
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
/>