#android #transparency #transition #alpha
#Android #прозрачность #переход #альфа
Вопрос:
У меня есть произвольное представление, которое я хочу скрыть поверх другого представления. На уровне api 11 я вижу, что есть setAlpha, но я застрял на поддержке уровня api 7. Я не сталкивался с простым способом сделать это. Как я могу установить альфа-значение для всего вида, не вмешиваясь в каждый отдельный компонент?
Ответ №1:
Вы должны быть в состоянии достичь разумного эффекта, используя AlphaAnimation на уровне API 7.
View v = findViewById(R.id.view2);
AlphaAnimation aa = new AlphaAnimation(0f,1f);
aa.setDuration(5000);
v.startAnimation(aa);
Комментарии:
1. Ах, черт… Я не часто использую анимацию. Это определенно правильный путь. Я смиренно добавляю свой голос «за».
2. @Maximus @slund проверьте это! Я понял, как сделать альфа-версию в целом.
3. Чтобы добавить к этому: используя потрясающую библиотеку NineOldAndroids, она также работает в двух строках кода.
Ответ №2:
Использование AlphaAnimation было бы отличным решением для большинства переходов и, безусловно, сработало бы для меня, если бы я не смог найти способ сделать именно то, что я пытался сделать, что включает постепенное переход от одного вида к другому в зависимости от угла наклона устройства. К счастью, у меня есть! Вот стратегия, которую я выбрал: я заключил представление в пользовательский подкласс FrameLayout и реализовал onDraw. Там я записал дочерний вид в виде растрового изображения, а затем перерисовал растровое изображение с предполагаемой альфой. Вот некоторый код. Я отредактирую, когда буду очищен, это просто доказательство концепции, но работает как шарм:
public class AlphaView extends FrameLayout {
private int alpha = 255;
public AlphaView(Context context) {
super(context);
setWillNotDraw(false);
}
public AlphaView(Context context, AttributeSet attrs) {
super(context, attrs);
setWillNotDraw(false);
}
public AlphaView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setWillNotDraw(false);
}
public void setCustomAlpha(int alpha) {
if (this.alpha != alpha) {
this.alpha = alpha;
invalidate();
}
}
public int getCustomAlpha() {
return alpha;
}
@Override
protected void onDraw(Canvas canvas) {
for(int index = 0; index < getChildCount(); index ) {
View child = getChildAt(index);
child.setVisibility(View.INVISIBLE);
child.setDrawingCacheEnabled(true);
Bitmap bitmap = child.getDrawingCache(true);
bitmap = Bitmap.createBitmap(bitmap);
child.setDrawingCacheEnabled(false);
Paint paint = new Paint();
paint.setAlpha(alpha);
canvas.drawBitmap(bitmap, 0, 0, paint);
}
}
}
Комментарии:
1. Ничего, что я заметил. Ваши результаты могут отличаться.
Ответ №3:
Это будет зависеть от типа представления.
Для TextView в xml у вас могут быть следующие атрибуты:
android:background="#00000000"
android:textColor="#77FFFFFF"
Первые два числа — это альфа-значения от 00 до FF (в шестнадцатеричном формате).
Фон был бы полностью прозрачным, в то время как текст был бы белым и частично прозрачным. Я не тестировал это, но это должно сработать.
Если у вас есть фон, представляющий собой изображение, то проще всего предварительно создать изображение в формате png с прозрачностью.
Комментарии:
1. У меня есть несколько представлений разных видов (некоторые нарисованные на заказ), которые все находятся вместе в одном RelativeLayout. Я хотел бы иметь возможность устанавливать альфа-значение для RelativeLayout и не связываться со всеми многочисленными дочерними элементами.
2. Я не верю, что это возможно с уровнем API 7… но если кто-то еще знает лучше, им придется прийти и поделиться решением…
3. Без сомнения, благодаря ответу Слунда я понимаю, что вылетело у меня из головы.
4. К сожалению, в Android… «Все возможно» на самом деле не соответствует действительности.