Что случилось с setScaleX / setScaleY?

#android #android-view #android-relativelayout

#Android #android-просмотр #android-relativelayout

Вопрос:

Пытаясь найти решение для нужного мне макета, я наткнулся на методы setScaleX / setScaleY, которые являются членами класса View.

Просмотреть документ класса

Теперь, глядя на методы RelativeLayout и фильтрации по API уровня 8, поскольку я разрабатываю приложение для > = 2.2, указанные методы исчезают. Но при просмотре «Унаследованных атрибутов XML от класса android.view.View» свойства android: scaleX / android: scaleY все еще доступны. К сожалению, попытка использовать эти свойства не работает, и Eclipse сообщает: «ошибка: не найден идентификатор ресурса для атрибута ‘scaleX’ в пакете ‘android'»

RelativeLayout class doc

Похоже, документация противоречива, и scaleX / scaleY недоступны до версии 3.0, или я что-то упускаю?

Ответ №1:

Я столкнулся с аналогичной проблемой, когда попытался задать представление с начальным значением scaleX перед воспроизведением каких-либо анимаций, однако view.setScaleX() с 11-го уровня API соответствует @Dr .J .

Если вы хотите использовать Honeycomb Animation API на более ранних уровнях API, попробуйте использовать NineOldAndroids на http://nineoldandroids.com . На основе этой библиотеки с открытым исходным кодом существует обходной путь для предоставления виду начального scaleX.

     ObjectAnimator.ofFloat(getMyButton(), "scaleX", 1f, 0f).setDuration(1).start();
  

Комментарии:

1. Блестящая идея, я бы дал вам еще 5 1, если бы мог. Спасибо.

Ответ №2:

Хорошо, похоже, что это неверное представление в документах, как это объясняется здесь scaleX / scaleY — это свойства, добавленные в класс View с помощью Honeycomb и поэтому, к сожалению, недоступные в Froyo.

Комментарии:

1. scaleX и scaleY по этой ссылке не обсуждаются.

Ответ №3:

нет, документы верны:

общедоступный недействительный setScaleX (float scaleX) Начиная с: Уровень API 11

Froyo — это API 8-го уровня.

Комментарии:

1. Да, методы будут скрыты при выборе любого уровня API ниже 11. Но унаследованные атрибуты XML из класса android.view. Просмотр не будет, так что атрибуты все еще там, как вы можете видеть в документе RelativeLayout, кстати. Froyo 8-го уровня

2. да, но он ищет ресурс scaleX, которым в данном случае будет дескриптор setScaleX, который недоступен (как установлено во время целевой сборки). Я полагаю, ваша цель сборки — 2.2? если это 3.0 и выдает вам эту ошибку, то это ошибка.

3. Я думаю, что мы забываем друг о друге 😉 Моя цель сборки — 2.2, и я не могу использовать ни методы, ни атрибуты xml для масштабирования. Меня смутила документация, поскольку в ней говорится, что методы недоступны, но атрибуты xml доступны. Это то, что я хотел знать. Итак, я бы сказал, что «ошибка» есть в документации…

4. документация немного неубедительна в определенных местах, в ней говорится android:scaleX Since: API Level о том, что это за API: X

Ответ №4:

NineOldAndroid устарел согласно ссылке на github NineOldAndroid

Используйте Android Support library вместо NineOldAndroid

итак, вы должны использовать ViewCompat вместо ViewHelper

просто измените:

 view.setScaleX(2);
  

или

 ViewHelper.setScaleX(view,2);
  

Для:

 ViewCompat.setScaleX(view,2);
  

надеюсь, это поможет

Ответ №5:

Используйте com.nineoldandroids.view.ViewHelper для более старых API:

 ViewHelper.setScaleY(myButton, 0.01f);
  

Ответ №6:

Для всех, кому интересно: я увеличиваю масштаб только до центра холста, и этот код работает для меня:

 public float[] getAbsolutePosition(float Ax, float Ay) {

    float fromAxToBxInCanvasSpace = (screenwidth/2 - Ax) / zoomLevel;
    float fromBxToCanvasEdge = screenwidth/2;
    float x = screenwidth - fromAxToBxInCanvasSpace - fromBxToCanvasEdge;

    float fromAyToByInCanvasSpace = (screenheight/2 - Ay) / zoomLevel;
    float fromByToCanvasEdge = screenheight/2;
    float y = screenheight - fromAyToByInCanvasSpace - fromByToCanvasEdge;

    return new float[] { x, y };
}