Android之View和ViewGroup学习笔记

view和viewGroup

    ->view,视图是屏幕上可见的矩形区域。视图具有宽度和高度,有时还具有背景色。 插图显示了三种不同类型的视图。ImageView 显示图像,如图标或照片。TextView 显示文本。Button 是对触摸敏感的 TextView:用手指点击时即会做出响应。ViewGroup 是大视图,通常不可见,其内部 包含并可放置较小视图。
    ->viewGroup,ViewGroup 是大视图,其中可包含小视图。小视图称为 ViewGroup 的子视图,可以是 TextView 或 ImageView。ViewGroup 称为其子视图的父视图。插图显示了最常见的 ViewGroup 之一,即垂直的 LinearLayout。
    ->View是所有UI组件的基类,而 ViewGroup是容纳这些组件的容器,其本身也是从View派生出来的.
    ->一般来说,开发Android应用程序的UI界面都不会直接使用View和ViewGroup,而是使用这两大基类的派生类。

View派生出的直接子类有:AnalogClock,ImageView,KeyboardView, ProgressBar,SurfaceView,TextView,ViewGroup,ViewStub
View派生出的间接子类有:AbsListView,AbsSeekBar, AbsSpinner, AbsoluteLayout, AdapterView<T extends Adapter>,AdapterViewAnimator, AdapterViewFlipper, AppWidgetHostView, AutoCompleteTextView,Button,CalendarView, CheckBox, CheckedTextView, Chronometer, CompoundButton,
ViewGroup派生出的直接子类有:AbsoluteLayout,AdapterView<T extends Adapter>,FragmentBreadCrumbs,FrameLayout,LinearLayout,RelativeLayout,SlidingDrawer
ViewGroup派生出的间接子类有:AbsListView,AbsSpinner, AdapterViewAnimator, AdapterViewFlipper, AppWidgetHostView, CalendarView, DatePicker, DialerFilter, ExpandableListView, Gallery, GestureOverlayView,GridView,HorizontalScrollView, ImageSwitcher,ListView,

    ->View和ViewGroup最重要的几个方法
            ->protected void onDraw(Canvas canvas),View类中用于重绘的方法,这个方法是所有View、ViewGroup及其派生类都具有的方法,也是Android UI绘制最重要的方法。开发者可重载该方法,并在重载的方法内部基于参数canvas绘制自己的各种图形、图像效果; 
            ->protected void onLayout(boolean changed, int left, int top, int right, int bottom),View类中布局发生改变时会调用的方法,这个方法是所有View、ViewGroup及其派生类都具有的方法,重载该类可以在布局发生改变时作定制处理,这在实现一些特效时非常有用; 
           ->protected void dispatchDraw(Canvas canvas),ViewGroup类及其派生类具有的方法,这个方法主要用于控制子View的绘制分发,重载该方法可改变子View的绘制,进而实现一些复杂的视效; 
           ->protected boolean drawChild(Canvas canvas, View child, long drawingTime)),iewGroup类及其派生类具有的方法,这个方法直接控制绘制某局具体的子view,重载该方法可控制具体某个具体子View。 

view 的各个listener监听器?

    ->1,在Activity中定义一个内部类继承监听器接口;

class MyListener implements View.OnClickListener{
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"you have clicked Button2",Toast.LENGTH_SHORT).show();
}
}
// 或者,这里是创建一个OnClickListener 的对象,与上面的直接复写接口有异曲同工之妙
private View.OnClickListener MyListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"you have clicked Button2",Toast.LENGTH_SHORT).show();
}
};
->2,实现匿名内部类。这种方法适合只希望对监听器进行一次性使用的情况,在该代码块运行完毕之后,该监听器也就不复存在了。
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"you have clicked Button1",Toast.LENGTH_SHORT).show();
}
});
->3,利用布局文件中的onClick属性,并在实现文件中实现该方法。注意的是这里的方法名应该和布局文件中onClick属性的方法名相同,该方法必须是public方法。
// 方法三,注意需要public方法
public void onButtonClick (View view){
Toast.makeText(MainActivity.this,"you have clicked Button3",Toast.LENGTH_SHORT).show();
}
}
<Button
android:layout_below="@id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button3"
android:text="Button3"
android:onClick="onButtonClick"/>

view的构造函数参数的意义
->构造函数参数最多有四个:

  1. View(Context)
  2. View(Context, AttributeSet)
  3. View(Context, AttributeSet, defStyleAttr)
  4. View(Context, AttributeSet, defStyleAttr, defStyleRes)
    Context - View中随处都会用到;
    AttributeSet - XML属性(当从XML inflate的时候);
    int defStyleAttr - 应用到View的默认风格(定义在主题中);
    int defStyleResource - 如果没有使用defStyleAttr,应用到View的默认风格; 除了Context,其它的参数只是用来通过XML属性配置View的初始状态(从布局,style以及theme中)。
    一般这样设置我的自定义View:
  5. SomeView(Context context) {
  6. this(context, null);
  7. }
  8. SomeView(Context context, AttributeSet attrs) {
  9. // Call super() so that the View sets itself up properly
  10. super(context, attrs);
  11. // ...Setup View and handle all attributes here...
  12. }
    只需要这个两个参数的构造方法你就能随意的使用obtainStyledAttributes()了。实现默认样式的一个简便方法是直接提供defStyleRes给它。

viewGroup 怎么管理子view?

    ->1,ViewGroup 初始化计算width,height;
    ->2,onMeasure获得ViewGroup本身的width,height,可以重新去定义width,height,同时,通过 getChildCount可以获得childview的个数 ,如果是动态加载childView,需要在这里计算所有的childView的width, height; 
    ->3,onMeasure之后,ViewGroup的size就确定了, 可以通过onSizeChanged获得ViewGroup真实有效的width和height。所有的坐标都是相对于空间内部的;
    ->4,onLayout是最后确定ViewGroup在parentView中占据的位置。如果是动态加载,可以在这一步对多有的childView确定布局;
    ->5,childView在onLayout之后,也布局位置确定,接下来,就是ViewGroup对所有的childView分派draw的任务,直接复写dispatchDraw,所有的childView就会调用ondraw.

推荐阅读更多精彩内容