美文网首页android
Android之View和ViewGroup学习笔记

Android之View和ViewGroup学习笔记

作者: AnQuestionBoy | 来源:发表于2017-11-14 19:35 被阅读3次

    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.
    

    相关文章

      网友评论

        本文标题:Android之View和ViewGroup学习笔记

        本文链接:https://www.haomeiwen.com/subject/gngfvxtx.html