Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android图像动画-沿着轨迹移动_Android_Translate Animation - Fatal编程技术网

Android图像动画-沿着轨迹移动

Android图像动画-沿着轨迹移动,android,translate-animation,Android,Translate Animation,我希望在我的活动中有一个动画图像: 只是一个在轨道上移动的白色圆圈(黑线) 最好的方法是什么 翻译动画 帧动画 帆布 实施可以是: 白色圆圈是一个带有透明背景的小图像视图。它被放置在另一个ImageView(黑色曲线)的顶部 FrameAnimation:对于圆的每个位置,整个屏幕都有一个单独的png图像,这是一个动画帧 对白点的每次移动使用drawCircle()和restoreBackgroundImage() 到目前为止,我尝试了一个FrameAnimation,但是我只得到了10帧的内

我希望在我的活动中有一个动画图像: 只是一个在轨道上移动的白色圆圈(黑线)

最好的方法是什么

  • 翻译动画
  • 帧动画
  • 帆布
  • 实施可以是:

  • 白色圆圈是一个带有透明背景的小图像视图。它被放置在另一个ImageView(黑色曲线)的顶部
  • FrameAnimation:对于圆的每个位置,整个屏幕都有一个单独的png图像,这是一个动画帧
  • 对白点的每次移动使用drawCircle()和restoreBackgroundImage()

  • 到目前为止,我尝试了一个FrameAnimation,但是我只得到了10帧的内存错误。

    下面的代码实现了
    画布的方式。效率高,没有空间。您只需将轨迹更改为
    路径
    对象

    public class TestView extends View {
        private Path path;
        private Paint pathPaint;
        private Paint dotPaint;
        private long beginTime;
        private long duration = 3000;
        private float dotRadius = 3;
        private PathMeasure pm;
    
        public TestView(Context context) {
            super(context);
            init();
        }
    
        public TestView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    
        public TestView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init();
        }
    
        private void init() {
            path = new Path();
            path.moveTo(0, 100);
            path.lineTo(100, 200);
            path.lineTo(200, 50);
            //TODO: Put your path here
    
            pm = new PathMeasure(path, false);
            pathPaint = new Paint();
            pathPaint.setARGB(255, 0, 0, 0);
            pathPaint.setStrokeWidth(2);
            pathPaint.setStyle(Paint.Style.STROKE);
            dotPaint = new Paint();
            dotPaint.setARGB(255, 255, 255, 255);
            dotPaint.setStyle(Paint.Style.FILL);
            beginTime = 0;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawARGB(0, 0, 0, 0);
            canvas.drawPath(path, pathPaint);
    
            long currentTime = System.currentTimeMillis();
            float currentDistance;
    
            if (beginTime == 0) {
                beginTime = currentTime;
                currentDistance = 0;
            } else if (beginTime > 0 && currentTime - beginTime < duration) {
                currentDistance = (float) (currentTime - beginTime) / (float) duration * pm.getLength();
            } else {
                beginTime = -1;
                return;
            }
    
            float pos[] = new float[2];
            pm.getPosTan(currentDistance, pos, null);
            canvas.drawCircle(pos[0], pos[1], dotRadius, dotPaint);
            invalidate();
        }
    }
    
    公共类TestView扩展了视图{
    专用路径;
    私人涂料;
    私人涂料;
    私人长辈;
    私人长时长=3000;
    专用浮点数半径=3;
    私人道路测量pm;
    公共测试视图(上下文){
    超级(上下文);
    init();
    }
    公共测试视图(上下文、属性集属性){
    超级(上下文,attrs);
    init();
    }
    公共测试视图(上下文上下文、属性集属性、int-defStyleAttr){
    super(上下文、attrs、defStyleAttr);
    init();
    }
    私有void init(){
    路径=新路径();
    path.moveTo(0100);
    线路图(100200);
    线路图(200,50);
    //TODO:把你的路径放在这里
    pm=新路径度量(路径,false);
    pathPaint=新绘制();
    setARGB(255,0,0,0);
    pathPaint.设置行程宽度(2);
    pathPaint.setStyle(Paint.Style.STROKE);
    dotPaint=新油漆();
    setARGB(255、255、255、255);
    dotPaint.setStyle(Paint.Style.FILL);
    起始时间=0;
    }
    @凌驾
    受保护的void onDraw(画布){
    drawARGB(0,0,0,0);
    canvas.drawPath(路径,pathPaint);
    长currentTime=System.currentTimeMillis();
    浮动电流距离;
    如果(开始时间==0){
    开始时间=当前时间;
    当前距离=0;
    }else if(开始时间>0&¤tTime-beginTime<持续时间){
    currentDistance=(float)(currentTime-beginTime)/(float)持续时间*pm.getLength();
    }否则{
    开始时间=-1;
    返回;
    }
    浮动位置[]=新浮动[2];
    pm.getPosTan(当前距离,位置,空);
    画布.绘图圈(位置[0],位置[1],点半径,点绘制);
    使无效();
    }
    }
    
    试试看