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();
}
}
}


发布评论