Skip to content

Commit 072268b

Browse files
committed
修复View初始黑屏的Bug
1 parent db2c796 commit 072268b

File tree

4 files changed

+53
-39
lines changed

4 files changed

+53
-39
lines changed

app/src/main/java/jaygoo/wavelineview/LeakTestActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void onClick(View v) {
5252
@Override
5353
protected void onResume() {
5454
super.onResume();
55-
waveLineView.onResume(true);
55+
waveLineView.onResume();
5656
}
5757

5858
@Override

app/src/main/java/jaygoo/wavelineview/MainActivity.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,19 @@ public void onClick(View v) {
4242
});
4343
}
4444

45+
@Override
46+
public void onWindowFocusChanged(boolean hasFocus) {
47+
super.onWindowFocusChanged(hasFocus);
48+
if (hasFocus){
49+
// waveLineView.justDrawBackground();
50+
}
51+
}
4552

4653
@Override
4754
protected void onResume() {
4855
super.onResume();
49-
waveLineView.onResume(true);
56+
waveLineView.onResume();
57+
5058
}
5159

5260
@Override

library/src/main/java/jaygoo/widget/wlv/RenderView.java

Lines changed: 36 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,22 @@
1818
*/
1919
public 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();

library/src/main/java/jaygoo/widget/wlv/WaveLineView.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,17 +124,20 @@ private void initAttr(AttributeSet attrs) {
124124
checkSensibilityValue();
125125
}
126126

127+
@Override
128+
protected void doDrawBackground(Canvas canvas) {
129+
//绘制背景
130+
canvas.drawColor(backGroundColor);
131+
}
132+
127133
@Override
128134
protected void onRender(Canvas canvas, long millisPassed) {
129-
super.onRender(canvas, millisPassed);
130135
float offset = millisPassed / offsetSpeed;
131136

132137
if (null == samplingX){
133138
initDraw(canvas);
134139
}
135140

136-
//绘制背景
137-
canvas.drawColor(backGroundColor);
138141
if (lineAnim(canvas)) {
139142
resetPaths();
140143
softerChangeVolume();
@@ -276,7 +279,7 @@ public void startAnim() {
276279
@Override
277280
public void stopAnim() {
278281
super.stopAnim();
279-
// clearDraw();
282+
clearDraw();
280283
}
281284

282285
//清空画布所有内容

0 commit comments

Comments
 (0)