Intereting Posts
Как загрузить изображение с SD-карты с помощью библиотеки Picasso Остановите setrepeat Android alarmmanager Фрагмент, завышенный в Fragment Dialog, вызывает ошибку «Фрагмент не создавал вид» Как удалить подчеркивание ниже индикатора EditText? Вы должны использовать тему Theme.AppCompat (или потомка) с этим действием Не удалось разрешить целевые «Google Inc.: API Google: 16» Прокручивание направления в ViewPager Когда появляется мягкая клавиатура, это делает поле EditText потерянным фокусом Android два AsyncTasks серийно или параллельно? – Вторая заморозка, но результат в порядке Макет представления не обновляется при изменении ориентации в android Активность должна быть прозрачной, но имеет черный фон Можно ли сохранить массив JSON в SharedPreferences? Хранение секретного ключа на Android Неправильное положение шкалы после применения эффекта масштабирования на холсте Android InflateException с FloatingActionButton из официальной библиотеки дизайна

Перемещение изображения по круговой траектории в android

У меня есть изображение, я хотел переместить его в круговом пути onClick() событие кнопки без анимации,

Я не знаю, как это сделать .. Любая помощь?


Это мой основной класс

 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"

Я думаю, у вас есть два варианта: либо вы создаете пользовательскую анимацию, либо создаете свой ImageView, а затем используете поверхность, чтобы рисовать ее по пути самостоятельно.

Первый вариант намного проще, и, вероятно, даст лучшие результаты, учитывая, что в классе Animation время обрабатывается для вас с помощью Interpolators (Линейное время, начало работы, нормальный конец и т. Д.). Я настоятельно рекомендую вам написать пользовательскую анимацию, поскольку я не понимаю, почему вы не хотели бы использовать класс 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); } }); } } 

Класс анимации:

 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> 

Вероятно, вам нужно настроить его здесь и там, чтобы получить то, что вы хотите точно, но это может быть основой для этого.