如何实现这样的运动模糊效果?
How to achieve a motion blur effect like this?
Smartisan OS 有一个天气应用程序有这样的效果:将格式从摄氏度更改为华氏度时,温度数字将滚动如下:
Motion blur effect sample
我认为这不是简单的数字滚动时的模糊效果,因为从图像中可以看出这些数字仅在垂直方向上模糊。数字先以低速滚动,然后再快速滚动。而且滚动时模糊半径也变长了。对于我来说,这样的效果可不是那么容易实现的。
只需创建一个始终在 canvas 上绘制的自定义视图。你必须自己处理上下移动,在那种情况下你将无法使用简单的 built-in ui 元素。一旦你想要滚动效果,只需多次绘制移动文本,但每次都稍微偏移它并改变它的不透明度,具体取决于它的速度。
在这种情况下使用 OpenGL 可能有点矫枉过正,因为这种情况只是关于文本的。运动模糊太难实现并且性能很重,将文本绘制到 canvas 十几次对性能影响很小。
希望能帮到你。
@andras 的相同解决方案
/**
* use for 2D-Radial-Blur
*
* @param src
* @param dx It effetcs the speed. you can use 1/-1 for a test
* @param dy It effetcs the speed. you can use 1/-1 for a test
* @param times effects motion length
* @return
*/
public static Bitmap doRadialBlur(Bitmap src, int dx, int dy, int times) {
Bitmap dst = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(dst);
Matrix matrix = new Matrix();
Paint paint = new Paint();
canvas.drawBitmap(src, matrix, paint);
paint.setAlpha(51); // 51 / 255 =20%
for (int i = 0; i < times; i++) {
matrix.setTranslate(i * dx, i * dy);
canvas.drawBitmap(src, matrix, paint);
}
return dst;
}
Smartisan OS 有一个天气应用程序有这样的效果:将格式从摄氏度更改为华氏度时,温度数字将滚动如下: Motion blur effect sample
我认为这不是简单的数字滚动时的模糊效果,因为从图像中可以看出这些数字仅在垂直方向上模糊。数字先以低速滚动,然后再快速滚动。而且滚动时模糊半径也变长了。对于我来说,这样的效果可不是那么容易实现的。
只需创建一个始终在 canvas 上绘制的自定义视图。你必须自己处理上下移动,在那种情况下你将无法使用简单的 built-in ui 元素。一旦你想要滚动效果,只需多次绘制移动文本,但每次都稍微偏移它并改变它的不透明度,具体取决于它的速度。
在这种情况下使用 OpenGL 可能有点矫枉过正,因为这种情况只是关于文本的。运动模糊太难实现并且性能很重,将文本绘制到 canvas 十几次对性能影响很小。
希望能帮到你。
@andras 的相同解决方案
/**
* use for 2D-Radial-Blur
*
* @param src
* @param dx It effetcs the speed. you can use 1/-1 for a test
* @param dy It effetcs the speed. you can use 1/-1 for a test
* @param times effects motion length
* @return
*/
public static Bitmap doRadialBlur(Bitmap src, int dx, int dy, int times) {
Bitmap dst = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(dst);
Matrix matrix = new Matrix();
Paint paint = new Paint();
canvas.drawBitmap(src, matrix, paint);
paint.setAlpha(51); // 51 / 255 =20%
for (int i = 0; i < times; i++) {
matrix.setTranslate(i * dx, i * dy);
canvas.drawBitmap(src, matrix, paint);
}
return dst;
}