Android 如何在画布上匀速缓慢绘制多条线?

2024-04-11

我需要在Android中捕获标记在canvas上绘制图形,效果如下图所示:

好吧,到目前为止,我可以通过以下方式绘制一条等速的边值动画器。但是,我一次只能绘制一侧,因为在绘制下一侧时无法保存最后一侧。那么,有没有什么好的办法可以解决这个问题呢?

ValueAnimator慢速画线代码:

GraphicsView.java

public class GraphicsView extends View {
    private int stepX, stepY = 0;
    private int startX, startY, stopX, stopY = 0;
    private Paint paint = null;

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

        // Paint
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.STROKE);

        startX = 40;
        startY = 397;
        stopX  = 1040; 
        stopY  = 397;

        Init();
    }

    public void Init(){
        ValueAnimator animatorX = ValueAnimator.ofFloat(startX, stopX);
        ValueAnimator animatorY = ValueAnimator.ofFloat(startY, stopY);

        animatorX.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                stepX = Math.round((Float)valueAnimator.getAnimatedValue()); invalidate();
            }
        });
        animatorY.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                stepY = Math.round((Float)valueAnimator.getAnimatedValue()); invalidate();
            }
        });

        AnimatorSet set = new AnimatorSet();
        LinearInterpolator l = new LinearInterpolator();
        set.setInterpolator(l);
        set.setDuration(3000);
        set.playTogether(animatorX, animatorY);
        set.start();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawLine(startX, startY, stepX, stepY, paint);
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {   
    private Display display         = null;  
    private GraphicsView view       = null;  
    private ConstraintLayout layout = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        display = getWindowManager().getDefaultDisplay();
        layout = (ConstraintLayout)findViewById(R.id.main_layout);

        view = new GraphicsView(this);
        view.setMinimumWidth(display.getWidth());
        view.setMinimumHeight(display.getHeight());   
        layout.addView(view);
    }
}

您可以使用ObjectAnimator类来回调 每当您想绘制更多的路径时,就调用您的类方法之一。

import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathEffect;
import android.graphics.PathMeasure;
import android.util.AttributeSet;
import android.view.View;
import android.util.Log;

public class PathView extends View
{
    Path path;
    Paint paint;
    float length;

    public PathView(Context context)
    {
        super(context);
    }

    public PathView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public PathView(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
    }

    public void init()
    {
        paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setStrokeWidth(10);
        paint.setStyle(Paint.Style.STROKE);

        path = new Path();
        path.moveTo(50, 50);
        path.lineTo(50, 500);
        path.lineTo(200, 500);
        path.lineTo(200, 300);
        path.lineTo(350, 300);

        // Measure the path
        PathMeasure measure = new PathMeasure(path, false);
        length = measure.getLength();

        float[] intervals = new float[]{length, length};

        ObjectAnimator animator = ObjectAnimator.ofFloat(PathView.this, "phase", 1.0f, 0.0f);
        animator.setDuration(3000);
        animator.start();
    }

    //is called by animtor object
    public void setPhase(float phase)
    {
        Log.d("pathview","setPhase called with:" + String.valueOf(phase));
        paint.setPathEffect(createPathEffect(length, phase, 0.0f));
        invalidate();//will calll onDraw
    }

    private static PathEffect createPathEffect(float pathLength, float phase, float offset)
    {
        return new DashPathEffect(new float[] { pathLength, pathLength },
            Math.max(phase * pathLength, offset));
    }

    @Override
    public void onDraw(Canvas c)
    {
        super.onDraw(c);
        c.drawPath(path, paint);
    }
}

然后,只需调用 init() 来开始动画,如下所示(或者如果您希望它在视图膨胀后立即启动,请将 init() 调用放在构造函数中):

PathView path_view = (PathView) root_view.findViewById(R.id.path);
path_view.init();

另请参阅这个问题here https://stackoverflow.com/questions/24790936/weird-flickering-with-dashpatheffect-animation, and

