1818 */
1919public abstract class RenderView extends SurfaceView implements SurfaceHolder .Callback {
2020
21- private boolean isAutoStartAnim = false ;
21+ //是否正在绘制动画
22+ private boolean isStartAnim = false ;
23+ private final static Object surfaceLock = new Object ();
24+ private RenderThread renderThread ;
25+ /**
26+ * 绘制背景,防止开始时黑屏
27+ * 子View可以执行此方法
28+ * @param canvas
29+ */
30+ protected abstract void doDrawBackground (Canvas canvas );
31+ /**
32+ * 渲染surfaceView的回调方法。
33+ *
34+ * @param canvas 画布
35+ */
36+ protected abstract void onRender (Canvas canvas , long millisPassed );
2237
2338 public RenderView (Context context ) {
2439 this (context , null );
@@ -77,19 +92,22 @@ public void run() {
7792 if (getSurfaceHolder () != null && getRenderView () != null ) {
7893 Canvas canvas = getSurfaceHolder ().lockCanvas ();
7994 if (canvas != null ) {
80- getRenderView ().render (canvas , System .currentTimeMillis () - startAt ); //这里做真正绘制的事情
95+ getRenderView ().doDrawBackground (canvas );
96+ if (getRenderView ().isStartAnim ) {
97+ getRenderView ().render (canvas , System .currentTimeMillis () - startAt ); //这里做真正绘制的事情
98+ }
8199 getSurfaceHolder ().unlockCanvasAndPost (canvas );
82100 }
83101 }else {
84102 running = false ;
85103 }
86- try {
87- Thread .sleep (SLEEP_TIME );
88- } catch (InterruptedException e ) {
89- e .printStackTrace ();
90- }
91- }
92104
105+ }
106+ try {
107+ Thread .sleep (SLEEP_TIME );
108+ } catch (InterruptedException e ) {
109+ e .printStackTrace ();
110+ }
93111 }
94112
95113 }
@@ -103,8 +121,7 @@ public void setRun(boolean isRun) {
103121
104122 }
105123
106- private final static Object surfaceLock = new Object ();
107- private RenderThread renderThread ;
124+
108125
109126 @ Override
110127 public void surfaceCreated (SurfaceHolder holder ) {
@@ -130,20 +147,6 @@ public void onResume(){
130147 }
131148
132149
133- /**
134- * 解锁暂停,继续执行绘制任务
135- * @param isAutoStartAnim 是否当Resume时自动启动动画
136- */
137- public void onResume (boolean isAutoStartAnim ){
138- synchronized (surfaceLock ){
139- this .isAutoStartAnim = isAutoStartAnim ;
140- if (renderThread != null ) {
141- renderThread .isPause = false ;
142- surfaceLock .notifyAll ();
143- }
144- }
145- }
146-
147150 //假暂停,并没有结束Thread
148151 public void onPause (){
149152 synchronized (surfaceLock ){
@@ -168,12 +171,14 @@ public void surfaceDestroyed(SurfaceHolder holder) {
168171 }
169172
170173 public void onWindowFocusChanged (boolean hasFocus ) {
171- if (hasFocus && isAutoStartAnim ){
174+ if (hasFocus && isStartAnim ){
172175 startAnim ();
176+ }else {
177+ startThread ();
173178 }
174179 }
175- /*绘图*/
176180
181+ /*绘图*/
177182 public interface IRenderer {
178183 void onRender (Canvas canvas , long millisPassed );
179184 }
@@ -194,15 +199,12 @@ private void render(Canvas canvas, long millisPassed) {
194199 }
195200 }
196201
197- /**
198- * 渲染surfaceView的回调方法。
199- *
200- * @param canvas 画布
201- */
202- protected void onRender (Canvas canvas , long millisPassed ) {
202+ public void startAnim (){
203+ isStartAnim = true ;
204+ startThread ();
203205 }
204206
205- public void startAnim (){
207+ private void startThread (){
206208
207209 if (renderThread != null && !renderThread .running ) {
208210 renderThread .setRun (true );
@@ -219,6 +221,7 @@ public void startAnim(){
219221 }
220222
221223 public void stopAnim (){
224+ isStartAnim = false ;
222225 if (renderThread != null && renderThread .running ) {
223226 renderThread .setRun (false );
224227 renderThread .interrupt ();
0 commit comments