android长截屏原理及实现代码
发布时间:2020-08-31 06:55:16
来源:脚本之家
阅读:158
作者:Android笔记
小米系统自带的长截屏应该很多人都用过,效果不错。当长截屏时listview就会自动滚动,当按下停止截屏时,就会得到一张完整的截屏。
该篇就介绍一下长截屏的原理
上篇中介绍了android屏幕共享实现方式,该篇的原理和上一篇基本一致。
获取view影像
当我们想得到一个view的影像时,我们可以调用系统api,得到view的bitmap,但有时可能得不到。我们可以通过另一种方式得到。
首先创建一个和view一样大小的bitmap
复制代码 代码如下:
Bitmap bmp = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.RGB_565);
然后把view绘制到bmp上
Canvas canvas = new Canvas();
canvas.setBitmap(bmp);
view.draw(canvas);
执行完上面代码后bmp上就是view的影像了。
制造滚动事件,促使view滚动
我们可以创建一个MotionEvent,然后定时修改MotionEvent的y值,并分发给view,从而促使view上下滚动。当然我们也可以定时修改x值促使view左右滚动。
代码大致如下
final MotionEvent motionEvent = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, view.getWidth() / 2, view.getHeight() / 2, 0);
view.postDelayed(new Runnable() {
@Override
public void run() {
motionEvent.setAction(MotionEvent.ACTION_MOVE);
motionEvent.setLocation((int) motionEvent.getX(), (int) motionEvent.getY() - 1);
//把事件分发给view
view.dispatchTouchEvent(motionEvent);
view.postDelayed(this, DELAY);
}
}, DELAY);
注意:从分发DOWN事件到结束都要使用同一个MotionEvent对象,只需要不断改变x或y值。
每次x或y的值相对于上次改动不能过大,若过大,view实际滚动距离可能达不到为MotionEvent设置的值(因view滚动时卡顿导致)。
截屏
当为MotionEvent设置的x或y值正好时当前view的大小时,创建新的bitmap,通过上述方法把view绘制到bitmap上,想要停止截屏时拼接所有bitmap即可。
备注
当我们想要把Listview长截屏时,需要为ListView外面嵌套一层和ListView一样大小的View,以上的所有操作都在嵌套的这层view上操作。当我们调用嵌套的这层view的draw(new Canvas(bmp))时会把当前看到的这块ListView绘制到bmp上,不管ListView嵌套了多少层子view都可以绘制到当前bmp上。
由于ListView中根据滑动的距离是否大于ViewConfiguration.get(view.getContext()).getScaledTouchSlop() )来确定要不要滚动,所以一开始我们要特殊处理下,为什么是ViewConfig