2024年3月12日发(作者:)

Android view

view在api中的结构

直接子类:

AnalogClock, ImageView, KeyboardView, ProgressBar, SurfaceView, TextVie, ViewGroup,

ViewStub

间接子类:

AbsListView, AbsSeekBar, AbsSpinner, AbsoluteLayout, AdapterView,

AppWidgetHostView, AutoCompleteTextView, Button, CheckBox, CheckedTextView,

Chronometer, CompoundButton, DatePicker, DialerFilter, DigitalClock,EditView,

ExpandableListView, ExtractEditText, FrameLayout, GLSurfaceView, Gallery,

GestureOverlayView, GridView, HorizontalScrollView, ImageButton, ImageSwitcher,

LinearLayout, ListView, MediaController, MultiAutoCompleteTextView, QuickContactBadge,

RadioButton, RadioGroup, RatingBar, RelativeLayout, ScrollView, SeekBar, SlidingDrawer,

Spinner, TabHost, TabWidget, TableLayout, TableRow, TextSwitcher, TimePicker, ToggleButton,

TwoLineListItem, VideoView, ViewAnimator, ViewFlipper, ViewSwitcher, WebView,

ZoomButton, ZoomControls

由此可见View类属于Android开发绘制中的显示老大,任何与绘制有关系的控件都是

它的子类。在这篇文章中我主要讲View 与SurFaceView 使用线程刷新屏幕绘制方面的知

识。开发中如何去选择使用View还是SurFaceView。我相信读过我前几篇博客的朋友应该

知道我在刷新屏幕的时候使用invalidate()方法来重绘,下面我详细的说明一下Andooid刷新

屏幕的几种方法。

第一种: 在onDraw方法最后调用invalidate()方法,它会通知UI线程重绘 这样 View

会重新调用onDraw方法,实现刷新屏幕。 这样写看起来代码非常简洁漂亮,但是它也同

时存在一个很大的问题,它和游戏主线程是分开的 它违背了单线程模式,这样操作绘制的

话是很不安全的,举个例子 比如程序先进在Activity1中 使用invalidate()方法来重绘, 然

后我跳到了Activity2这时候Activity1已经finash()掉 可是Activity1中 的invalidate() 的线

程还在程序中,Android的虚拟机不可能主动杀死正在运行中的线程所以这样操作是非常危

险的。因为它是在UI线程中被动掉用的所以很不安全。

invalidate() 更新整个屏幕区域

invalidate(Rect rect) 更新Rect区域

invalidate(l, t, r, b) 更新指定矩形区域

view plaincopy to clipboard

public void onDraw(Canvas canvas){

DosomeThing();

invalidate();

}

[java] view plaincopy

public void onDraw(Canvas canvas){

DosomeThing();

invalidate();

}

第二种:使用postInvalidate();方法来刷新屏幕 ,调用后它会用handler通知UI线程重绘屏

幕,我们可以 new Thread(this).start(); 开启一个游戏的主线程 然后在主线程中通过调用

postInvalidate();方法来刷新屏幕。postInvalidate();方法 调用后 系统会帮我们调用onDraw方

法 ,它是在我们自己的线程中调用 通过调用它可以通知UI线程刷新屏幕 。由此可见它

是主动调用UI线程的。所以建议使用postInvalidate()方法通知UI线程来刷新整个屏幕。

postInvalidate(left, top, right, bottom) 方法 通过UI线程来刷新规定矩形区域。

view plaincopy to clipboard

@Override

public void run() {

while (mIsRunning) {

try {

(100);

postInvalidate();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

tackTrace();

}

}

}

[java] view plaincopy

@Override

public void run() {

while (mIsRunning) {

try {

(100);

postInvalidate();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

tackTrace();

}

}

}