2011-09-26 2 views
15

Можно ли замаскировать виды? Например, если у меня есть проект, который требует, чтобы вид списка был видимым в овальной форме. Есть ли способ создать маску для представления? Это называется чем-то еще? Поскольку все ссылки, которые я нахожу для маскирования в документах android, говорят о маскировке объекта canvas или drawable. Но я не думаю, что создание привлекательного интерактивного объекта, такого как List View, будет хорошим подходом. Разве это просто ограничение?Можно ли замаскировать вид в андроиде?

ответ

30

Да, это - вы должны переопределить метод рисования вашей точки зрения - то есть:

...... 
final Path path = new Path(); 
path.addRoundRect(new RectF(0,0,getWidth(),getHeight()),10,10,Direction.CW); 
...... 
@Override 
protected void dispatchDraw(Canvas canvas){ 
    canvas.clipPath(path); 
    super.dispatchDraw(canvas); 
} 

это привлечет Ваше мнение только в границах, установленных пути.

+1

Вы также можете создавать любые «маски» эффект, который вы хотите, и просто положить его в свой собственный взгляд и положить его наверх/перед видом на вопрос , Если вам нужен этот эффект только для одного конкретного вида, это избавит вас от необходимости создавать собственные представления и редактировать методы рисования. – FoamyGuy

+0

Это было бы неправильно, Тим. Вы замедляете свое приложение, создавая совершенно ненужную иерархию представлений на мобильной платформе, где производительность имеет решающее значение. – asenovm

+0

Я согласен, что это приведет к ухудшению производительности. Я утверждаю, что если он применяет его к 1 виду внутри 1 активности, разница в производительности будет незаметной для человеческого глаза на устройствах, которые там есть. И что делать это с отдельными представлениями может показаться менее сложным для некоторых людей, чем попытка создать собственное представление, чтобы они могли переопределить методы рисования. Я знаю, что делать такие вещи становится тривиальным, когда вы получили несколько под вашим поясом. Но если вы никогда этого не делали раньше, мне кажется, что это может быть немного сложнее. – FoamyGuy

10

Да, вы можете даже маскировать полные макеты. Shameless selfplug

<com.christophesmet.android.views.maskableframelayout.MaskableFrameLayout 
android:id="@+id/frm_mask_animated" 
android:layout_width="100dp" 
app:porterduffxfermode="DST_IN" 
app:mask="@drawable/animation_mask" 
android:layout_height="100dp"> 

<ImageView android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:scaleType="centerCrop" 
      android:src="@drawable/unicorn"/> 

Вы можете найти его here

Смежные вопросы