【问题标题】:Android, move bitmap along a path?Android,沿路径移动位图?
【发布时间】:2011-05-26 12:29:59
【问题描述】:

我想知道是否可以从路径中选择坐标来随着时间的推移绘制位图,例如,我有一张太阳的图像,我想随着时间的推移沿着弧形路径移动它.

有什么方法可以定义这样的路径,然后沿着它移动,这样我就不必进行数学计算了吗?

谢谢。

【问题讨论】:

  • 这个问题已经 5 年了,我仍然看到答案。
  • 这个问题已经 5 岁了,我仍然看到答案。我年纪大了,而且,嗯,现在年纪大了,就个人而言,我现在会使用正弦曲线来做这个。 (数学.sin())。介于 0 和 Pi 之间的弧度将为您提供 180 度,或者您可以将 X 和 Y 值相乘或相除以给出更宽/更紧的弧线,但这就是正弦波的所有基本数学。增加/循环计时器或绘图循环中的值。 (通过每帧移动一小部分像素,以毫秒为单位使用浮点值来获得平滑的移动)

标签: android animation path bitmap


【解决方案1】:

我正在考虑一种解决方案:

         _
       /   \

如果您的弧线具有这种形状(意味着小于半个圆并且水平放置),那么您可以迭代 x 值并为此 x 获取路径上的 y。然后将您的位图移动到该位置。

【讨论】:

  • 这就是我最终实现它的方式。我希望的 Wat 是一个类似 iOS 的路径功能,但它似乎不可用。
  • 现在我正在思考并搜索了一些关于此的内容,我很好奇:您是如何获得路径上特定 x 值的点的?
  • 我最终只是在几条直线上移动,构成曲线或其他模式。所以,在你上面的 ASCII 艺术的情况下,有 3 条直线。
【解决方案2】:

是的,可以沿路径移动图像。我将提供简单的解决方案来展示原理。以下代码将移动和旋转您的图像。如果您不需要旋转,请删除 TANGENT_MATRIX_FLAG 标志。

import android.graphics.*;
//somewhere global
int iCurStep = 0;// current step

//don't forget to initialize
Path pathMoveAlong = new Path();
private static Bitmap bmImage = null;

@Override
protected void onDraw(Canvas canvas) {
    Matrix mxTransform = new Matrix();
    PathMeasure pm = new PathMeasure(pathMoveAlong, false);
    float fSegmentLen = pm.getLength() / 20;//20 animation steps

    if (iCurStep <= 20) {
        pm.getMatrix(fSegmentLen * iCurStep, mxTransform,
            PathMeasure.POSITION_MATRIX_FLAG + PathMeasure.TANGENT_MATRIX_FLAG);
        canvas.drawBitmap(bmImage, mxTransform, null);
        iCurStep++;
        invalidate();
    } else {
        iCurStep = 0;
    };
};

【讨论】:

  • 嗨,Eduard,您能否提供更多代码(活动、布局等...)?这不足以让我理解它是如何工作的。非常感谢!
  • 您是否介意使用真实图像和真实路径发送一些代码?
  • 好的,我用stackoverflow.com/questions/6154370/…得到它
【解决方案3】:

以下是我使用的动画师:

目的:沿路径“路径”移动视图“视图”

v21+:

ValueAnimator pathAnimator = ObjectAnimator.ofFloat(view, "x", "y", path)

v11+:

ValueAnimator pathAnimator = ValueAnimator.ofFloat(0.0f, 1.0f);

pathAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
float[] point = new float[2];

@Override
    public void onAnimationUpdate(ValueAnimator animation) {
        float val = animation.getAnimatedFraction();
        PathMeasure pathMeasure = new PathMeasure(path, true);
        pathMeasure.getPosTan(pathMeasure.getLength() * val, point, null);
        view.setX(point[0]);
        view.setY(point[1]);
    }
});

类似的要求:https://stackoverflow.com/a/30254715/4344057

【讨论】:

    猜你喜欢
    • 2011-09-03
    • 2011-08-20
    • 2011-01-22
    • 1970-01-01
    • 2017-10-31
    • 2013-04-20
    • 2013-04-29
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多