Android 安卓,沿着路径移动位图?

Android 安卓,沿着路径移动位图?,android,animation,path,bitmap,Android,Animation,Path,Bitmap,我想知道是否有可能从路径中选择坐标来绘制位图,例如,我有一个太阳的图像,我想随着时间的推移,沿着弧形路径移动它 有没有办法定义一条这样的路径,然后沿着它移动,这样我就不必用数学方法计算了 谢谢。我正在考虑一个解决方案: 如果你的弧有这种形状(意思是小于半个圆并且水平放置),那么你可以迭代x值,得到路径上的y。然后将位图移动到该位置。是的,可以沿路径移动图像。我将提供简单的解决方案来说明原理。以下代码将移动和旋转图像。如果不需要旋转,请删除切线矩阵标志 import android.graphic

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

有没有办法定义一条这样的路径,然后沿着它移动,这样我就不必用数学方法计算了


谢谢。

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


如果你的弧有这种形状(意思是小于半个圆并且水平放置),那么你可以迭代x值,得到路径上的y。然后将位图移动到该位置。

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

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;
    };
};
导入android.graphics.*;
//全球某地
int-iCurStep=0;//当前步骤
//别忘了初始化
路径路径movealong=新路径();
私有静态位图bmImage=null;
@凌驾
受保护的void onDraw(画布){
矩阵mxTransform=新矩阵();
PathMeasure pm=新的PathMeasure(PathMoveAward,false);
float fSegmentLen=pm.getLength()/20;//20个动画步骤

如果(iCurStep以下是我使用的动画师:

用途:沿路径“路径”移动视图“视图”

v21+:

v11+:


类似的要求:

这就是我最终实现它的方式。我希望的是像iOS一样的路径功能,但似乎不可用。现在我在思考并搜索了一下,我很好奇:你是如何得到路径上特定x值的点的?我最终只是沿着几条直线移动,这条直线是绘制一条曲线或其他图案。因此,如果你是上面提到的ASCII艺术,请用3条直线。嗨,Eduard,你能提供更多的代码(活动、布局等)吗?这还不足以让我理解它是如何工作的。非常感谢。你介意用真实的图像和真实的路径发送一些代码吗?好的,我用这个问题得到了它,现在我已经5岁了,我仍然看到答案。这个问题已经5岁了,我仍然看到答案。我更老了,好吧,现在更老了,还有人格lly,我现在可以使用正弦波(Math.sin())。0和πrads之间可以得到180度,或者你可以乘或除X和Y值以得到更宽/更紧的弧,但这都是正弦波的基本数学。在计时器或绘图循环中增加/循环值。(通过每帧移动一小部分像素,以毫秒为单位使用时间浮动值以获得平滑移动)
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;
    };
};
ValueAnimator pathAnimator = ObjectAnimator.ofFloat(view, "x", "y", path)
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]);
    }
});