使用值动画示例 https://stackoverflow.com/questions/18616035/how-to-animate-a-path-on-canvas-android

参考文献1 http://www.curious-creature.org/2013/12/21/android-recipe-4-path-tracing/

参考2 https://stackoverflow.com/questions/5367950/android-drawing-an-animated-line

参考文献3 https://stackoverflow.com/questions/47220112/drawing-multiple-lines-on-canvas-with-delay-in-between

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 如何在画布上匀速缓慢绘制多条线? 的相关文章

  • 具有空共享元素的内容转换 NPE

    我正在向一个相当大的应用程序添加内容过渡 在大多数情况下 我没有任何共享元素 但仍然想使用过渡动画 我已经将问题追溯到这行代码 ActivityOptionsCompat makeSceneTransitionAnimation activ
  • 在贝塞尔曲线路径上移动对象

    我想在贝塞尔曲线路径上从上到下移动图像 但我不知道如何计算该路径的 x y 点和斜率 该路径如下图所示 我有起点 终点和两个控制点 Path path new Path Point s new Point 150 5 Point cp1 n
  • 在 Eclipse 中调试时动态查看画布/位图

    有没有办法在 Eclipse 上调试画布 位图 我想知道当我在特定行设置断点时是否可以查看当前画布 位图的外观 现在可以在调试时查看位图 尽管仅适用于 Android Studio 来自版本 0 8 7 的发行说明 http tools a
  • 绘制带圆角的 LinearLayout

    我正在尝试实现一个用圆角绘制自身的 LinearLayout 子类 根据我的研究 我设定setWillNotDraw false 并被覆盖onDraw 在画布上绘制圆角矩形 Override protected void onDraw Ca
  • 如何让textview闪烁

    伙计们 我有一个文本视图 我需要它闪烁 请帮助我
  • 视图在 RotationY 动画接近结束时消失

    我正在尝试制作一个流畅的动画 其中占据大部分屏幕空间的视图旋转以显示背面的另一个视图 rotatingView animate rotationY 90 setDuration 250 setInterpolator new Acceler
  • 即使 ItemAnimator.canReuseUpdatedViewHolder() 返回 true,OnCreateViewHolder 仍会被调用

    我正在为我的 RecyclerView 构建更改动画 我已经覆盖了canReuseUpdatedViewHolder 回来true以保留先前的观看者 我开始动画animateChange 并打电话dispatchAnimationFinis
  • 动画:将 TextView 移动到另一个容器中

    I want to move in an anmiated way a TextView in a LinearLayout into another LinearLayout However I can t get it to move
  • Android 5 上的共享元素活动转换

    我想在从一个活动转到另一个活动时设置共享元素转换 第一个 Activity 有一个包含项目的 RecyclerView 单击某个项目时 该项目应以动画方式呈现到新活动 所以我设置了一个 最终活动视图以及回收器视图项目视图上的 android
  • 如何显示大于手机屏幕尺寸的图像?

    我有一个问题 但我没有找到真正一致的答案 这就是为什么我向你们伸出援手 我一直在尝试从以下意义上为我的应用程序实现 取景器 效果 我有一张巨大的图片 我希望能够 飞 过 水平和垂直滚动 直到到达边界 到目前为止 对此 或类似问题 的所有流行
  • 在 Canvas 上绘制两个 3D 字符串?

    我必须在画布上绘制 2 个字符串 字符串必须使用相同坐标第二根弦必须是第一根弦绕 Y 轴旋转 45 度的结果 结果必须如下所示 这是我的代码 Matrix matrix new Matrix matrix canvas getMatrix
  • 0x55a49d6cd0 (RippleDrawable) 上句柄为 0x55a46650d0 的 endAllStagingAnimators 的含义是什么

    在android中 当我运行我的应用程序时 我在logcat中得到了这个 我的应用程序是回合制游戏 例如井字游戏 每次点击更新网格板时都会有 2 个动画 1 个 YTransition 和其他旋转 没有问题 但是当我第一次运行应用程序时 会
  • android lollipop - setentertransition() 片段在退出时无法正常工作

    在替换片段时 我使用适用于 android lollipop 版本的幻灯片动画 对于这个特定的替换 它按预期工作 但是在按下后退按钮时 它首先弹出当前片段 然后执行输入动画的反向 滑出 private void replaceContent
  • 如何在 Android 中播放 GIF

    Hello stackoverflow我正在尝试开发一个 Android 应用程序来玩我自己的GIF 这是代码片段 MainActivity java public class MainActivity extends Activity O
  • 当文本模糊时,Android BlurMaskFilter 在 canvas.drawOval 中没有任何效果

    我一直在尝试创建一个自定义视图 其文本下的形状模糊 问题是 BlurMaskFilter 对我在画布上绘制的任何形状没有影响 以下是我在构造函数中初始化 Paint 对象的方法 paint new Paint 0 paint setColo
  • Android半圆形进度条-绘制半圆

    我用这个创建了一个半圆形进度条devadvance circularSeekBar https github com devadvance circularseekbar当我从调色板中选择自定义视图时 它看起来像这样 在此我有两个带有权重的
  • Android 用 Path 画圆

    我正在尝试绘制一个圆圈的动画 在我的自定义视图中 我有 private final Paint mPaint new Paint setDither true setStyle Paint Style STROKE setStrokeCap
  • 在 Android 中绘制一条带有弯曲边缘的线

    I am using canvas drawLine to draw some line in android but the lines are too sharp but i need a curved edges 这里的 1 是我所拥
  • 对话框动画被 webview 弄乱了:android bug?

    我制作了一个带有 进入 和 退出 慢速动画的对话框 但对话框包含一个 webviewmyMsg 加载本地文件 因此没有延迟 并弄乱了动画 使用下面的代码 无 Web 视图 对话框可以完美运行 在 Enter 和 Exit 时都具有动画效果
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v

