android:View 迈不过友情╰ 2024-04-17 23:25 67阅读 0赞 **1.常用布局** FrameLayout,LinearLayout,TableLayout,GridLayout,RelativeLayout。 **2.常用控件** TextView,EditText,Button,ImageButton,CheckBox,RadioButton,RadioGroup,Spinner, TimePicker,DataPicker. **3.绘图类** Bitmap:位图 Canvas:画布:绘制点,线,图形,字符串等 Paint:画笔:颜色,风格,宽度等。 **4.自定义View** 1.自定义属性文件 <declare-styleable name="MyTextView"> <!--声明MyTextView需要使用系统定义过的text属性,注意前面需要加上android命名--> <attr name="android:text" /> <attr name="mTextColor" format="color" /> <attr name="mTextSize" format="dimension" /> </declare-styleable> 2.继承View类 四个构造函数。获取属性值,设置属性值。 TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyTextView); String text = ta.getString(R.styleable.MyTextView_android_text); int mTextColor = ta.getColor(R.styleable.MyTextView_mTextColor, Color.BLACK); int mTextSize = ta.getDimensionPixelSize(R.styleable.MyTextView_mTextSize, 100); ta.recycle(); //注意回收 3.重写onMeasure(),onLayout(),onDraw()。 4.刷新数据:主线程:invalidate().子线程:postInvalidate(). **5.View绘制流程** 绘制会从根视图 ViewRoot 的 performTraversals() 方法开始,从上到下遍历整个视图树,每个 View 控制负责绘制自己,而 ViewGroup 还需要负责通知自己的子 View 进行绘制操作。视图操作的过程可以分为三个步骤,分别是测量(Measure)、布局(Layout)和绘制(Draw)。 Measure: Measure 用来计算 View 的实际大小。页面的测量流程从 performMeasure 方法开始。 具体操作是分发给 ViewGroup 的,由 ViewGroup 在它的 measureChild 方法中传递给子 View。ViewGroup 通过遍历自身所有的子 View,并逐个调用子 View 的 measure 方法实现测量操作。View (ViewGroup) 的 Measure 方法,最终的测量是通过回调 onMeasure 方法实现的,这个通常由 View 的特定子类自己实现,可以通过重写这个方法实现自定义 View。 Layout: Layout 过程用来确定 View 在父容器的布局位置,他是父容器获取子 View 的位置参数后,调用子 View 的 layout 方法并将位置参数传入实现的。 Draw: Draw 操作用来将控件绘制出来,绘制的流程从 performDraw 方法开始。最终调用到每个 View 的 draw 方法绘制每个具体的View。 **6.事件分发机制** **问题产生**:Android的View是树形结构,View可能会重叠在一起,当我们点击的地方由多个view都可以响应的时候,这个点击事件该给谁呢?为了解决问题,就有了View分发机制。 分发过程:在我们点击屏幕时,会有下列事件发生: Activity调用dispathTouchEvent()方法,把事件传递给Window;Window再将事件交给DecorView(DecorView是View的根布局);DecorView再传递给ViewGroup;Activity ——> Window ——> DecorView ——> ViewGroup——> View事件分发的主要有三个关键方法 dispatchTouchEvent() 分发,onInterceptTouchEvent() 拦截 ,只有ViewGroup独有此方法。onTouchEvent() 处理触摸事件。 **分发机制:** Activity首先调用dispathTouchEvent()进行分发,接着调用super向下传递,ViewGroup首先调用dispathTouchEvent()进行分发,接着会调用onInterceptTouchEvent()(拦截事件)。若拦截事件返回为true,表示拦截,事件不会向下层的ViewGroup或者View传递;false,表示不拦截,继续分发事件。默认是false,需要提醒一下,View是没有onInterceptTouchEvent()方法的事件在ViewGroup和ViewGroup、ViewGroup和View之间进行传递,最终到达View;View调用dispathTouchEvent()方法,然后在OnTouchEvent()进行处理事件;OnTouchEvent() 返回true,表示消耗此事件,不再向下传递;返回false,表示不消耗事件,交回上层处理。 **7.surfaceView** SurfaceView是从View基类中派生出来的显示类,他和View的区别有: View需要在UI线程对画面进行刷新,而SurfaceView可在子线程进行页面的刷新。 View适用于主动更新的情况,而SurfaceView适用于被动更新,如频繁刷新,这是因为如果使用View频繁刷新会阻塞主线程,导致界面卡顿。 SurfaceView在底层已实现双缓冲机制,而View没有,因此SurfaceView更适用于需要频繁刷新、刷新时数据处理量很大的页面。
还没有评论,来说两句吧...