android - 如何在带有动画的 Android Canvas 上绘制路径?

标签 android android-animation android-canvas

我正在制作一个 Android 应用程序,但我有一件棘手的事情要做。 我需要在 Canvas 上绘制一条路径,但绘图应该是动画的(即,一点一点地绘制,并稍有延迟)。

是否可以使用 Android SDK 制作类似的东西? 如果没有,我怎么能产生这种效果?

最佳答案

试试这段代码,我用它用 Path & Canvas 画了一个心跳:

public class TestActivity extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new HeartbeatView(this));

    }

    public static class HeartbeatView extends View {

        private static Paint paint;
        private int screenW, screenH;
        private float X, Y;
        private Path path;
        private float initialScreenW;
        private float initialX, plusX;
        private float TX;
        private boolean translate;
        private int flash;
        private Context context;


        public HeartbeatView(Context context) {
            super(context);

            this.context=context;

            paint = new Paint();
            paint.setColor(Color.argb(0xff, 0x99, 0x00, 0x00));
            paint.setStrokeWidth(10);
            paint.setAntiAlias(true);
            paint.setStrokeCap(Paint.Cap.ROUND);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setStyle(Paint.Style.STROKE);
            paint.setShadowLayer(7, 0, 0, Color.RED);


            path= new Path();
            TX=0;
            translate=false;

            flash=0;

        }

        @Override
        public void onSizeChanged (int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);

            screenW = w;
            screenH = h;
            X = 0;
            Y = (screenH/2)+(screenH/4)+(screenH/10);

            initialScreenW=screenW;
            initialX=((screenW/2)+(screenW/4));
            plusX=(screenW/24);

            path.moveTo(X, Y);

        }



        @Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            //canvas.save();    


            flash+=1;
            if(flash<10 || (flash>20 && flash<30))
            {
                paint.setStrokeWidth(16);
                paint.setColor(Color.RED);
                paint.setShadowLayer(12, 0, 0, Color.RED);
            }
            else
            {
                paint.setStrokeWidth(10);
                paint.setColor(Color.argb(0xff, 0x99, 0x00, 0x00));
                paint.setShadowLayer(7, 0, 0, Color.RED);
            }

            if(flash==100)
            {
                flash=0;
            }

            path.lineTo(X,Y);
            canvas.translate(-TX, 0);
            if(translate==true)
            {
                TX+=4;
            }

            if(X<initialX)
            {
                X+=8;
            }
            else
            {
                if(X<initialX+plusX)
                {
                    X+=2;
                    Y-=8;
                }
                else
                {
                    if(X<initialX+(plusX*2))
                    {
                        X+=2;
                        Y+=14;
                    }
                    else
                    {
                        if(X<initialX+(plusX*3))
                        {
                            X+=2;
                            Y-=12;
                        }
                        else
                        {
                            if(X<initialX+(plusX*4))
                            {
                                X+=2;
                                Y+=6;
                            }
                            else
                            {
                                if(X<initialScreenW)
                                {
                                    X+=8;
                                }
                                else
                                {
                                    translate=true;
                                    initialX=initialX+initialScreenW;
                                }
                            }
                        }
                    }
                }

            }

            canvas.drawPath(path, paint);


            //canvas.restore(); 

            invalidate();
        }
    }

}

它使用计数器逐点绘制路径,并带有几个效果。你可以把你需要的东西转移到更高效的SurfaceView。

关于android - 如何在带有动画的 Android Canvas 上绘制路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12037709/

相关文章:

java - Android:如何像现在这样快速执行这个for循环?

android - 香气安装程序问题

android - 按数据 ID 更新联系人数据

android - 如何在 list 文件中添加后置摄像头的要求?

android - 在搜索栏中的两个连续进度点之间添加流畅的动画

android - 如何在 Android 的 ObjectAnimator 中给出百分比值

Android - 在 Canvas 上绘制具有纯色背景的文本以用作位图

android - 使用 cordova-plugin-camera 拍摄照片时获取手机方向

Android Spinner 显示动画 Material 设计

java - Canvas.clipRegion(区域区域)已弃用