Skip to content

Commit c89297b

Browse files
author
zhangqinghua.wanjian
committed
no message
1 parent de91c4c commit c89297b

File tree

13 files changed

+426
-1
lines changed

13 files changed

+426
-1
lines changed

saklib/src/main/java/com/wanjian/sak/SAK.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.wanjian.sak.layer.impl.BackgroundColorLayer;
1313
import com.wanjian.sak.layer.impl.BitmapWidthHeightLayer;
1414
import com.wanjian.sak.layer.impl.BorderLayer;
15+
import com.wanjian.sak.layer.impl.FlashWindowLayer;
1516
import com.wanjian.sak.layer.impl.FragmentNameLayer;
1617
import com.wanjian.sak.layer.impl.GridLayer;
1718
import com.wanjian.sak.layer.impl.HorizontalMeasureView;
@@ -78,6 +79,7 @@ public static void init(Application application, Config config) {
7879
.addLayer(ScalpelFrameLayout.class, application.getDrawable(R.drawable.sak_layer_icon), "Scalpel")
7980
// .addLayer(ViewDrawPerformLayer.class, application.getDrawable(R.drawable.sak_performance_icon),application.getString(R.string.sak_performance) )
8081
.addLayer(BitmapWidthHeightLayer.class, application.getDrawable(R.drawable.sak_img_size),application.getString(R.string.sak_image_w_h) )
82+
.addLayer(FlashWindowLayer.class, application.getDrawable(R.drawable.sak_shake_icon),application.getString(R.string.sak_flash_when_ui_update) )
8183
.build();
8284
}
8385
sScaffold.install(application, config);
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package com.wanjian.sak.layer.impl;
2+
3+
import android.graphics.Canvas;
4+
import android.os.Handler;
5+
import android.os.Looper;
6+
import android.view.View;
7+
8+
import com.wanjian.sak.layer.Layer;
9+
import com.wanjian.sak.system.canvaspool.CanvasPoolCompact;
10+
import com.wanjian.sak.system.canvaspool.CanvasRecycleListener;
11+
12+
public class FlashWindowLayer extends Layer {
13+
private CanvasRecycleListener listener = new CanvasRecycleListener() {
14+
@Override
15+
public void onRecycle(Canvas canvas) {
16+
if (traversaling == false || flash) {
17+
return;
18+
}
19+
flash();
20+
}
21+
};
22+
private Handler handler = new Handler(Looper.getMainLooper());
23+
private boolean flash;
24+
25+
private void flash() {
26+
flash = true;
27+
handler.post(new Runnable() {
28+
@Override
29+
public void run() {
30+
invalidate();
31+
}
32+
});
33+
handler.postDelayed(new Runnable() {
34+
@Override
35+
public void run() {
36+
flash = false;
37+
}
38+
}, 1000);
39+
}
40+
41+
@Override
42+
protected void onDraw(Canvas canvas) {
43+
super.onDraw(canvas);
44+
if (flash == false) {
45+
return;
46+
}
47+
int color = 0x88000000 | (int) (Math.random() * 0xFFFFFF);
48+
canvas.drawColor(color);
49+
handler.post(new Runnable() {
50+
@Override
51+
public void run() {
52+
invalidate();
53+
}
54+
});
55+
}
56+
57+
private boolean traversaling;
58+
59+
@Override
60+
protected void onBeforeTraversal(View rootView) {
61+
super.onBeforeTraversal(rootView);
62+
traversaling = true;
63+
}
64+
65+
@Override
66+
protected void onAfterTraversal(View rootView) {
67+
super.onAfterTraversal(rootView);
68+
traversaling = false;
69+
}
70+
71+
@Override
72+
protected void onEnableChange(boolean enable) {
73+
super.onEnableChange(enable);
74+
if (enable) {
75+
CanvasPoolCompact.get().registerListener(listener);
76+
} else {
77+
CanvasPoolCompact.get().removeListener(listener);
78+
}
79+
}
80+
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.wanjian.sak.system.canvaspool;
2+
3+
import android.graphics.Canvas;
4+
import android.graphics.RecordingCanvas;
5+
import android.os.Build;
6+
import android.util.Pools;
7+
import android.view.DisplayListCanvas;
8+
9+
import java.lang.ref.WeakReference;
10+
import java.lang.reflect.Field;
11+
import java.util.ArrayList;
12+
import java.util.Iterator;
13+
import java.util.List;
14+
15+
public class CanvasPoolCompact {
16+
private static CanvasPoolCompact sInstance = new CanvasPoolCompact();
17+
18+
public static CanvasPoolCompact get() {
19+
return sInstance;
20+
}
21+
22+
private List<WeakReference<CanvasRecycleListener>> listeners = new ArrayList<>();
23+
24+
private CanvasPoolCompact() {
25+
Class clz;
26+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
27+
clz = RecordingCanvas.class;
28+
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
29+
clz = DisplayListCanvas.class;
30+
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
31+
try {
32+
clz = Class.forName("android.view.GLES20RecordingCanvas");
33+
} catch (ClassNotFoundException e) {
34+
throw new RuntimeException(e);
35+
}
36+
} else {
37+
throw new RuntimeException();
38+
}
39+
final Pools.SynchronizedPool origin;
40+
Field field;
41+
try {
42+
field = clz.getDeclaredField("sPool");
43+
field.setAccessible(true);
44+
origin = (Pools.SynchronizedPool) field.get(null);
45+
} catch (Exception e) {
46+
throw new RuntimeException(e);
47+
}
48+
Pools.SynchronizedPool pool = new Pools.SynchronizedPool(1) {
49+
@Override
50+
public Object acquire() {
51+
return origin.acquire();
52+
}
53+
54+
@Override
55+
public boolean release(Object element) {
56+
boolean b = origin.release(element);
57+
Iterator<WeakReference<CanvasRecycleListener>> iterator = listeners.iterator();
58+
while (iterator.hasNext()) {
59+
WeakReference<CanvasRecycleListener> reference = iterator.next();
60+
CanvasRecycleListener recycleListener = reference.get();
61+
if (recycleListener == null) {
62+
iterator.remove();
63+
} else {
64+
recycleListener.onRecycle((Canvas) element);
65+
}
66+
}
67+
return b;
68+
}
69+
};
70+
71+
try {
72+
field.set(null, pool);
73+
} catch (IllegalAccessException e) {
74+
throw new RuntimeException(e);
75+
}
76+
}
77+
78+
public void registerListener(CanvasRecycleListener listener) {
79+
listeners.add(new WeakReference<>(listener));
80+
}
81+
82+
public void removeListener(CanvasRecycleListener listener) {
83+
Iterator<WeakReference<CanvasRecycleListener>> iterator = listeners.iterator();
84+
while (iterator.hasNext()) {
85+
WeakReference<CanvasRecycleListener> reference = iterator.next();
86+
CanvasRecycleListener recycleListener = reference.get();
87+
if (recycleListener == null || recycleListener == listener) {
88+
iterator.remove();
89+
}
90+
}
91+
}
92+
93+
94+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.wanjian.sak.system.canvaspool;
2+
3+
import android.graphics.Canvas;
4+
5+
public interface CanvasRecycleListener {
6+
void onRecycle(Canvas canvas);
7+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.wanjian.sak.system.canvaspool;
2+
3+
import android.graphics.Canvas;
4+
import android.graphics.Rect;
5+
import android.util.Pools;
6+
import android.view.DisplayListCanvas;
7+
import android.view.RenderNode;
8+
import android.view.Surface;
9+
import android.view.View;
10+
import android.view.ViewRootImpl;
11+
12+
import java.lang.reflect.Field;
13+
14+
public class MySynchronizedPool extends Pools.SynchronizedPool {
15+
private Pools.SynchronizedPool origin;
16+
17+
public MySynchronizedPool(Pools.SynchronizedPool origin) {
18+
super(1, null);
19+
this.origin = origin;
20+
}
21+
22+
@Override
23+
public Object acquire() {
24+
Object o = origin.acquire();
25+
System.out.println("MySynchronizedPool...acquire:" + o);
26+
return o;
27+
}
28+
29+
@Override
30+
public boolean release(Object element) {
31+
System.out.println("MySynchronizedPool...release:" + element);//DisplayListCanvas
32+
33+
34+
// Canvas canvas = (Canvas) element;
35+
// int w = canvas.getWidth();
36+
// int h = canvas.getHeight();
37+
38+
// canvas.clipRect(0,0,w*2,h*2, Region.Op.REPLACE);
39+
// canvas.drawColor(0x6600ff00);
40+
// System.out.println("w:h " + w + " " + h);
41+
42+
43+
44+
//
45+
/*
46+
private RenderNode(String name, View owningView) {
47+
147 mNativeRenderNode = nCreate(name);
48+
148 NoImagePreloadHolder.sRegistry.registerNativeAllocation(this, mNativeRenderNode);
49+
149 mOwningView = owningView;
50+
150 }
51+
151
52+
*/
53+
54+
((Canvas) element).drawColor(0x88FF0000);
55+
56+
try {
57+
Field mWidthF = DisplayListCanvas.class.getDeclaredField("mWidth");
58+
mWidthF.setAccessible(true);
59+
int mWidth = (int) mWidthF.get(element);
60+
61+
Field mHeightF = DisplayListCanvas.class.getDeclaredField("mHeight");
62+
mHeightF.setAccessible(true);
63+
int mHeight = (int) mHeightF.get(element);
64+
65+
66+
Field field = DisplayListCanvas.class.getDeclaredField("mNode");
67+
field.setAccessible(true);
68+
RenderNode renderNode = (RenderNode) field.get(element);
69+
if (renderNode == null) {
70+
System.out.println(element + ":" + renderNode + ":" + mWidth + ":" + mHeight);
71+
} else {
72+
Field mOwningViewField = RenderNode.class.getDeclaredField("mOwningView");
73+
mOwningViewField.setAccessible(true);
74+
View view = (View) mOwningViewField.get(renderNode);
75+
System.out.println(element + ":" + renderNode + ":" + mWidth + ":" + mHeight + ":" + view);
76+
}
77+
78+
} catch (Exception e) {
79+
throw new RuntimeException(e);
80+
}
81+
82+
return origin.release(element);
83+
}
84+
}

saklib/src/main/java/com/wanjian/sak/utils/OptionPanelUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public static void showEntrance(final Application application, final Config conf
2727

2828
// SAKEntranceView entranceView = new SAKEntranceView(application);
2929
final ImageView entranceView = new ImageView(application);
30-
entranceView.setImageResource(R.drawable.sak_entrance_icon);
30+
entranceView.setImageResource(R.drawable.sak_launcher_icon);
3131
int size = ScreenUtils.dp2px(application, 40);
3232
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(size, size);
3333

8.79 KB
Loading

saklib/src/main/res/values-zh/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,5 @@
3838
<string name="sak_performance_touch">Touch</string>
3939
<string name="sak_performance_handler">Handler</string>
4040
<string name="sak_pick_view">控件拾取</string>
41+
<string name="sak_flash_when_ui_update">UI更新时闪烁</string>
4142
</resources>

saklib/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,5 @@
3838
<string name="sak_performance_touch">Touch</string>
3939
<string name="sak_performance_handler">Handler</string>
4040
<string name="sak_pick_view">Pick View</string>
41+
<string name="sak_flash_when_ui_update">Flash When UI Update</string>
4142
</resources>

systemlib/src/main/java/android/graphics/RecordingCanvas.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package android.graphics;
22

3+
import android.util.Pools;
4+
35
public class RecordingCanvas extends Canvas {
6+
private static final int POOL_LIMIT = 25;
7+
private static final Pools.SynchronizedPool<RecordingCanvas> sPool =
8+
new Pools.SynchronizedPool<>(POOL_LIMIT);
49

510

611
public void enableZ() {

0 commit comments

Comments
 (0)