学习Android有一段时间了,真正开始也就是今年的3月,之前都是零碎的看一点,没什么可以做也就搁浅了,现在又捡起来就要坚持下去!
今天记录一下学习到的知识点吧自定制View,Android系统提供了较比多的View组件来帮助开发者完成APP的界面,如Button,ProgressBar等。
在XML中使用自定义的View
要在XML中使用自定义的View需要使用全路径(即包名+类名)
<com.example.MyView
android:id="@+id/myview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
xml中的视图只有类名,系统会去android.view和android.widget包下找该类,如果没有找到将抛出异常,应用无法正常运行。因此自定义View需要使用全路径.
Inflator类是根据xml中的资源生成相应的View。分析一下源码应该会更加清楚
继承View类
自定义类可以根据需求可以选择直接继承Button这类可直接使用的View类,在此基础上再做些自已改动。当然也可以直接继承View类,View类就像是一块白板一样,需要自己去画出界面内容。
public class MyView externed View {
public MyView(Context context) {
this(context, null);
}
public MyView(Context context AttributeSet attrs) {
super(context, attrs);
}
}
从布局文件中实例化View时将收到AttributeSet对象,该对象包含了xml文件中指定的View的属性值
重载onDraw(Canvas canvas)函数
onDraw()函数中将呈现出View的内容,如果当前View包含子View,在该函数中也调用子View的onDraw()函数
在绘制视图最重要的两个对象是:
- Canvas:具体所有的绘制操作,决定绘制位置和图形
- Paint:该类决定如何进行绘制,指定了绘制的图形特征
Paint paint = new Paint();
paint.setColor(Color.Red); // 设置画笔为红色
canvas.drawRect(0, 0, 100, 100, paint) // 绘制矩形(0,0),(100, 100)
重载onTouchEvent() 响应触屏事件,该函数参数为MotionEvent,该类描述了事件的位置和动作
public void onTouchEvent(MotionEvent event) {
PointF p = new PointF(event.getX(), event.getY());
switch(event.getAction()) {
case ACTION_DOWN: // 按下屏幕
case ACTION_MOVE: // 在屏幕上移动
case ACTION_UP: // 离开屏幕
case ACTION_CANCEL: // 父视图拦截了触摸事件
}
return true;
}
onTouchEvent()返回true表示该事件已处理, 将不再向子View传递;返回false,当前事件将传递给子View