随机推荐

  • Tensorflow - 断言失败:[预测必须在 [0, 1] 中]

    我正在使用EstimatorTensorflow的API和我遇到了以下问题 我想检查 f1 分数而不是准确性 当我在训练后评估时 根本没有问题 当我测试时 它要求标准化值 我已经标准化了 这是我的网络模型 第一部分省略 architectu
  • 获取远程服务器的准确时间

    在 C 中 如何查询远程服务器的当前时间 类似的功能 net time servername 但返回包含秒的日期戳 Thanks 您可以使用网络远程TOD http msdn microsoft com en us library aa37
  • cx_Oracle 无法识别 Linux 上安装的 Oracle 软件安装位置

    我已经能够在 Windows 8 笔记本电脑上成功安装 cx Oracle 以与 Python 3 4 一起使用 现在我尝试在 Linux 计算机上进行相同的设置 使用 Python 3 4 的 cx Oracle 从 cx Oracle
  • 你的 log4net 配置中有什么?黑客、优化、观察?

    这是我的 log4net 配置文件
  • 活动任务 SSIS 中的自定义日志记录

    我的 SSIS 包中面临两个问题 我的 SSIS 包有一个活动任务 根据我的要求格式化 Excel 工作表并将其保存为不同的文件 modified xlsx 然后在我的数据流任务中使用该文件来处理数据并将数据上传到数据库表 该包在我的本地系
  • java.lang.IllegalStateException:系统服务在 onCreate() 之前不可用于活动

    我遇到了一个例外 java lang IllegalStateException System services not available to Activities before onCreate 在 onResume 中重新初始化la
  • 自动打开、更新和保存 Excel 工作簿

    我想在Excel中自动修改列的数字格式 Set excel CreateObject Excel Application Set oWB excel Workbooks Open E Docs Invoice csv Excel Macro
  • 从 JSF 托管 bean 生成 CSS

    我有这个 CSS 代码 td data date 2016 03 08 background color F7F7F7 我想将它应用到我想从数据库加载的几个日期 所有这些都可能发生在我生成 CSS 代码的 JSF 托管 bean 中 所以我
  • 在UpSetR中,如何在交叉条上显示小数

    我正在为以下百分比数据制作一个翻转图 这是我的更复杂数据的虚拟示例 x 我希望这些百分比显示为小数 并且所有条形都可见 即使它是 0 1 所有数据在此图中都很重要 令人心烦意乱的情节 library UpSetR x lt c a 80 b
  • 如何使用 php 转义字符串中的单引号(撇号)

    我有一个这样的 SQL 查询 stmt pdo gt prepare SELECT FROM products keywords WHERE product type product type 我不知道它的价值是多少 产品类型多变的 但现在
  • 除 File.Move 之外更快的文件移动方法

    我有一个控制台应用程序大约需要 625 天才能完成 除非有办法让它更快 首先 我正在一个包含大约 4 000 000 个文件 如果不是更多的话 的目录中 我正在一个数据库中工作 每个文件都有一行 然后还有一些 现在使用 SQL 相对较快 瓶
  • 从 XBRL 文档中获取特定值

    我一直在使用Gepsio https github com JeffFerguson gepsio尝试通过他们的 EDGAR 系统翻阅标准 SEC XBRL 文件 尽管我多次尝试解决这一问题 但似乎我还是不知所措 当您从任何文档中提取事实
  • 如何使用 Animated.View 在本机反应中以动画形式展开/折叠文本预览

    我正在创建一个文本组件 默认情况下我希望它是 2 行 如果用户点击它 它将扩展到完整长度 如果用户再次点击它 它将折叠回 2 行 到目前为止 我的返回函数中有类似的内容
  • 了解 smb 和 DCERPC 的远程命令执行功能

    我试图了解通过 impacket 脚本在 Windows 上执行远程命令的所有可用方法 https www coresecurity com corelabs research open source tools impacket http
  • PyGame rect.move 运动无法正常运行

    我正在以打砖块克隆的形式开发我的第一个 pygame 应用程序 对于玩家桨 我检查主游戏循环中的按键保持情况 然后每帧重新绘制玩家对象的精灵 如下面的代码片段所示 class Player def init self self sprite
  • kotlin中val和final有什么区别?

    在Kotlin中 val用于使变量 属性不可更改 那么final有什么用呢 据我所知 在java中final用于限制继承或使变量常量 但在kotlin中val正在做常量部分那么final在kotlin中会做什么 While val and
  • 使用 TFS 命令行部署 SSIS 项目

    如何从 TFS 2015 部署 SSIS 项目 对于常规数据库项目来说 sqlpackage exe publish与发布配置文件 将 SSIS 项目模型自动部署到服务器中的命令行参数是什么 我们使用的是 SQL Server 2016 E
  • Oracle中不使用触发器的自动增量

    oracle中除了使用触发器还有哪些方式实现自增 您可以创建和使用预言序列 语法和详细信息位于http www techonthenet com oracle sequences php http www techonthenet com
  • Facebook 风格的 ASP.NET 聊天组件

    我将启动一个有点像社交媒体网站的网站 我需要一个基于 AJAX 的 ASP NET 聊天控件 如果有 jQuery 就太好了 因为我的整个网站将使用 jQuery 主题进行主题化 我正在寻找类似于 Gmail 或 Facebook 风格的聊
  • Android 如何在画布上匀速缓慢绘制多条线?

    我需要在Android中捕获标记在canvas上绘制图形 效果如下图所示 好吧 到目前为止 我可以通过以下方式绘制一条等速的边值动画器 但是 我一次只能绘制一侧 因为在绘制下一侧时无法保存最后一侧 那么 有没有什么好的办法可以解决这个问题呢