圆形轨迹在 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。这与您的用例无关,但会让您了解如何使用 HandlersRunnable 在自定义视图中执行动画。