在android中的循环path中移动图像

我有一个图像,我想要移动它的循环pathonClick()事件的button没有animation,

我不知道该怎么做..任何帮助?


这是我的主要课程

 public class MainActivity extends Activity { MyAnimation animation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); animation =new MyAnimation (); } 

我正在使用你给出的代码

 public class MyAnimation extends Animation { float cx,cy,prevX,prevY,r; @Override protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); float angle = (float) (interpolatedTime * 2 * Math.PI); // r = radius, cx and cy = center point, a = angle (radians) float x = (float) (cx + r * Math.cos(angle)) ; float y = (float) (cy + r * Math.sin(angle)); float dx = prevX - x; float dy = prevY - y; prevX = x; prevY = y; t.getMatrix().setTranslate(dx, dy); } 

}

这是我想要以圆形移动的xml图像。

 <ImageView android:id="@+id/myanimation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:src="@drawable/ic_launcher" /> 

Solutions Collecting From Web of "在android中的循环path中移动图像"

我认为在这里有两个select:要么创build一个自定义的animation,要么创buildImageView,然后使用曲面自己绘制path。

第一个选项要容易得多,并且考虑到在animation类中使用Interpolators (线性时间,快速开始,结束正常等)为您处理时间,可能会给出更好的结果。 我强烈build议你写自定义animation,因为我不明白为什么你不想使用animation类(animation图像正是你想要的)。

编辑 :我花了一些时间,并执行以下。 这并不是一尘不染,而是通过循环的方式使图像animation化。

活动:

 public class MainActivity extends Activity { private ImageView image; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); image = (ImageView) findViewById(R.id.image); image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Animation anim = new MyAnimation(image, 100); anim.setDuration(3000); image.startAnimation(anim); } }); } } 

animation类:

 public class MyAnimation extends Animation { private View view; private float cx, cy; // center x,y position of circular path private float prevX, prevY; // previous x,y position of image during animation private float r; // radius of circle private float prevDx, prevDy; /** * @param view - View that will be animated * @param r - radius of circular path */ public MyAnimation(View view, float r){ this.view = view; this.r = r; } @Override public boolean willChangeBounds() { return true; } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { // calculate position of image center int cxImage = width / 2; int cyImage = height / 2; cx = view.getLeft() + cxImage; cy = view.getTop() + cyImage; // set previous position to center prevX = cx; prevY = cy; } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { if(interpolatedTime == 0){ t.getMatrix().setTranslate(prevDx, prevDy); return; } float angleDeg = (interpolatedTime * 360f + 90) % 360; float angleRad = (float) Math.toRadians(angleDeg); // r = radius, cx and cy = center point, a = angle (radians) float x = (float) (cx + r * Math.cos(angleRad)); float y = (float) (cy + r * Math.sin(angleRad)); float dx = prevX - x; float dy = prevY - y; prevX = x; prevY = y; prevDx = dx; prevDy = dy; t.getMatrix().setTranslate(dx, dy); } } 

XML布局:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:src="@drawable/ic_launcher" /> </RelativeLayout> 

你可能需要调整它在这里和那里得到你想要的东西,但这可以成为一个基础。