Чтобы использовать решение @ Matthias Robbers напрямую из XML, вы можете сделать следующее: создать 2 файла:
1- pulse.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="1"
android:fromYScale="1"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="0.8"
android:toYScale="0.8"
android:duration="500"
android:repeatCount="infinite"
android:repeatMode="reverse"/>
</set>
2- pulse_layout_animation.xml
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/pulse">
</layoutAnimation>
, затем в своем XML-файле макета просто добавьте эту анимацию в любой необходимый вам просмотр, например:
<ImageView
android:layout_width="55dp"
android:layout_height="55dp"
android:src="@drawable/heart"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layoutAnimation="@anim/pulse_layout_animation" />
Если вы не хотите использовать заклинание,
Convert.ToInt32()
может помочь.
Прямое приведение (через (int) enumValue
) невозможно. Обратите внимание, что это также было бы «опасно», поскольку перечисление может иметь разные базовые типы ( int
, long
, byte
...).
Более формально: System.Enum
не имеет прямого отношения наследования с Int32
(хотя оба имеют ValueType
s), поэтому явное приведение не может быть правильным внутри система типов
Я заставил его работать, приведя его к объекту, а затем к int:
public static class EnumExtensions
{
public static int ToInt(this Enum enumValue)
{
return (int)((object)enumValue);
}
}
Это уродливый и, вероятно, не лучший способ. Я буду продолжать возиться с этим, чтобы посмотреть, смогу ли я придумать что-нибудь получше ....
РЕДАКТИРОВАТЬ: Я как раз собирался опубликовать, что Convert.ToInt32 (enumValue) также работает, и заметил, что Мартин Стеттнер победил меня до это.
public static class EnumExtensions
{
public static int ToInt(this Enum enumValue)
{
return Convert.ToInt32(enumValue);
}
}
Тест:
int x = DayOfWeek.Friday.ToInt();
Console.WriteLine(x); // results in 5 which is int value of Friday
РЕДАКТИРОВАТЬ 2: В комментариях кто-то сказал, что это работает только в C # 3.0. Я только что протестировал это в VS2005 вот так, и это сработало:
public static class Helpers
{
public static int ToInt(Enum enumValue)
{
return Convert.ToInt32(enumValue);
}
}
static void Main(string[] args)
{
Console.WriteLine(Helpers.ToInt(DayOfWeek.Friday));
}
Приведение из System.Enum
в int
у меня отлично работает (это также на MSDN ). Возможно, это ошибка Resharper.
Почему вам нужно изобретать велосипед с помощью вспомогательного метода? Совершенно законно привести значение enum
к его базовому типу.
Это менее типично и, на мой взгляд, более читабельно, чтобы использовать ...
int x = (int)DayOfWeek.Tuesday;
... вместо чего-то вроде .. .
int y = Converter.ToInteger(DayOfWeek.Tuesday);
// or
int z = DayOfWeek.Tuesday.ToInteger();
Не забывайте, что у самого типа Enum есть набор статических вспомогательных функций. Если все, что вы хотите сделать, это преобразовать экземпляр перечисления в соответствующий ему целочисленный тип, то приведение, вероятно, является наиболее эффективным способом.
Я думаю, что ReSharper жалуется, потому что Enum не является перечислением какого-либо конкретного типа, а перечисления сами являются производными от типа скалярного значения, а не от Enum. Если вам нужно универсальное адаптируемое приведение, я бы сказал, что это может вам подойти (обратите внимание, что сам тип перечисления также включен в общий:
public static EnumHelpers
{
public static T Convert<T, E>(E enumValue)
{
return (T)enumValue;
}
}
Это может быть использовано следующим образом:
public enum StopLight: int
{
Red = 1,
Yellow = 2,
Green = 3
}
// ...
int myStoplightColor = EnumHelpers.Convert<int, StopLight>(StopLight.Red);
Я не могу скажем наверняка из головы, но приведенный выше код может даже поддерживаться выводом типа C #, позволяя следующее:
int myStoplightColor = EnumHelpers.Convert<int>(StopLight.Red);