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