public class ObservableArrayList extends ArrayList {
private List mListeners = new ArrayList<>();
public void addOnListChangedListener(OnListChangeListener listener) {
if (mListeners != null) {
mListeners.add(listener);
}
}
public void removeOnListChangedListener(OnListChangeListener listener) {
if (mListeners != null) {
mListeners.remove(listener);
}
}
@Override
public boolean add(T object) {
super.add(object);
notifyAdd(size() - 1, 1);
return true;
}
@Override
public void add(int index, T object) {
super.add(index, object);
notifyAdd(index, 1);
}
@Override
public boolean addAll(Collection<? extends T> collection) {
int oldSize = size();
boolean added = super.addAll(collection);
if (added) {
notifyAdd(oldSize, size() - oldSize);
}
return added;
}
@Override
public void clear() {
int oldSize = size();
super.clear();
if (oldSize != 0) {
notifyRemove(0, oldSize);
}
}
@Override
public T remove(int index) {
T val = super.remove(index);
notifyRemove(index, 1);
return val;
}
@Override
public boolean remove(Object object) {
int index = indexOf(object);
if (index >= 0) {
remove(index);
return true;
} else {
return false;
}
}
@Override
public T set(int index, T object) {
T val = super.set(index, object);
if (mListeners != null) {
for (OnListChangeListener listener : mListeners) {
listener.onChange(this, index, 1);
}
}
return val;
}
@Override
protected void removeRange(int fromIndex, int toIndex) {
super.removeRange(fromIndex, toIndex);
notifyRemove(fromIndex, toIndex - fromIndex);
}
private void notifyAdd(int start, int count) {
if (mListeners != null) {
for (OnListChangeListener listener : mListeners) {
listener.onAdd(this, start, count);
}
}
}
private void notifyRemove(int start, int count) {
if (mListeners != null) {
for (OnListChangeListener listener : mListeners) {
listener.onRemove(this, start, count);
}
}
}
public interface OnListChangeListener {
void onChange(ArrayList list, int index, int count);
void onAdd(ArrayList list, int start, int count);
void onRemove(ArrayList list, int start, int count);
}
}
接下来就是执行hook操作:
/**
- @param enable 是否开启全局灰色调
*/
public static void enable(boolean enable) {
if (!enable) {
return;
}
try {
//灰色调Paint
final Paint mPaint = new Paint();
ColorMatrix mColorMatrix = new ColorMatrix();
mColorMatrix.setSaturation(0);
mPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));
//反射获取windowManagerGlobal
@SuppressLint(“PrivateApi”)
Class<?> windowManagerGlobal = Class.forName(“android.view.WindowManagerGlobal”);
@SuppressLint(“DiscouragedPrivateApi”)
java.lang.reflect.Method getInstanceMethod = windowManagerGlobal.getDeclaredMethod(“getInstance”);
getInstanceMethod.setAccessible(true);
Object windowManagerGlobalInstance = getInstanceMethod.invoke(windowManagerGlobal);
//反射获取mViews
Field mViewsField = windowManagerGlobal.getDeclaredField(“mViews”);
mViewsField.setAccessible(true);
Object mViewsObject = mViewsField.get(windowManagerGlobalInstance);
//创建具有数据感知能力的ObservableArrayList
ObservableArrayList observerArrayList = new ObservableArrayList<>();
observerArrayList.addOnListChangedListener(new ObservableArrayList.OnListChangeListener() {
@Override
public void onChange(ArrayList list, int index, int count) {
}
@Override
public void onAdd(ArrayList list, int start, int count) {
View view = (View) list.get(start);
if (view != null) {
view.setLayerType(View.LAYER_TYPE_HARDWARE, mPaint);
}
}
@Override
public void onRemove(ArrayList list, int start, int count) {
}
});
//将原有的数据添加到新创建的list
observerArrayList.addAll((ArrayList) mViewsObject);
//替换掉原有的mViews
mViewsField.set(windowManagerGlobalInstance, observerArrayList);
} catch (Exception e) {
e.printStackTrace();
}
}
最后,只需在Application的onCreate中调用上述代码进行hook即可。
已知存在的问题
-
开启了View的硬件加速,可能会存在兼容性问题
-
对于SurfaceView和Textureview以及其子类无效
对于问题1笔者在项目中暂未遇到问题,如果读者朋友们在项目中遇到兼容性问题,欢迎留言;
总结
作为一名从事Android的开发者,很多人最近都在和我吐槽Android是不是快要凉了?而在我看来这正是市场成熟的表现,所有的市场都是温水煮青蛙,永远会淘汰掉不愿意学习改变,安于现状的那批人,希望所有的人能在大浪淘沙中留下来,因为对于市场的逐渐成熟,平凡并不是我们唯一的答案!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
未遇到问题,如果读者朋友们在项目中遇到兼容性问题,欢迎留言;
总结
作为一名从事Android的开发者,很多人最近都在和我吐槽Android是不是快要凉了?而在我看来这正是市场成熟的表现,所有的市场都是温水煮青蛙,永远会淘汰掉不愿意学习改变,安于现状的那批人,希望所有的人能在大浪淘沙中留下来,因为对于市场的逐渐成熟,平凡并不是我们唯一的答案!
[外链图片转存中…(img-cFISaala-1714654654503)]
[外链图片转存中…(img-JVqE4AnV-1714654654506)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!