圆形轨迹在 canvas 上淡出
Circle trail fade out on canvas
我正在尝试修改我的 Canvas 和触摸事件,以便当用户仍在沿 canvas 移动时绘制到它的圆圈最终会淡出。
像这样:
随着时间的推移,较小的圆圈逐渐淡出。
我已经解决了大多数与位图相关的类似问题。我一直在努力实现这些问题中建议的技巧,因为我的圆坐标存储到一个循环并绘制的 ArrayList,而不是绘制到 canvas 的单个 shape/image。
以下是我到目前为止所写的内容:
case MotionEvent.ACTION_MOVE: {
if (inCircle(event, sceneView.circleRadius - 30)) {
int pointer = event.getPointerCount();
Point xyPoint = new Point();
for (int i = 0; i < pointer; i++) {
xInput = (int) event.getX() - (50 / 2);
yInput = (int) event.getY() - (50 / 2);
colorList.add(getCircleColor(sceneView.myBitmap));
xyPoint.x = xInput;
xyPoint.y = yInput;
pointList.add(xyPoint);
}
invalidate();
return true;
}
}
和 onDraw:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < pointList.size(); i++) {
Point p = pointList.get(i);
touchCircle.setColor(colorList.get(i));
canvas.drawCircle(p.x, p.y, touchRadius, touchCircle);
}
}
我尝试修改 ArrayList 栏中圆圈的 alpha 值,最后一个元素以反映淡出,但这会导致断断续续的效果,而不是所有先前点的平滑淡出。
抱歉,如果这个问题重复出现,我非常感谢您就如何解决这个问题提出一些意见。
如果有什么我需要澄清的,请告诉我。
如果您想要平滑的淡出效果,您需要使用 Handlers
设置动画。这个想法是,如果你想让你的淡出非常平滑,你需要在很短的时间间隔内调用 onDraw()
。这就是使淡出平滑的方法。您正面临卡顿效应,因为您没有调用 onDraw()
足够的次数。
你需要的是 Handler
并且你需要在很短的时间内 post 一个 Runnable
。这样您将 invalidate()
多次并使淡出尽可能平滑。
如果您想知道如何使用Handler
,可以google。我曾开发过一个分页控件,我在其中使用了它,您也可以参考它:https://github.com/Madrapps/pagination/blob/master/src/main/java/com/instrap/apps/pagination/views/MovingDots.java。这与您的用例无关,但会让您了解如何使用 Handlers
和 Runnable
在自定义视图中执行动画。
我正在尝试修改我的 Canvas 和触摸事件,以便当用户仍在沿 canvas 移动时绘制到它的圆圈最终会淡出。
像这样:
随着时间的推移,较小的圆圈逐渐淡出。
我已经解决了大多数与位图相关的类似问题。我一直在努力实现这些问题中建议的技巧,因为我的圆坐标存储到一个循环并绘制的 ArrayList,而不是绘制到 canvas 的单个 shape/image。
以下是我到目前为止所写的内容:
case MotionEvent.ACTION_MOVE: {
if (inCircle(event, sceneView.circleRadius - 30)) {
int pointer = event.getPointerCount();
Point xyPoint = new Point();
for (int i = 0; i < pointer; i++) {
xInput = (int) event.getX() - (50 / 2);
yInput = (int) event.getY() - (50 / 2);
colorList.add(getCircleColor(sceneView.myBitmap));
xyPoint.x = xInput;
xyPoint.y = yInput;
pointList.add(xyPoint);
}
invalidate();
return true;
}
}
和 onDraw:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < pointList.size(); i++) {
Point p = pointList.get(i);
touchCircle.setColor(colorList.get(i));
canvas.drawCircle(p.x, p.y, touchRadius, touchCircle);
}
}
我尝试修改 ArrayList 栏中圆圈的 alpha 值,最后一个元素以反映淡出,但这会导致断断续续的效果,而不是所有先前点的平滑淡出。
抱歉,如果这个问题重复出现,我非常感谢您就如何解决这个问题提出一些意见。
如果有什么我需要澄清的,请告诉我。
如果您想要平滑的淡出效果,您需要使用 Handlers
设置动画。这个想法是,如果你想让你的淡出非常平滑,你需要在很短的时间间隔内调用 onDraw()
。这就是使淡出平滑的方法。您正面临卡顿效应,因为您没有调用 onDraw()
足够的次数。
你需要的是 Handler
并且你需要在很短的时间内 post 一个 Runnable
。这样您将 invalidate()
多次并使淡出尽可能平滑。
如果您想知道如何使用Handler
,可以google。我曾开发过一个分页控件,我在其中使用了它,您也可以参考它:https://github.com/Madrapps/pagination/blob/master/src/main/java/com/instrap/apps/pagination/views/MovingDots.java。这与您的用例无关,但会让您了解如何使用 Handlers
和 Runnable
在自定义视图中执行动画。