Nano Hash - криптовалюты, майнинг, программирование

Анимация масштабирования в пользовательском представлении ведет себя неправильно, если она не находится в центре экрана.

У меня следующая проблема: я создал пользовательский вид на Android. Я хочу, чтобы представление пульсировало с помощью масштабной анимации (pivotX="50%" и pivotY="50%"). Если представление размещено в середине экрана, масштабирование работает нормально. Если представление размещено в левой части экрана, похоже, что значение pivotX будет равно «75%». Если представление размещено в правой части экрана, похоже, что значение pivotX будет равно «25%».

Вот код моего представления:

public class TestView extends View
{
  private Paint _paint = new Paint();

  private int _x, _y;

  public TestView( Context context, int x, int y )
  {
    super( context );

    _x = x;
    _y = y;

    _paint.setAntiAlias( true );
    _paint.setColor( Color.BLUE );
    _paint.setStyle( Style.FILL );
  }

  @Override
  protected void onDraw( Canvas canvas )
  {
    super.onDraw( canvas );
    canvas.drawCircle( _x, _y, 100 , _paint );
  }
}

Вот код файла анимации pulse.xml:

<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="100"
android:fromXScale="1"
android:fromYScale="1"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="3"
android:repeatMode="reverse"
android:toXScale="1.7"
android:toYScale="1.7" >
</scale>

Код класса фрагмента:

ViewGroup mainLayout = (ViewGroup) getView().findViewById( R.id.my_layout );    

float y = screenHeigth / 2;

float x1 = screenWidth*3/4; // right hand side of the screen
dest1 = new TestView( getActivity(), x1, y );
mainLayout.addView( dest1 );

float x2 = screenWidth / 2; // in the middle of the screen
dest2 = new TestView( getActivity(), x2, y );
mainLayout.addView( dest2 );

float x3 = screenWidth / 4; // left hand side of the screen
dest3 = new TestView( getActivity(), x3, y );
mainLayout.addView( dest3 );

ScaleAnimation pulse = (ScaleAnimation) AnimationUtils.loadAnimation( getActivity(), R.anim.pulse );

dest1.startAnimation( pulse );
dest2.startAnimation( pulse );
dest3.startAnimation( pulse );

Что я делаю неправильно? Возможно, мне нужно что-то сделать в моем классе TestView?


  • для чего нужны параметры x и y в TestView ctor? 11.09.2014
  • Это для рисования круга на определенной позиции. --› canvas.drawCircle( _x, _y, 100, _paint); Координаты круга 11.09.2014
  • а что такое mainLayout? 11.09.2014
  • В моем XML-файле макета у меня есть макет фрейма с этим идентификатором: ‹FrameLayout android:id=@+id/my_layout android:layout_width=match_parent android:layout_height=match_parent› 11.09.2014
  • поэтому все ваши TestViews размещаются в одном и том же положении и одинакового размера. 11.09.2014
  • Нет. Только размер тот же, а позиции разные. Взгляните на мой класс фрагментов. Там вы можете увидеть, что значение x отличается. TestView 1 (dest1) расположен в правой части экрана. TestView 2 (dest2) размещается посередине, а TestView 3 — в левой части экрана. 11.09.2014
  • используйте средство просмотра иерархии, чтобы увидеть, что размеры и позиции одинаковы 11.09.2014
  • Я реорганизовал код выше (класс фрагмента). Возможно, теперь легче понять мой код. 11.09.2014
  • все ваши представления добавляются в FrameLayout с параметрами макета по умолчанию, поэтому все они будут иметь одинаковую позицию, см. документы FrameLayout. 11.09.2014
  • Я не очень понимаю. Когда я смотрю на экран, все три круга нарисованы в правильном положении. Так что, на мой взгляд, у них разные позиции. Теперь я мог запустить программу просмотра иерархии. Можете ли вы сказать мне, где я могу проверить это в иерархическом просмотре? 11.09.2014
  • посмотрите рамки просмотра в иерархическом просмотрщике, они показаны красным цветом в правом нижнем окне 11.09.2014
  • Спасибо пскинк. С вашей помощью я смог найти решение (см. ниже). 11.09.2014

Ответы:


1

Теперь у меня есть это :-) Спасибо, pskink, что наставили меня на правильный путь. Проблема заключалась в том, что мой TestView заполнил все родительское представление. Поэтому центр моего представления был центром родительского представления, а не центром нарисованного круга.

Вот решение:

public class TestView extends View
{
  private Paint _paint = new Paint();

  private int _xRelativeToView, _yRelativeToView, _w, _radius;

  public TestView( Context context, int xOfView, int yOfView )
  {
    super( context );

    _w = 100;
    _radius = _w / 2;

    // set the coordinates of the circle within this view
    _xRelativeToView = _radius;
    _yRelativeToView = _radius;

    // set the position of the view on the screen:
    LayoutParams mparam = new LayoutParams( _w, _w ); // the view is as big as the circle
    mparam.addRule( RelativeLayout.ALIGN_PARENT_LEFT );
    mparam.setMargins( xOfView - _radius, yOfView - _radius, 0, 0 );
    setLayoutParams( mparam );

    // initialize paint
    _paint.setAntiAlias( true );
    _paint.setColor( Color.BLUE );
    _paint.setStyle( Style.FILL );
  }

  @Override
  protected void onDraw( Canvas canvas )
  {
    super.onDraw( canvas );
    canvas.drawCircle( _xRelativeToView, _yRelativeToView, _radius, _paint );
  }
}
11.09.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..