Как предотвратить сжатие элемента внутри макета во время масштабной анимации?

Я попытаюсь нарисовать, как

int array[10][6];

и

int **array2 = malloc(10 * sizeof *array2);
for (int i = 0; i < 10; ++i)
    array2[i] = malloc(6 * sizeof **array2);

выглядят в памяти и как они отличаются (и что они не могут

array выглядит так:

 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| | | | | | | | | | | | | ..............| | | (10*6 elements of type int)
 - - - - - - - - - - - - - - - - - - - - - -
< first row >< second row> ...

array2 выглядит так:

 _ _ _ _ _ _ _ _ _ _ 
| | | | | | | | | | | (10 elements of type int *)
 - - - - - - - - - - 
 | |     ....      |     _ _ _ _ _ _
 | |                \-->| | | | | | | (6 elements of type int)
 | |                     - - - - - -
 | |
 | |      _ _ _ _ _ _
 |  \ -->| | | | | | | (6 elements of type int)
 |        - - - - - -
 |
 |
 |      _ _ _ _ _ _
  \ -->| | | | | | | (6 elements of type int)
        - - - - - -

Когда вы говорите array[x][y], он переводится в *(((int *)array)+x*6+y)

. Хотя, когда вы говорите array2[x][y], он переводится в *(*(array2+x)+y)

. То есть статический 2d-массив является фактически массивом 1d с строками, помещенными в одну строку. Индекс рассчитывается по формуле row * number_of_columns_in_one_row + column.

Динамический массив 2d, однако является всего лишь 1d массивом указателей. Затем каждый указатель динамически выделяется для указания на другой 1-й массив. По правде говоря, этот указатель может быть любым. Может быть NULL или указывать на одну переменную или указывать на другой массив. И каждый из этих указателей устанавливается индивидуально, поэтому они могут иметь разные натуры.

Если вам нужно передать указатель array где-то, вы не можете направить его на int ** (представьте, что бы int значения ячеек array интерпретируются как указатели и разыменованные -> Bam! Ошибка сегментации!). Однако вы можете думать о array как о 1d массиве int [6] s; это 1-й массив элементов с типом int [6]. Чтобы записать это, вы говорите

int (*p)[6] = array;
0
задан Fantômas 5 March 2019 в 19:15
поделиться

1 ответ

Похоже, вы не хотите масштабировать анимацию, вам нужна анимация изменения размера. Масштабная анимация будет действовать так, как будто вы изменяете размер изображения. Анимация изменения размера должна просто влиять на параметры макета представления, не изменяя размер содержимого (только расположение).

Вы можете сделать это в XML с помощью аниматора свойств: https://developer.android.com/guide/topics/resources/animation-resource#Property

. пример анимации изменения размера в коде: https://stackoverflow.com/a/8162779/342745

0
ответ дан John Leehey 5 March 2019 в 19:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: