onDraw( ) 是同步方法 ,如果同时绘制的数据量太大就会卡顿 (例如100万个坐标点);
优化方法如下:
- 数据量太大的时候,可以考虑在UI效果和流畅度上面平衡一下;
例如:
A. setAntiAlias( ) 抗锯齿功能,会消耗较大资源,绘制图形速度会变慢;
B. setDither(boolean dither); setFilterBitmap(boolean filter) 等...
显示的效果越好 ,效率越差....
2.异步加载, 数据量大但是你界面也不能卡啊 ,加载到数据后用线程池维护一下,创建线程也是个耗资源的事情;
3.onDraw() 方法里面尽量不要用for循环 ,onDraw()是同步的,主线程的, for循环会导致卡顿,可以用path去装载要绘制的点,然后drawPath()来代替for循环,如果自定义view是随手势滑动,那么也就是会频繁刷新界面、频繁调用onDraw(), 如果是频繁刷新onDraw(),那么使用drawPath()也会比在onDraw()里面使用for循环绘制效率高;
4.用Canvas生成bitmap , 再到这个bitmap上面drawPath( ), 最后将这个bitmap传递给你自己的view的onDraw( )方法上面去执行drawBitmap( ) , 这样相当于主线程上只绘制一张图而已;
5.用Canvas生成的bitmap,每次执行canvas.drawXXX() 都会生成新的bitmap, 绘制增量数据的时候只需要再次调用canvas.drawXXX(),然后就可以生成新的bitmap,这时候将bitmap传递给你自己的view的onDraw( )就可以生成新的效果;
6.RGB_565 替换 ARGB_8888 , 先创造个小的bitmap , drawBitmap的时候将bitmap拉大;例如:屏幕是10241024, 如果使用Bitmap.createBitmap(Width(), Height() , Bitmap.Config.RGB_565);那么bitmap的大小是: (10241024*2) / (1024 *1024 )= 2M;
将bitmap宽高缩小, matrix.setScale(float sx, float sy) 放大;
public void drawBitmap(@NonNull Bitmap bitmap, @NonNull Matrix matrix, @Nullable Paint paint) {
super.drawBitmap(bitmap, matrix, paint);
}
7.避免多次遍历, 遍历的时候尽量少换算;
8.终极大招: 拿到数据后用将数据解析成byte[] 二进制流, 固定BMP文件头和BMP文件信息头,将二进制流转成BMP图片, 最后将这张图片设置为底图;
9.最后销毁的时候记得将所有的资源回收一下就欧了;
参考博文:https://blog.csdn.net/wulazula/article/details/51337497
网友评论